我想澄清 QuickFIX/J
(FIX 4.2) 在以下场景下的行为。此 QuickFIX/J
通信涉及两方:
- 客户端发起者,称为I。
- 我们公司的接受者计划,称为A。
当I登录到A时,它们会与标签35=A
交换FIX消息。连接建立后,我开始提交订单。然而,可能会在某一时刻,I 意外断开连接,此时 A 决定为 I 的所有未平仓订单发送取消订单(这是有效的,因为A不知道为什么我失败了,也不知道我什么时候能活着回来。
请注意,整个取消连接过程是由 A 单独启动和处理的 - 它是从 A 的 onLogout(... )
方法并由其正常的订单管理机制处理。为 I 的每个未结订单生成一条 35=F
消息,并生成一个 ExecutionReport
(35=8
) code>) 在每次成功取消时生成。
当I活着回来时,这些ExecutionReport
必须以某种方式传递给I,以便它知道之前的所有订单都已被执行。取消。我的印象是 QuickFIX/J 的消息队列实现无需应用程序级帮助即可处理此问题。确保所有 QuickFIX
消息都能传送给交易对手 ( http://permalink.gmane.org/gmane.comp.finance.quickfix.devel/169 )。
然而,与我的理解相反,A 的 QuickFIX
日志中没有显示 ExecutionReport
,也没有将 ExecutionReport
传送到 I当I重新连接时,导致I不知道其之前的订单已被取消。我注意到由于 QuickFIX/J
中 Session
的 sendRaw(Message message, int num)
方法的以下源代码而没有发生日志记录>:
/**
* Send the message
*
* @param message is the message to send
* @param num is the seq num of the message to send, if 0, the next expected sender seqnum is used.
* @return
*/
private boolean sendRaw(Message message, int num) {
...
} else {
try {
application.toApp(message, sessionID);
} catch (final DoNotSend e) {
return false;
} catch (final Throwable t) {
logApplicationException("toApp()", t);
}
messageString = message.toString();
if (isLoggedOn()) { // happens only if session is connected
result = send(messageString); // logging happens within "send"
}
}
...
}
在为 I 断开连接发起的取消生成 ExecutionReport
消息时, session 未登录,因此它从未命中 send(messageString );
并且没有发生日志记录。我相信出于同样的原因,没有消息被排队(基于我在活着回来时没有收到任何消息的事实)。
我们公司基于 QuickFIX/J
保证所有消息无损传递的信念进行了许多实现,但我对上述场景的观察却表明事实并非如此。
当 session 未登录时,QuickFIX/J
的消息队列在这种情况下预期如何表现?不管怎样,它是否应该对消息进行排队,等待 session 将来再次可用时发送,或者在 session 关闭期间停止排队?
最佳答案
在private boolean sendRaw(Message message, int num)
方法的末尾有这样的代码:
if (num == 0) {
final int msgSeqNum = header.getInt(MsgSeqNum.FIELD);
if (persistMessages) {
state.set(msgSeqNum, messageString);
}
state.incrNextSenderMsgSeqNum();
}
state.set(msgSeqNum, messageString)
将调用 messageStore.set(sequence, message)
,如果 session 未连接,它实际上存储消息以供以后传递.
据我所知,所有消息都会排队,直到 session 成功登录。
关于java - QuickFIX/J 中断开连接的客户端的消息队列行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34758046/