java - QuickFIX/J 中断开连接的客户端的消息队列行为

标签 java session quickfix quickfixj

我想澄清 QuickFIX/J (FIX 4.2) 在以下场景下的行为。此 QuickFIX/J 通信涉及两方:

  1. 客户端发起者,称为I
  2. 我们公司的接受者计划,称为A

I登录到A时,它们会与标签35=A交换FIX消息。连接建立后,开始提交订单。然而,可能会在某一时刻,I 意外断开连接,此时 A 决定为 I 的所有未平仓订单发送取消订单(这是有效的,因为A不知道为什么失败了,也不知道什么时候能活着回来。

请注意,整个取消连接过程是由 A 单独启动和处理的 - 它是从 AonLogout(... ) 方法并由其正常的订单管理机制处理。为 I 的每个未结订单生成一条 35=F 消息,并生成一个 ExecutionReport (35=8) code>) 在每次成功取消时生成。

I活着回来时,这些ExecutionReport必须以某种方式传递给I,以便它知道之前的所有订单都已被执行。取消。我的印象是 QuickFIX/J 的消息队列实现无需应用程序级帮助即可处理此问题。确保所有 QuickFIX 消息都能传送给交易对手 ( http://permalink.gmane.org/gmane.comp.finance.quickfix.devel/169 )。

然而,与我的理解相反,AQuickFIX 日志中没有显示 ExecutionReport,也没有将 ExecutionReport 传送到 II重新连接时,导致I不知道其之前的订单已被取消。我注意到由于 QuickFIX/JSessionsendRaw(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/

相关文章:

java - 64 位 Java VM 运行应用程序速度慢 10 倍

java - Spring-Webservices 的快速入门工具?

python - 使用Python的quickfix包,如何强制注销FIX连接?

java - 为什么 Quickfix 在发送注销响应后仍然启动登录

c# - 尝试将字符串转换为 MarketDataIncrementalRefresh

java - Java中包和子包的关系

Java 客户端/服务器 - 使用 BufferedWriter 而不是 PrintWriter

php - phpMyAdmin 的单点登录

php - Lumen PHP 框架中的 session 不持久

jsp - 为什么 tomcat 为每个请求创建一个 session cookie?