Session.sendToTarget() 线程安全吗?

问题描述

我正在尝试将 QFJ 集成到单线程应用程序中。起初我试图将 QFJ 与我自己的 TCP 层一起使用,但我一直无法解决这个问题。现在我只是想集成一个启动器。根据我对 QFJ 的研究,我认为整体设计应该如下:

enter image description here

应用程序将不再是单线程的,因为 QFJ 发起者会创建线程,所以需要一些同步。 在这里,我使用的是 Socketinitiator(我只处理一个 FIX 会话),但如果我稍后使用线程版本,我希望有类似的设置。

将启动器集成到我的应用程序中有两个方面:

  1. 接收端(fromApp 回调):我相信这很简单,我只是将消息推送到我的 MainProcessthread 使用的线程安全队列。
  2. 发送方:我正在努力寻找这方面的文档。我应该如何处理同步?从 MainProcessthread 调用 Session.sendToTarget() 是否安全?或者我需要进行一些同步吗?

解决方法

正如 Michael 已经说过的,从多个线程调用 Session.sendToTarget() 是完全安全的,甚至是并发调用。但在我看来,你只能使用一个线程(MainProcessThread)。

Session 类的相关部分在方法 sendRaw() 中:

    private boolean sendRaw(Message message,int num) {
        // sequence number must be locked until application
        // callback returns since it may be effectively rolled
        // back if the callback fails.
        state.lockSenderMsgSeqNum();
        try {
        .... some logic here
        } finally {
            state.unlockSenderMsgSeqNum();
        }        

其他要点:

这里我使用的是 SocketInitiator(我只处理一个 FIX 会话),但如果我稍后使用线程版本,我希望类似的设置。

您是否总是只使用一个 Session?如果是,则使用 ThreadedSocketInitiator 没有任何用处,因为它所做的只是每个会话创建一个线程。

应用程序将不再是单线程的,因为 QFJ 发起者将创建线程

正如此处 Use own TCP layer implementation with QuickFIX/J 所述,您可以尝试传递 ExecutorFactory。但这可能不适用于您的特定用例。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...