【问题标题】:Is Session.sendToTarget() thread-safe?Session.sendToTarget() 线程安全吗?
【发布时间】:2021-08-03 00:51:48
【问题描述】:

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

应用程序将不再是单线程的,因为 QFJ 发起程序将创建线程,因此需要一些同步。 这里我使用的是 SocketInitiator(我只处理一个 FIX 会话),但我希望稍后我可以使用线程版本。

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

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

【问题讨论】:

  • 不确定您的问题是什么。 “类quickfix.Session 线程安全吗?”,也许?是的。
  • 谢谢迈克尔!实际上,既然答案是肯定的,那是唯一的问题,我将重新表述。我很难在 quickfix javadoc 或 github 上找到这种信息。你有一个链接来备份这个吗?如果可以的话,你能把它给一个答案,这样我就可以把它标记为已回答。
  • 真的是三件事。 1) 我在工作中使用过 quickfix,并且知道我们不会用任何东西来包装这些组件以实现线程安全,而且我们从来没有遇到任何问题 2) 鉴于 quickfix 作为一个框架是基于使用多个线程的想法,提供非线程安全的原语是非常不负责任的 3)我刚才检查了quickfix.Session 的实现,发现它们使用的是可重入锁。

标签: java multithreading thread-safety fix-protocol quickfixj


【解决方案1】:

正如 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。但这可能不适用于您的特定用例。

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 2011-07-04
    • 2014-04-26
    • 2012-11-30
    • 2010-12-30
    • 2013-03-12
    • 2010-12-27
    • 2018-06-04
    • 2011-09-18
    相关资源
    最近更新 更多