当前位置: 首页 > 面试题库 >

QuickFIX / J混合两个不同版本

岳嘉容
2023-03-14
问题内容

我正在编写一个使用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(...)只需要a
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用户常见问题解答以获取更多详细信息。

从QuickFIX /
J用户手册中:

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

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

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

您需要安装ant。

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

然后重新构建,如下所示:

  1. 蚂蚁罐
  2. 系统将提示您输入发行号;这仅决定了jar名称的后缀。输入您想要的任何内容。
  3. 等待构建完成
  4. 在核心/目标/中找到全新的QF / J罐子

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

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

ant版本= SOME_STRING -Dskip.jalopy =真正的干净罐子

重建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


 类似资料:
  • QuickFIX/J 是一个实现了金融信息交换协议的Java引擎。 金融信息交换协议(FIX,Financial Information exchange)协议是适用于实时证券、金融电子交易开发的数据通信标准。它是由国际FIX协会组织提供的一个开放式协议,目的是推动国际贸易电子化的 进程,在各类参与者之间,包括投资经理、经纪人,买方、卖方建立起实时的电子化通讯协议。FIX 协议的目标是把各类证券金

  • 我正在用GLSL处理纹理。我如何用GLSL处理两个纹理?一个人推荐我在我的GLSL中做两个采样2D...但是GLSL如何知道2D应该使用哪些采样器呢?(我不是在说混合纹理...) 我听说我应该使用glbindtexture。我怎么能这么做?用glbindtexture?有人有这方面的例子吗?

  • 我正在尝试创建一个启动QuickFIX/J接受器服务器(TCP FIX服务器)的版本。启动时,接受器线程在单独的线程上运行,Vert. x不知道这一点(不会阻止事件循环)。然而,我可以从接受器线程访问事件总线,并将消息传递给其他顶点。 问题是,这是一个好的做法吗?

  • 问题内容: 我有一个独立使用两个依赖项的项目:BoneCP和Hibernate。但是由于SLF4J及其版本冲突,它无法正常工作,因为BoneCP需要SLF4J 1.5,而Hibernate需要SLF4j 1.6。如您所知,在pom.xml中不可能同时具有相同依赖项的两个不同版本。所以,我该怎么办才能解决这种惊人的SLF4J副作用??? 我得到的错误是臭名昭著的: 我需要添加它,但是不允许具有两个不

  • 问题内容: 我在数组列表中有很多Slot类型的对象。 插槽类别如下所示- 让类型列表被调用。插槽根据开始时间进行排序。一个时隙的结束时间可以等于下一时隙的开始时间,但是它们永远不会重叠。 是否有任何可能的方式可以使用Java 8流在此列表上进行迭代,并且如果一个的结束时间与下一个的开始时间匹配,则将两个插槽合并并输出到一个插槽中? 问题答案: 我的免费StreamEx库完全支持这种情况,该库增强了

  • 我的应用程序在两个jboss版本jboss 4和jboss 7之间扩展。Jboss 4 intance正在通过eclipse运行。当我尝试通过[Jboss_HOME]/bin/standalone.bat运行Jboss 7时,它不会启动,并显示以下错误。 调用"C:\jboss as-7.1.1。最终\bin\standalone.conf.bat"警告JBOSS_HOME可能指向不同的安装-可能