Quickfix/J:如何让带组的未知消息类型返回INVALID_MSGTYPE错误
问题:带组的未知消息类型返回错误类型不符
我正在构建一个DropCopy网关,该网关不处理任何NewOrderSingle(NOS)消息。因此当客户端向该网关发送NewOrderSingle消息时,客户端应收到SessionRejectReason.INVALID_MSGTYPE错误。
操作步骤
- 从规格XML中移除
<message name='NewOrderSingle' msgcat='app' msgtype='D'>定义,同时从枚举中移除<value enum='D' description='NEWORDERSINGLE' />。 - 向网关发送一条包含组的NOS消息(格式如**...|453=3|448=abc|447=D|452=28|448=alloc|447=D|452=83|448=XYZ|447=D|452=4|...**)。
- 收到
58=Tag appears more than once, field=448错误。
错误原因分析
QuickFix会根据消息类型解析组,相关代码片段如下:
Message.java
private void parseBody(DataDictionary dd, boolean doValidation) throws InvalidMessage { StringField field = extractField(dd, this); while (field != null) { if (isTrailerField(field.getField())) { pushBack(field); return; } if (isHeaderField(field.getField())) { // An acceptance test requires the sequence number to // be available even if the related field is out of order setField(header, field); // Group case if (dd != null && dd.isGroup(DataDictionary.HEADER_ID, field.getField())) { parseGroup(DataDictionary.HEADER_ID, field, dd, dd, header, doValidation); } if (doValidation && dd != null && dd.isCheckFieldsOutOfOrder()) throw new FieldException(SessionRejectReason.TAG_SPECIFIED_OUT_OF_REQUIRED_ORDER, field.getTag()); } else { setField(this, field); // Group case if (dd != null && dd.isGroup(getMsgType(), field.getField())) { parseGroup(getMsgType(), field, dd, dd, this, doValidation); } } field = extractField(dd, this); } }
- 重点关注
dd.isGroup(getMsgType(), field.getField())这部分!
当消息类型不在规格中时,组不会被解析。因此解析消息中的第二个字段时,会触发SessionRejectReason.TAG_APPEARS_MORE_THAN_ONCE错误:
Message.java
private void setField(FieldMap fields, StringField field) { if (fields.isSetField(field)) { throw new FieldException(SessionRejectReason.TAG_APPEARS_MORE_THAN_ONCE, field.getTag()); } fields.setField(field); }
示例日志
< 8=FIXT.1.1|9=241|35=D|49=TESTCLI|56=EXCHANGE|34=2|52=20230619-13:57:14|11=1806576375|48=2823|22=4|38=50|44=9|40=2|59=0|54=2|1=MyAcc|70=alim|820=limit day|528=A|60=20230619-13:57:14|453=3|448=afk|447=D|452=28|448=allocaccount|447=D|452=83|448=ABC|447=D|452=4|10=161| > 8=FIXT.1.1|9=130|35=3|34=2|49=EXCHANGE|52=20230619-13:57:14.589|56=TESTCLI|57=CLIDC|45=2|58=Tag appears more than once, field=448|371=448|372=D|373=13|10=217|
QuickFix版本:2.3.1
综上,是否有办法让带组的未知消息类型返回SessionRejectReason.INVALID_MSGTYPE错误?
内容的提问来源于stack exchange,提问作者taneryilmaz
相关产品推荐
相关产品推荐

