QuickFIX / J混合了两个不同的版本

我正在编写一个使用QuickFIX / J作为FIX框架的应用程序。 我的对手向我发送了FIX版本4.4的ExecutionReport消息但是只有一些字段( Parties组件)的版本为5.0

现在我试图实现我可以阅读这个组件。

这个

 @Override public void onMessage(quickfix.fix44.ExecutionReport message, SessionID sessionID) throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue { quickfix.fix50.component.Parties parties = new Parties(); message.get(parties); // ... } 

不起作用! 消息来自版本4.4,这就是为什么message.get(...)只想要一个quickfix.fix44.component.Parties ,而不是版本5.0之一

如果我试试这个

 @Override public void onMessage(quickfix.fix50.ExecutionReport message, SessionID sessionID) throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue { // ... } 

我收到以下错误:

 Exception in thread "pool-2-thread-1" java.lang.VerifyError: Bad type on operand stack Exception Details: Location: quickfix/fix44/ExecutionReport.get(Lquickfix/field/SettlType;)Lquickfix/field/SettlType; @2: invokevirtual Reason: Type 'quickfix/field/SettlType' (current frame, stack[1]) is not assignable to 'quickfix/CharField' Current Frame: bci: @2 flags: { } locals: { 'quickfix/fix44/ExecutionReport', 'quickfix/field/SettlType' } stack: { 'quickfix/fix44/ExecutionReport', 'quickfix/field/SettlType' } Bytecode: 0000000: 2a2b b600 5657 2bb0 at quickfix.fix44.MessageFactory.create(MessageFactory.java:195) at quickfix.DefaultMessageFactory.create(DefaultMessageFactory.java:133) at quickfix.MessageUtils.parse(MessageUtils.java:145) at quickfix.mina.AbstractIoHandler.messageReceived(AbstractIoHandler.java:118) at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:854) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:943) at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:405) at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:235) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:943) at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542) at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:535) at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:714) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:668) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:657) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1121) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 

这是因为我得到了4.4个字段,但是想把它们视为4.4版本。看看这里

也许有人可以帮助我……

谢谢你的努力!!

一种方法是自定义数据字典FIX4.4.xml并替换其中有时可能是FIX 5.0格式的字段。 例如,从FIX5.0.xml复制它们并将它们放在FIX4.4.xml中的正确消息中。

从QuickFIX / J用户手册 :

最简单的定制是仅修改一个或多个数据字典(例如,FIX44.xml)并重建QFJ。 这允许您添加自定义字段,定义规范中未包含的新消息,更改字段是必需字段还是可选字段等。

然后重建QuickFIX / J以反映这些更改。


重建QuickFIX / J版本1.5.x的说明

查看QuickFIX / J用户常见问题解答 ,了解如何重建QuickFIX / J(编辑:版本1.5.x):

你需要安装ant。

QF / J从core / src / main / resources中的DD生成源。 备份你要改变的那个,然后根据需要改变它。

然后重建如下:

  1. antjar子
  2. 系统将提示您输入版本号; 这只是确定给jar名称的后缀。 输入你想要的任何东西
  3. 等待构建完成
  4. 在core / target /中找到全新的QF / Jjar子

在FAQ(我如何重建QF / J)中稍微进一步调用ANT更具体:

version参数只是文件名后缀。 skip.jalopy参数是可选的,将跳过一些耗时的doc生成。

ant version = SOME_STRING -Dskip.jalopy = true clean jar


重建QuickFIX / J版本1.6.x的说明

对于1.6.0版本,使用Maven完成构建。

如果要从命令行构建代码,则需要下载并安装Maven(版本3.2.5或更高版本)。 如果您使用IDE构建,通常会包含Maven。 从源代码构建需要Java 6+。

  1. 查看GitHub的代码。 有关克隆存储库的更多详细信息,请参阅GitHub上的说明。
  2. 将目录更改为签出代码的顶级目录。 您应该看到一个pom.xml文件。
  3. 运行mvn package来构建QuickFIX / J和示例jar文件。 这也将为各种FIX版本生成所有与FIX消息相关的代码。
  4. 对于价格和数量等字段,代码生成器可以选择使用BigDecimal而不是double。 要启用此function,请在运行generate.code目标时在命令行上传递-Dgenerator.decimal选项。

您可以将各种命令行开关传递给ant以修改生成的行为:

 Switch Description Default -Dgenerator.decimal Generate BigDecimal vs doubles fields false -DskipAT=true Skip running of acceptance test suite. false 

例如,为了生成具有BigDecimals的字段并跳过验收测试:

 mvn test -Dgenerator.decimal=true -DskipAT=true 

此问题已在1.6.3版中得到解决。