Session.sendToTarget() 是线程安全的吗?

Is Session.sendToTarget() thread-safe?

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

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

将发起程序集成到我的应用程序中有两个方面:

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

正如 Michael 所说,从多个线程调用 Session.sendToTarget() 是绝对安全的,即使是同时调用也是如此。但据我所知,无论如何你只使用一个线程(MainProcessThread)。

Session class 的相关部分在方法 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();
        }        

其他要点:

Here I am using an SocketInitiator (I only handle a single FIX session), but I would expect a similar setup should I go for the threaded version later on.

你会一直只用一个吗Session?如果是,那么使用 ThreadedSocketInitiator 就没有用了,因为它所做的只是创建一个线程 per Session.

The application will no longer be single threaded, since the QFJ initiator will create threads

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