Sas*_*aXP 2 java quickfix fix-protocol quickfixj
我使用的是最新的quickfix版本1.6.0.我已经有了针对1.5.3编写的代码,而我正在尝试将其升级到1.6.0
我遇到的问题是,当我使用crack(msg,sessionID)方法时,它会抛出quickfix.Message cannot be cast to quickfix.fix50sp2.Message错误.我从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回调中不可用.
当开始字符串是FIXT.1.1时,quickfix会将消息视为FIX50 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;
}
Run Code Online (Sandbox Code Playgroud)