如何阻止QuickFIX/J重写消息?消息字段丢失问题求助
解决QuickFIX/J发送时丢失字段、实现原样发送的方法
你遇到的问题确实是因为QuickFIX/J的Message构造函数会依赖配置的数据字典做校验、字段排序和过滤,不在字典里的字段会被自动丢弃。要实现原样发送消息不重写,有两种靠谱的方案:
1. 使用RawMessage直接发送(最彻底的方式)
QuickFIX/J专门提供了RawMessage类,它不会对传入的原始FIX字符串做任何解析、校验或修改,直接原样转发。用法很简单:
- 从内部总线拿到FIX字符串
msgStr后,直接构造RawMessage实例,再通过Session发送:
// 构造原始消息,完全保留传入的字符串内容 RawMessage rawMsg = new RawMessage(msgStr); // 发送到目标会话,如果需要指定会话ID,可传入对应的SessionID参数 Session.sendToTarget(rawMsg);
这种方式完全绕过了QuickFIX/J的字段校验和重写逻辑,确保消息和从总线拿到的字符串完全一致。
2. 修改会话配置,关闭字段校验与重写(适用于仍需使用Message类的场景)
如果因为某些原因必须用Message类构造消息,可以在会话配置文件中添加以下参数,让QuickFIX/J尽可能保留原始字段:
AllowUnknownFields=Y:允许消息中存在字典未定义的字段,不会丢弃ValidateFieldsOutOfOrder=N:不校验字段顺序,保留原始消息的字段排列ValidateUserDefinedFields=N:关闭自定义字段的校验逻辑PreserveOriginalFieldValues=Y:保留字段的原始值,不做格式转换
不过这种方法还是存在一定风险,比如如果消息中存在不符合FIX规范的内容,QuickFIX/J可能还是会做少量调整,不如RawMessage彻底。
注意事项
- 使用
RawMessage时,要确保原始消息的校验和(CheckSum)、消息长度(BodyLength)都是正确的,否则接收方会因为校验失败拒收消息。如果原始消息是从外部接收后直接转存的,一般不会有问题;如果是手动拼接的,要自己处理校验逻辑。 - 如果需要对原始消息做部分修改再发送,建议先把字典配置补全(包括所有自定义字段),再使用
Message类,避免字段丢失。
内容的提问来源于stack exchange,提问作者Chris Milburn
相关产品推荐
相关产品推荐

