QuickFIX/J Message Cracking时onMessage()处理方法未被调用问题
解决方案
你遇到的问题核心是FIXT.1.1传输协议下MessageCracker默认无法匹配FIX5.0SP2应用层版本的处理方法,可按以下步骤排查修复:
步骤1:修改crack调用逻辑(最常见原因)
FIXT.1.1是传输层协议,BeginString固定为FIXT.1.1,默认crack(message, sessionId)方法会用BeginString匹配消息版本,自然找不到FIX5.0SP2对应的onMessage处理逻辑。你需要调用重载的crack方法手动指定应用层版本:
@Override public void fromApp(Message message, SessionID sessionId) throws FieldNotFound, IncorrectTagValue, UnsupportedMessageType { // 手动指定应用层版本为FIX5.0SP2 crack(message, sessionId, quickfix.fixt11.ApplVerID.FIX50SP2); }
如果你的业务支持多应用层版本,也可以从消息的1128字段(ApplVerID)动态读取版本传入:
@Override public void fromApp(Message message, SessionID sessionId) throws FieldNotFound, IncorrectTagValue, UnsupportedMessageType { ApplVerID applVerID = new ApplVerID(); message.getHeader().getField(applVerID); crack(message, sessionId, applVerID); }
步骤2:检查字典文件是否存在
确认你的项目resources/spec目录下存在以下两个字典文件:
FIXT11.xml(传输层字典)FIX50SP2.xml(应用层字典)
如果缺少对应文件,消息会被解析为通用quickfix.Message实例,而非quickfix.fix50sp2.NewOrderSingle具体类,导致Cracker无法匹配处理方法。你可以从QuickFIX/J发行包的spec目录获取对应版本的字典文件。
步骤3:校验方法签名是否正确
确保onMessage方法满足以下要求:
- 修饰符为
public - 第一个参数是
quickfix.fix50sp2.NewOrderSingle,第二个参数是SessionID - 方法抛出
FieldNotFound、IncorrectTagValue两个异常(不能少也不能多其他非运行时异常)
你当前的方法签名是符合要求的,这一步只需确认包导入正确即可。
完成以上修改后重启服务,NewOrderSingle消息就能正常触发对应的onMessage处理方法了。
内容的提问来源于stack exchange,提问作者taneryilmaz
相关产品推荐
相关产品推荐

