我想澄清QuickFIX/J
(FIX 4.2)在以下情况下的行为。QuickFIX/J
此通信涉及两方:
- 客户端发起程序,称为I。
- 我们公司的接受者程序,称为A。
当我登录A时,他们用 tag 交换 FIX 消息35=A
。建立连接后,我开始提交订单。然而,可能有一点,我意外断开连接,此时A决定为I的所有未结订单发送取消(这是有效的,因为A不知道我为什么失败或我什么时候会活着回来)。
请注意,整个取消连接过程由A单独启动和处理 - 它从A的onLogout(...)
方法启动并由其正常的订单管理机制处理。为I35=F
的每个未结订单生成一条消息,并在每次成功取消时生成一个( )。ExecutionReport
35=8
当我活着回来时,这些ExecutionReport
s 必须以某种方式交付给我,以便它知道它之前的所有订单都已被取消。我的印象是,QuickFIX/J
消息队列实现在没有应用程序级帮助的情况下处理了这个问题。确保所有QuickFIX
消息都能传递给交易对手 ( http://permalink.gmane.org/gmane.comp.finance.quickfix.devel/169 )。
然而,与我的理解相反,A的日志ExecutionReport
中没有显示,或者在我重新连接时没有发送给我,导致我不知道它之前的订单已被取消。我注意到由于in方法的以下源代码没有发生日志记录:QuickFIX
sendRaw(Message message, int num)
Session
QuickFIX/J
/**
* 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"
}
}
...
}
在为IExecutionReport
断开连接发起的取消生成消息时,会话未登录,因此它从未命中并且没有发生日志记录。我相信出于同样的原因,没有消息排队(基于我没有收到任何消息的事实)。send(messageString);
我们公司基于QuickFIX/J
保证所有消息都能无损传递的信念进行了许多实施,但我对上述场景的观察表明并非如此。
QuickFIX/J
当会话未登录时, 的消息队列在这种情况下的表现如何?无论如何,它应该排队消息,等待将来会话再次可用时发送,还是在会话关闭时停止排队?