使用QuikFix解析FIX消息时找不到组

问题描述

我们正在从源数据库接收FIX消息,并且必须解析并存储在我们的系统中。这些来自ICE exchange(WebICE),我们正在使用QuickFix和FIX42.xml数据字典来解析消息。

我们能够成功解析执行报告和UDS(用户定义的策略),但在尝试解析重复组时却无法解析安全定义。

下面是带有消息的示例代码

val testMessage = "8=FIX.4.2^A9=97129^A35=d^A49=ICE^A34=21^A52=20200904-11:00:16.742^A56=8428^A57=123abc^A322=1^A323=4^A320=XX_Security_Request 0^A9064=0^A393=19275^A82=193^A67=1^A711=3^A311=2322323^A309=MSS SDU0320.U0320^A308=IFED^A305=8^A9013=0.001^A9133=2.500^A9134=2.500^A9040=0.001^A9041=2500^A307=XYXYXYXYXYX^A763=0^A1039=C^A9014=2500.0^A9017=57500.0^A326=17^A998=TEST TEST^A318=USD^A9083=3^A9084=0^A9085=daily^A9061=467^A9062=TEST TEST Futures^A9063=Product Description^A9032=2.500^A9030=1^A9132=2.500^A9091=Test Malin^A9092=1^A9093=0^A9095=Energy^A9215=0^A9217=0^A9205=0^A436=1.0^A9216=0^A463=FXXXXX^A542=20200904^A9100=USD^A9101=USD / TEST TEST^A9022=1^A9024=1.0^A9049=1^A9203=1^A9025=Y^A916=20200903^A917=20200903^A9201=69360^A9200=4^A9202=03 Sep 20^A9300=656^A9301=TEST Gas Transmission - Malin^A9302=PGT-Malin^A9303=MSS^A9034=1^A9070=16^A9071=0^A9072=K^A9073=25.0^A9071=1^A9072=K^A9073=1.0^A9071=2^A9072=K^A9073=1.0^A9071=3^A9072=K^A9073=1.0^A9071=0^A9072=V^A9073=1.0^A9071=1^A9072=V^A9073=1.0^A9071=2^A9072=V^A9073=1.0^A9071=3^A9072=V^A9073=1.0^A9071=0^A9072=S^A9073=1.0^A9071=1^A9072=S^A9073=1.0^A9071=2^A9072=S^A9073=1.0^A9071=3^A9072=S^A9073=1.0^A9071=0^A9072=E^A9073=1.0^A9071=1^A9072=E^A9073=1.0^A9071=2^A9072=E^A9073=1.0^A9071=3^A9072=E^A9073=1.0^A311=624232323233062^A309=PES SDU0320.U0320^A308=IFED^A305=8^A9013=0.001^A9133=2.500^A9134=2.500^A9040=0.001^A9041=2500^A307=Test Desc Futures - Permian (EP) - 03 Sep 20^A763=0^A1039=C^A9014=2500.0^A9017=57500.0^A326=17^A998=TEST TEST^A318=USD^A9083=3^A9084=0^A9085=daily^A9061=476^A9062=TEST TEST Futures^A9063=Product Description ^A9032=2.500^A9030=1^A9132=2.500^A9091=Test EPPermian^A9092=1^A9093=0^A9095=Energy^A9215=0^A9217=0^A9205=0^A436=1.0^A9216=0^A463=FXXXXX^A542=20200904^A9100=USD^A9101=USD / TEST TEST^A9022=1^A9024=1.0^A9049=1^A9203=1^A9025=Y^A916=20200903^A917=20200903^A9201=69360^A9200=4^A9202=03 Sep 20^A9300=665^A9301=El Paso - Permian Basin^A9302=Permian (EP)^A9303=PES^A9034=1^A9070=16^A9071=0^A9072=K^A9073=25.0^A9071=1^A9072=K^A9073=1.0^A9071=2^A9072=K^A9073=1.0^A9071=3^A9072=K^A9073=1.0^A9071=0^A9072=V^A9073=1.0^A9071=1^A9072=V^A9073=1.0^A9071=2^A9072=V^A9073=1.0^A9071=3^A9072=V^A9073=1.0^A9071=0^A9072=S^A9073=1.0^A9071=1^A9072=S^A9073=1.0^A9071=2^A9072=S^A9073=1.0^A9071=3^A9072=S^A9073=1.0^A9071=0^A9072=E^A9073=1.0^A9071=1^A9072=E^A9073=1.0^A9071=2^A9072=E^A9073=1.0^A9071=3^A9072=E^A9073=1.0^A311=23232323^A309=SCS SDU0320.U0320^A308=IFED^A305=8^A9013=0.001^A9133=2.500^A9134=2.500^A9040=0.001^A9041=2500^A307=Test Desc Futures - Socal-TEST - 03 Sep 20^A763=0^A1039=C^A9014=2500.0^A9017=57500.0^A326=17^A998=TEST TEST^A318=USD^A9083=3^A9084=0^A9085=daily^A9061=1462^A9062=TEST TEST Futures^A9063=Product Description ^A9032=2.500^A9030=1^A9132=2.500^A9091=Test Socal Cty^A9092=1^A9093=0^A9095=Energy^A9215=0^A9217=0^A9205=0^A436=1.0^A9216=0^A463=FXXXXX^A542=20200904^A9100=USD^A9101=USD / TEST TEST^A9022=1^A9024=1.0^A9049=1^A9203=1^A9025=Y^A916=20200903^A917=20200903^A9201=69360^A9200=4^A9202=03 Sep 20^A9300=1277^A9301=Socal - TEST^A9302=Socal-TEST^A9303=SCS^A9034=1^A9070=16^A9071=0^A9072=K^A9073=25.0^A9071=1^A9072=K^A9073=1.0^A9071=2^A9072=K^A9073=1.0^A9071=3^A9072=K^A9073=1.0^A9071=0^A9072=V^A9073=1.0^A9071=1^A9072=V^A9073=1.0^A9071=2^A9072=V^A9073=1.0^A9071=3^A9072=V^A9073=1.0^A9071=0^A9072=S^A9073=1.0^A9071=1^A9072=S^A9073=1.0^A9071=2^A9072=S^A9073=1.0^A9071=3^A9072=S^A9073=1.0^A9071=0^A9072=E^A9073=1.0^A9071=1^A9072=E^A9073=1.0^A9071=2^A9072=E^A9073=1.0^A9071=3^A9072=E^A9073=1.0^A10=210^A"

  val dd: DataDictionary = new DataDictionary("FIX42.xml")
  val message: Message = new quickfix.Message(testMessage,dd)
  val noOfunderlyings= message.getInt(711)
  println("Underlyings "+noOfunderlyings)

  for(i <- 1 to noOfunderlyings ) {
    val FixGroup: Group = message.getGroup(i,711)
    println("UnderlyingSecurityID : " + FixGroup.getString(309))
  }

