5

我正在编写一个使用 QuickFIX/J 作为 FIX 框架的应用程序。我的对方给我发了ExecutionReport一条 FIX 4.4 版的消息,但只有一些字段(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 版本一样对待它们。看这里

也许任何人都可以帮助我...

谢谢你的努力!!

4

2 回答 2

11

一种方法是自定义数据字典FIX4.4.xml并替换其中有时可能采用 FIX 5.0 格式的字段。例如,通过复制它们FIX5.0.xml并将它们放在适当的消息中FIX4.4.xml。有关详细信息,请参阅QuickFIX/J 用户常见问题解答。

来自QuickFIX/J 用户手册

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

之后重建 QuickFIX/J 以反映这些变化。


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

你需要安装蚂蚁。

QF/J 从 core/src/main/resources 中的 DD 生成源。备份您要更改的文件,然后根据需要进行更改。

然后重建如下:

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

在常见问题解答(如何重建 QF/J)中更进一步,对 ANT 的调用更具体:

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

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。要启用此功能,请在运行 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 
于 2015-04-30T15:04:02.167 回答
0

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

于 2017-04-03T18:48:09.657 回答