Scala 快速修复/J未读取修复消息中的所有重复组

Scala 快速修复/J未读取修复消息中的所有重复组,scala,quickfix,quickfixj,Scala,Quickfix,Quickfixj,我们正在接收来自WebICE exchange的文本文件中的修复消息,我们的应用程序正在使用QuickFixJ逐行读取和解析它们。我们注意到,在某些消息中,重复组字段未被解析,并且在使用数据字典进行验证时出错 quickfix.FieldException: Out of order repeating group members, field=326 例如,在示例文件中,前两行解析成功,但第三行解析失败,并显示上述错误消息 经过调查,我发现,在前两行中,标签326位于标签9133之后,但在第

我们正在接收来自WebICE exchange的文本文件中的修复消息,我们的应用程序正在使用QuickFixJ逐行读取和解析它们。我们注意到,在某些消息中,重复组字段未被解析,并且在使用数据字典进行验证时出错

quickfix.FieldException: Out of order repeating group members, field=326
例如,在示例文件中,前两行解析成功,但第三行解析失败,并显示上述错误消息

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

这种情况只发生在少数消息中,因为大多数其他修复消息都得到了很好的验证和解析。这是从使用QuickFix/N的现有C#应用程序迁移到使用QuickFix/J的scala应用程序的迁移项目的一部分。它在源端(使用QuickFix/N)运行良好。QuickFIx/J库和QuickFIx/N库在处理组字段方面有什么不同吗

为了帮助重新创建该问题,我共享了包含3条修复消息的数据文件,如上所述

数据文件: 数据字典:

下面是测试代码片段

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))
    }
}
val-dd:DataDictionary=newdatadictionary(“ICE-FIX42.xml”)
val mfile=新文件(“data test.csv”)

对于(行您应该使用
setCheckUnorderedGroupFields(false)
禁用重复组中的排序验证。但是,这只是一种解决方法

我建议与您的交易对手联系,因为特别是在重复组中,字段顺序需要遵循消息定义,即数据字典中的顺序

重复组内的字段序列

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


您是否检查了邮件中重复组中的字段是否与字典中的组中的字段顺序相同?否则,您将面临看到的错误。说明:字段顺序在根邮件中不相关,但在重复组中却相关。我检查了100条重复组中的第一条记录,并且顺序看起来类似lar与DD以及成功解析的消息。在所有100个订单中,是否只有少数几条消息是有序的?我需要检查所有订单吗?是的,我认为您还需要检查其他记录。也许您应该打印出循环中有问题消息的序列号,然后在您创建的文件中检查它们解析。在某种程度上,与解析的其他消息肯定有所不同。如果你说它只获取22个重复组,而不是100个,那么我敢说第23个组可能是有问题的组。而且,刚刚看到你的源代码片段,你需要执行
setCheckUnorderedGroupFields(false)
禁用订单验证。