Warm tip: This article is reproduced from serverfault.com, please click

scala-QuickFIX / J不会读取FIX消息中的所有重复组

(scala - QuickFIX/J not reading all the repeating groups in FIX message)

发布于 2020-11-27 14:04:06

我们正在以文本文件的形式从WebICE交换接收修复消息,而我们的应用程序正在使用QuickFixJ逐行读取和解析它们。我们注意到,在某些消息中,没有分析重复的组字段,并且在验证数据字典时出现错误。

quickfix.FieldException: Out of order repeating group members, field=326

例如,在示例文件data-test.csv中,前两行已成功解析,但第三行因上述错误消息而失败。

经调查,我发现在前两行中,标签326在标签9133之后,但在第三行中,标签326在此之前,因此验证失败。如果我按照第三个字典调整数据字典,则它会成功,但是第一个字典当然会失败。

这仅发生在很少的消息上,因为大多数其他修复消息都已得到验证和解析。这是从使用QuickFix / N的现有C#应用程序迁移到使用QuickFix / J的scala应用程序的项目的一部分。并且它在源端运行良好(使用QuickFIx / N)。在处理组字段方面,库QuickFIx / J和QuickFIx / N是否有任何区别?

为了帮助重现此问题,如上所述,我共享了具有3条修复消息的数据文件。

数据文件:data-test.csv 数据字典:ICE-FIX42.xml

这是测试代码片段

val dd: DataDictionary = new DataDictionary("ICE-FIX42.xml")
val mfile = new File("data-test.csv")
for (line <- Source.fromFile(mfile).getLines) {
    val message = new quickfix.Message(line,dd)
    dd.setCheckUnorderedGroupFields(true)
    dd.validate(message)
    val noOfunderlyings= message.getInt(711)
    println("Number of Underlyings "+noOfunderlyings)
    for(i <- 1 to noOfunderlyings ) {
      val FixGroup: Group = message.getGroup(i, 711)          
      println("UnderlyingSecurityID : " + FixGroup.getString(311))
    }
}

请求其他SO用户,如果你可以帮助我的话。

非常感谢

Questioner
PPPP
Viewed
0
Christoph John 2020-12-16 07:28:11

你应该用来setCheckUnorderedGroupFields(false)在重复组中禁用顺序验证。但是,这只是一种解决方法。

我建议你就此向你的对手询问,因为尤其是在重复组中,要求字段顺序遵循消息定义,即数据字典中的顺序。

FIX TagValue编码规范

重复组中的字段序列

...

必须按照消息定义中指定字段的顺序指定重复组中的字段。