You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:47:00