如何在 Java 的 QUICKFIX 中将字符串转换为 MarketDataIncrementalRefresh?

How to convert string to MarketDataIncrementalRefresh in QUICKFIX in Java?

我在股票和交易市场工作。我有这样的情况:我需要从日志中取出一个字符串并将其转换为 "Message" 类型的对象。根据 this link,我尝试使用 JAVA 中 "MessageUtils" class 的所有三种方法。但是我的字符串被剥离为具有唯一标签的 Message class 类型对象。但由于我的字符串是 "MarketDataIncrementalRefresh" 类型,我希望每个标签都出现在消息中。

例如:我向 "MessageUtils.parse()" 方法提供以下字符串。

8=FIX.4.2|9=00795|35=W|49=TT_PRICE|56=SAP0094X|34=2392|52=20170623-04:41:33.375|55=CL|48=00A0HR00CLZ|10455=CLQ7|167=FUT|207=CME|15=USD|262=MDRQ-751|200=201708|18210=1|387=12292|268=24|269=0|290=1|270=4290|271=33|269=0|290=2|270=4289|271=34|269=0|290=3|270=4288|271=40|269=0|290=4|270=4287|271=38|269=0|290=5|270=4286|271=46|269=0|290=6|270=4285|271=53|269=0|290=7|270=4284|271=46|269=0|290=8|270=4283|271=66|269=0|290=9|270=4282|271=48|269=0|290=10|270=4281|271=64|269=1|290=1|270=4291|271=21|269=1|290=2|270=4292|271=40|269=1|290=3|270=4293|271=48|269=1|290=4|270=4294|271=83|269=1|290=5|270=4295|271=62|269=1|290=6|270=4296|271=46|269=1|290=7|270=4297|271=34|269=1|290=8|270=4298|271=55|269=1|290=9|270=4299|271=31|269=1|290=10|270=4300|271=128|269=2|270=4291|271=1|269=4|270=4280|269=7|270=4292|269=8|270=4277|10=044|

但我得到的是:

8=FIX.4.2|9=192|35=W|34=2|49=TT_PRICE|52=20170622-14:16:23.685|56=SAP0094X|15=USD|48=00A0HR00GCZ|55=GC|167=FUT|200=201708|207=CME|262=MDRQ-21|268=25|269=0|270=12510|271=24|290=1|387=121890|10455=GCQ7|18210=1|10=036|

如您所见,字符串中仅存在唯一标记。但我想要每个标签,无论它在提供的字符串中存在多少次。

JAVA 有谁能帮我做这件事吗?这将是非常可观的。

下面是我用于转换的代码:

         MessageUtils mu = new MessageUtils();
         Session session = Session.lookupSession(sessionID);
         Message msg = MessageUtils.parse(new DefaultMessageFactory(), null, str);
     //    Message msg = new Message(str, false); //This can also be used for converting
         System.out.println(msg.toString());

我认为问题如下。有一个以标记 286 (NoMDEntries) 开头的重复组。重复组中字段的顺序应该是严格的,即与重复组定义的顺序相同。请参阅 Market Data - Snapshot/Full Refresh 或 QuickFIX/J (FIX42.xml) 提供的数据字典。

268 标记后应依次为 269 和 270。我在您的消息字符串中看到:|268=24|269=0|290=1|270=4290| 标记的顺序不正确。这可能是消息被 MessageUtils.parse.

截断的原因

作为测试,您可以尝试手动更正字符串中的顺序并尝试对其进行解析以查看是否给出了正确的消息。

另一个帖子说:

MessageUtils.parse(MessageFactory messageFactory, DataDictionary dataDictionary, java.lang.String messageString)

你的代码说:

Message msg = MessageUtils.parse(new DefaultMessageFactory(), null, str);

所以你需要修复你的数据字典并将其传递给解析方法而不是传递'null'