3

我正在使用最新的 quickfix 版本,即 1.6.0。我已经有针对 1.5.3 编写的代码,我正在尝试将其升级到 1.6.0

我遇到的问题是当我使用它抛出quickfix.Message cannot be cast to quickfix.fix50sp2.Message错误的破解(msg,sessionID)方法时。我正在从 verifix 发送正确的 FIX50SP2 MarketDataSnapshotFullRefresh 消息。异常的摘录如下

java.lang.ClassCastException: quickfix.Message cannot be cast to quickfix.fix50sp2.Message at quickfix.fix50sp2.MessageCracker.crack(MessageCracker.java:1555) at com.****.fixserver.FixMessageListener.fromApp(FixMessageListener.java:162) at quickfix.Session.fromCallback(Session.java:1731) at quickfix.Session.verify(Session.java:1682)

如何将传入消息破解为正确的 SP2 消息?

有一个crack50() 方法,但这需要一个SP2 消息,该消息在fromApp 回调中不可用。

4

1 回答 1

8

当开始字符串为 FIXT.1.1 时,quickfix 会将消息视为带有DefaultMessageFactory. 所以它会自动生成一条 FIX.5.0 消息。

解决方法是编写您自己的自定义消息工厂以在传输为 FIXT.1.1 时生成 SP2 消息。这就是我的做法。

编写自定义消息工厂实现quickfix.MessageFactory接口。您可以复制DefaultMessageFactory代码并更改 create() 方法,如下所示。

 public Message create(String beginString, String msgType) {
    MessageFactory messageFactory = messageFactories.get(beginString);
    if (beginString.equals(BEGINSTRING_FIXT11)) {
        // The default message factory assumes that only FIX 5.0 will be
        // used with FIXT 1.1 sessions. A more flexible approach will require
        // an extension to the QF JNI API. Until then, you will need a custom
        // message factory if you want to use application messages prior to
        // FIX 5.0 with a FIXT 1.1 session.
        //
        // TODO: how do we support 50/50SP1/50SP2 concurrently?
        //
        // If you need to determine admin message category based on a data
        // dictionary, then use a custom message factory and don't use the
        // static method used below.
        if (!MessageUtils.isAdminMessage(msgType)) {
            messageFactory = messageFactories.get(FIX50SP2);
        }
    }

    if (messageFactory != null) {
        return messageFactory.create(beginString, msgType);
    }

    Message message = new Message();
    message.getHeader().setString(MsgType.FIELD, msgType);

    return message;
}
于 2015-05-13T02:22:46.130 回答