我有一个FIX消息作为字符串,并且我正在使用QuickFix4J从此消息创建一个消息对象,以便可以将其发送给另一方。
我正在使用的DataDictionary由另一方提供给我。
但是当我用DD解决它并创建消息时,许多字段(尤其是重复的字段)被截断了。基本上,当一组字段重复时,最终消息只有重复字段的一个实例。
这是我的原始消息:
8=FIXT.1.1|9=1288|35=X|34=1163|49=XX|52=20190410-10:27:43|56=XXXXXXXXXXXXXXXXXXXXX|131=XXXXXXXXXXXXXX_2019410_155743|146=1|55=[X/X]|48=58013XXX5|22=1|6360=XXXXXXXX XXXXXXXX|454=1|455=XX58013XXX54|456=4|20200=2|20201=1|20202=6|20203=99.06300000|20204=1111.00|20205=3|20206=XXX2|20201=2|20202=6|20203=0.14400000|20204=2222.00|20205=3|20206=XXX2|460=3|1227=XXXX|29703=XXXX XXXX|167=XXXX|541=20350410|225=20170410|223=0.03500000|106=XXXXXXXXX XXXX XXXXXX XXXX XXX XXXX XXXXX|107=XXX 3.500 3/1/27 X26|873=20170309|54=2|38=188000|64=20190412|15=XXX|126=20190410-10:32:43|60=20190410-10:27:43|663=1|699=9128286X1|761=1|29715=XX9128286X18|29716=4|29717=XXX|29718=0.02625000|29719=20290215|423=6|453=7|448=XXXXXXX1|447=X|452=11|802=1|523=XXXXXXX XXXXXX XX XXX|803=9|448=XXXX|447=X|452=13|448=XXX XXXXXXXXXX 5|447=X|452=13|448=XXXXXX33|447=X|452=17|802=1|523=0355|803=17|448=XXXX|447=X|452=17|448=XXXXXX XXXXXX XXXXXXXXXX (XXX) XXX|447=X|452=17|448=XXXXXXX|447=X|452=13|58=XXXXXX5 (XXXXXXXXXX, XXXXXXX XXXXXX XX XXX) XXXXXXXX XXX XX $100,000 XXX 3.500 03/01/27 X26, XXXXXXXXX XXX 2.625 02/29, XXX XX 2 XXXX XXXXX-XXXXXXX , XXXX XXXX.|5625=2|20117=10155743|5961=XXXXXX|5626=3|20012=1 3|5215=X|5627=XXXXXXXXX|5630=XXXXXXX, XXXX|20120=X2X-XXX-XXXX|21031=X|21032=X|20013=0.3|29724=60|22203=XXXX|29741=000X|29742=1000|10=144|
这是创建消息对象之后的消息:
8=FIXT.1.1|9=262|35=X|34=656|49=XX|52=20190410-10:27:45.566|56=XXXXXXXXXXXXXXXXXXXXX|131=XXXXXXXXXXXXXX_2019410_155743|146=1|55=[X/X]|48=58013XXX5|22=1|6360=XXXXXXXX XXXXXXXX|454=1|455=XX58013XXX54|456=4|20200=2|20201=2|20202=6|20203=99.06300000|20204=1111.00|20205=3|20206=XXX2|10=111|
这是我用来创建消息的代码:
rawMessage = new Message(newmessage, dataDictionary, false);
Session.sendToTarget(rawMessage, sessionID)
有没有一种方法可以按原样发送消息,而无需quickfix4j尝试解决它并因此截断字段。不幸的是,我无法共享DD。
答案 0 :(得分:1)
我看到两个问题:
第一个问题:您的方法是一个错误
rawMessage = new Message(newmessage, dataDictionary, false);
Session.sendToTarget(rawMessage, sessionID)
你不能那样做!序列号,时间戳等不再有效!
您是否正在创建幼稚的消息重播器? (为什么人们会继续尝试这样做?)这行不通! FIX消息流的状态是您不能盲目地重播。
如果要创建测试工具,则它必须比这更聪明。停止您正在做的事情,然后重新考虑您的方法。
第二个问题:您的DD可能有错误
被截断的重复组始终意味着存在DataDictionary问题。 DD与正在解析的消息不匹配。肯定会发生以下情况之一:
解析组时,引擎会在看到不期望的字段时立即结束该组。
我正在使用的DataDictionary由另一方提供给我。
不信任它!对方会因为自己的文档没有实际使用或内部版本比已发布的版本新而导致自己的文档出错。
开始根据他们给您的DD手动解析您的消息,我敢打赌您会发现错误。
答案 1 :(得分:0)
谢谢格兰特(Grant)的投入,最后我们发现错误是重复的组混乱了:
datadictionary.setCheckUnorderedGroupFields(false);
解决了。