2015-05-06 3 views
2

Я использую последнюю версию quickfix, которая составляет 1.6.0. У меня уже есть код, который написан против 1.5.3, и то, что я пытаюсь сделать, это обновить его до 1.6.0quickfix.Message не может быть добавлен в quickfix.fix50sp2.Message

Проблема у меня есть, когда я использую метод трещины (msg, sessionID), который выдает quickfix.Message cannot be cast to quickfix.fix50sp2.Message , Я отправляю правильное сообщение FIX50SP2 MarketDataSnapshotFullRefresh из verifix. Экстракт, за исключением ниже

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.

ответ

6

Когда начальная строка FIXT.1.1 quickfix будет обрабатывать сообщение как FIX50 с помощью DefaultMessageFactory. Поэтому он автоматически генерирует сообщение FIX.5.0.

Решение состоит в том, чтобы написать собственную фабрику сообщений, чтобы сгенерировать сообщение SP2, когда транспорт является FIXT.1.1. Вот как я это сделал.

Написать письмо заказной фабрике, реализующей интерфейс 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; 
}