在以下行失败: val FixGroup:组= message.getGroup(i,711)

出现以下错误消息

Exception in thread "main" quickfix.FieldNotFound: 711,index=1
    at quickfix.FieldMap.getGroup(FieldMap.java:644)

我们已经检查了数据字典,并且其中存在重复的组。 FIX客户端引擎的源端也使用了相同的数据字典来接收来自交换的消息。

数据字典:Data Dictionary

目前,这已成为我们的瓶颈。向所有其他SO用户寻求帮助。

DD段 9064标签-> ExchangeSilo(Int)

711标签-> NoUnderlyings(NumInGroup)

 <message name='SecurityDeFinition' msgtype='d' msgcat='app'>
            <field name='SecurityResponseID' required='Y' />
            <field name='SecurityResponseType' required='N' />
            <field name='SecurityReqID' required='Y' />
            <field name='SecurityID' required='N' />
            <field name='ExchangeSilo'  required='N' />
            <field name='TotalNumSecurities' required='Y' />
            <field name='Symbol' required='N' />
            <field name='norpts' required='N' />
            <field name='ListSeqNo' required='N' />
            <!-- USEFUL FOR THE NEW Security DEFinitioN RESPONSE-->
            <group name='NoUnderlyings' required='N'>
                <field name='UnderlyingSymbol' required='N' />
                <field name='UnderlyingSecurityID' required='N' />
                <field name='UnderlyingSecurityExchange' required='N' />
                <field name='UnderlyingIDSource' required='N' />
                <field name='IncrementPrice' required='N' />
                <field name='ScreenTickValue' required='N' />

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...