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

标签 java multithreading thread-safety fix-protocol quickfixj

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

enter image description here

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

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

  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();
        }        

其他要点:

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 是没有用的,因为它所做的只是为每个 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。但这可能不适用于您的特定用例。

关于java - Session.sendToTarget() 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67507353/

相关文章:

java - 为什么我的 System.nanoTime() 坏了?

c - 多线程 pthread 错误

C# 通过 SOCKET 读取/写入 JAVA 并存在一些并发/套接字问题

c++ - 如何使应用程序线程安全?

java - 带 Jersey 的 HK2 注入(inject)管理器,使用 OpenJDK 11 升级

java - 如何将 Opcodes 中 ASM 的 API 版本映射到 Java 版本?

java - java中的多线程服务器..服务文件的线程

Struts ScopeInterceptor 类中的 Java 线程安全问题?

ios - 这种初始化单例线程的方法安全吗?

java - 坚持一些角度算术