我正在尝试将 QFJ 集成到单线程应用程序中。起初,我尝试将 QFJ 与我自己的 TCP 层结合使用,但我一直无法解决这个问题。现在我只是想整合一个启动器。根据我对QFJ的研究,我认为整体设计应该是这样的:
应用程序将不再是单线程的,因为 QFJ 启动器将创建线程,因此需要一些同步。 在这里,我使用 SocketInitiator(我只处理单个 FIX session ),但我希望稍后使用线程版本时也能进行类似的设置。
将启动器集成到我的应用程序中有两个方面:
- 接收方(fromApp 回调):我相信这很简单,我只需将消息推送到由我的 MainProcessThread 使用的线程安全队列。
- 发送方:我正在努力寻找这方面的文档。我应该如何处理同步?从 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/