如何将带有 FIX 消息的原始字符串转换为 QuickFIX/J 消息对象
How to convert raw String with a FIX message to QuickFIX/J Message object
将带有一条 FIX 消息的原始字符串转换为一个 QuickFIX/J 适当类型的消息对象(例如一个 quickfix.fix44.ExecutionReport
对象)的推荐方法是什么?
我只需要对付FIX 4.4版本
我在 this thread on Quickfixj-users mailing list 找到了两个选项。
我根据自己的情况调整了这些选项,并且能够以两种不同的方式成功转换消息。
FIX 消息示例:
8=FIX.4.49=11035=834=749=EXEC52=20211014-19:39:25.75856=BANZAI6=011=114=10017=137=139=154=155=IBM150=2151=40010=237
我想知道下面哪个选项更好,或者两者都错了,还有更好的方法。
提前致谢。
1 个选项
quickfix.Message rawMessage = new quickfix.Message(rawMessageString);
// Example of MsgType = 8
MsgType msgType = new MsgType();
rawMessage.getHeader().getField(msgType);
MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX44);
quickfix.Message message = messageFactory.create("FIX.4.4", msgType.getValue());
message.fromString(messageString, null, false, true);
// message.getName() = quickfix.fix44.ExecutionReport
System.out.println(message.getName() = " + message.getClass().getName());
2 个选项
MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX44);
quickfix.Message messageFromMessageUtils = quickfix.MessageUtils.parse(messageFactory, null, rawMessageString);
// message.getName() = quickfix.fix44.ExecutionReport
System.out.println(message.getName() = " + message.getClass().getName());
数据字典
在上面的测试中,我没有使用数据字典,但在我的实际应用中我会使用一个。
我特别不喜欢选项 1 的地方是您需要构造两条消息。一个用于提取 MsgType
以及之后的实际消息。我觉得没必要。
如果你只使用 FIX4.4,我会选择第二个选项,因为它为你做了所有的魔法,即从原始字符串中提取所需的东西,如 BeginString
和 MsgType
.
缺点: 它只能工作到 FIX4.4 并包括 FIX4.4,因为 MessageUtils.parse()
只考虑 BeginString
(不是 ApplVerID
).
但是,这对于您的用例应该没有问题。
P.S.: 如果您需要解析 FIX5.0 及更高版本的消息,请使用以下内容(基本上是选项 1,但无需构建消息来获取 MsgType
):
String msgType = MessageUtils.getMessageType(rawMessageString);
MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX50); // FIX5.0 for example
quickfix.Message message = messageFactory.create("FIXT.1.1", ApplVerID.FIX50, msgType);
message.fromString(rawMessageString, dd, false, true);
P.P.S.: 对您的用例不感兴趣,但为了完整起见:您也可以使用 quickfix.Message(String)
构造函数之一,但不会 return你的正确类型的消息。只是一般quickfix.Message
.
将带有一条 FIX 消息的原始字符串转换为一个 QuickFIX/J 适当类型的消息对象(例如一个 quickfix.fix44.ExecutionReport
对象)的推荐方法是什么?
我只需要对付FIX 4.4版本
我在 this thread on Quickfixj-users mailing list 找到了两个选项。
我根据自己的情况调整了这些选项,并且能够以两种不同的方式成功转换消息。
FIX 消息示例:
8=FIX.4.49=11035=834=749=EXEC52=20211014-19:39:25.75856=BANZAI6=011=114=10017=137=139=154=155=IBM150=2151=40010=237
我想知道下面哪个选项更好,或者两者都错了,还有更好的方法。
提前致谢。
1 个选项
quickfix.Message rawMessage = new quickfix.Message(rawMessageString);
// Example of MsgType = 8
MsgType msgType = new MsgType();
rawMessage.getHeader().getField(msgType);
MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX44);
quickfix.Message message = messageFactory.create("FIX.4.4", msgType.getValue());
message.fromString(messageString, null, false, true);
// message.getName() = quickfix.fix44.ExecutionReport
System.out.println(message.getName() = " + message.getClass().getName());
2 个选项
MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX44);
quickfix.Message messageFromMessageUtils = quickfix.MessageUtils.parse(messageFactory, null, rawMessageString);
// message.getName() = quickfix.fix44.ExecutionReport
System.out.println(message.getName() = " + message.getClass().getName());
数据字典
在上面的测试中,我没有使用数据字典,但在我的实际应用中我会使用一个。
我特别不喜欢选项 1 的地方是您需要构造两条消息。一个用于提取 MsgType
以及之后的实际消息。我觉得没必要。
如果你只使用 FIX4.4,我会选择第二个选项,因为它为你做了所有的魔法,即从原始字符串中提取所需的东西,如 BeginString
和 MsgType
.
缺点: 它只能工作到 FIX4.4 并包括 FIX4.4,因为 MessageUtils.parse()
只考虑 BeginString
(不是 ApplVerID
).
但是,这对于您的用例应该没有问题。
P.S.: 如果您需要解析 FIX5.0 及更高版本的消息,请使用以下内容(基本上是选项 1,但无需构建消息来获取 MsgType
):
String msgType = MessageUtils.getMessageType(rawMessageString);
MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX50); // FIX5.0 for example
quickfix.Message message = messageFactory.create("FIXT.1.1", ApplVerID.FIX50, msgType);
message.fromString(rawMessageString, dd, false, true);
P.P.S.: 对您的用例不感兴趣,但为了完整起见:您也可以使用 quickfix.Message(String)
构造函数之一,但不会 return你的正确类型的消息。只是一般quickfix.Message
.