我正在从事股票和交易市场。我有一种情况:我需要从日志中取一个字符串并将其转换为" Message"类型对象。根据{{3}},我尝试使用" MessageUtils"的所有三种方法。 JAVA中的课程。但我的String被剥离到具有唯一标记的Message类类型对象。但是因为我的字符串是" MarketDataIncrementalRefresh" type我希望每个标记都出现在Message中。
例如:我将以下字符串提供给" 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 |
正如您所看到的,String中只存在唯一标记。但是我想要每个标签,无论它在提供的字符串中存在多少次。
请允许任何人帮助我在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());
答案 0 :(得分:2)
另一个帖子说:
MessageUtils.parse(MessageFactory messageFactory, DataDictionary dataDictionary, java.lang.String messageString)
你的代码说:
Message msg = MessageUtils.parse(new DefaultMessageFactory(), null, str);
因此,您需要修复数据字典并将其传递给parse方法,而不是传递'null'
答案 1 :(得分:1)
我认为问题如下。有一个以标记286(NoMDEntries)开头的重复组。重复组中的字段顺序应该是严格的,即与重复组的定义相同的顺序。请参阅Market Data - Snapshot/Full Refresh或QuickFIX / J(FIX42.xml)提供的数据字典。
268标签之后应该是269然后是270.我在你的消息字符串中看到:|268=24|269=0|290=1|270=4290|
这是不正确的标签顺序。这可能是消息被MessageUtils.parse
截断的原因。
作为测试,您可以尝试手动更正字符串中的顺序,并尝试解析它以查看是否提供了正确的消息。