首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QuickFIX/J:输入“quickfix/field/HaltReason”不能分配给“quickfix/IntField”

QuickFIX/J:输入“quickfix/field/HaltReason”不能分配给“quickfix/IntField”
EN

Stack Overflow用户
提问于 2022-02-10 14:30:24
回答 2查看 131关注 0票数 0

摘要

我们有一个quickfix客户端,它接收SecurityDefiniton和SecurityDefinitionUpdateReport消息。这些是大量数据。当我们登录到服务器时,它们会发送大约8000条消息。最后,他们正在发送SecurityStatus信息。在这部分,我们得到了一个例外。

Fix协议版本:带有FIXT1.1的FIX50SP2

Quickfix消息依赖项

代码语言:javascript
复制
<dependency>
       <groupId>org.quickfixj</groupId>
       <artifactId>quickfixj-messages-fix50sp2</artifactId>
       <version>2.3.0</version>
</dependency>

快固芯

代码语言:javascript
复制
<dependency>
       <groupId>org.quickfixj</groupId>
       <artifactId>quickfixj-core</artifactId>
       <version>2.0.0</version>
</dependency>

我们收到的例外;

代码语言:javascript
复制
Exception in thread "pool-5-thread-1" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    quickfix/fix50sp2/SecurityStatus.get(Lquickfix/field/HaltReason;)Lquickfix/field/HaltReason; @2: invokevirtual
  Reason:
    Type 'quickfix/field/HaltReason' (current frame, stack[1]) is not assignable to 'quickfix/IntField'
  Current Frame:
    bci: @2
    flags: { }
    locals: { 'quickfix/fix50sp2/SecurityStatus', 'quickfix/field/HaltReason' }
    stack: { 'quickfix/fix50sp2/SecurityStatus', 'quickfix/field/HaltReason' }
  Bytecode:
    0x0000000: 2a2b b600 1557 2bb0

        at quickfix.fix50sp2.MessageFactory.create(MessageFactory.java:297)
        at foo.bar.data.plugin.fix.api.MessageFactory.MessageFactorySp2.create(MessageFactorySp2.java:93)
        at quickfix.MessageUtils.parse(MessageUtils.java:145)
        at quickfix.mina.AbstractIoHandler.messageReceived(AbstractIoHandler.java:131)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:858)
        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:947)
        at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:398)
        at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:234)
        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:947)
        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:703)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:659)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:648)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1120)
        at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

我们无法获得SecurityStatus修复消息。我们想的问题是关于数据字典的。作为字段,HaltReason是CharField

代码语言:javascript
复制
public class HaltReason extends CharField {
    static final long serialVersionUID = 20050617L;
    public static final int FIELD = 327;
    public static final char NEWS_DISSEMINATION = 'D';
    public static final char ORDER_INFLUX = 'E';
    public static final char ORDER_IMBALANCE = 'I';
    public static final char ADDITIONAL_INFORMATION = 'M';
    public static final char NEWS_PENDING = 'P';
    public static final char EQUIPMENT_CHANGEOVER = 'X';

当我们查看FIX50SP2默认数据字典时,原因字段是INT。

代码语言:javascript
复制
<field number="327" name="HaltReasonInt" type="INT">
<value enum="0" description="NEWS_DISSEMINATION"/>
<value enum="1" description="ORDER_INFLUX"/>
<value enum="2" description="ORDER_IMBALANCE"/>
<value enum="3" description="ADDITIONAL_INFORMATION"/>
<value enum="4" description="NEWS_PENDING"/>
<value enum="5" description="EQUIPMENT_CHANGEOVER"/>
</field>

我们尝试将字典字段转换为HaltReasonChar和CHAR类型,但它没有工作。你有过这样的例外吗?

这是我收到的安全状态消息。

代码语言:javascript
复制
8=FIXT.1.19=00017835=f49=BI_TEST56=LIABR34=589857=TRTK152=20220208-20:07:15.9281180=R1181=28513331350=285133255=T2-ON48=3762690422=M336=148325=N60=20220208-20:07:15.92810=245
EN

回答 2

Stack Overflow用户

发布于 2022-10-19 13:51:40

您的状态消息中不包含HaltReason字段(tag 327)。它是SecurityStatus消息类型的可选字段还是必需字段?您可以在数据字典定义中控制这一点。

我所拥有的FIX50SP2.xml字典表明这个字段不是必需的,但您的字段可能不一样。

小心经纪人提供的字典;它们经常是错误的或过时的。

票数 0
EN

Stack Overflow用户

发布于 2022-11-10 14:04:24

以下内容对我来说很好:报告的类型为QuickFix.Fix 44。

代码语言:javascript
复制
try {

                    response.setHaltReason(report.getString(327));
        
            } catch (Exception e) {
                log.error...
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71066918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档