问题描述
我正在尝试将 QFJ 集成到单线程应用程序中。起初我试图将 QFJ 与我自己的 TCP 层一起使用,但我一直无法解决这个问题。现在我只是想集成一个启动器。根据我对 QFJ 的研究,我认为整体设计应该如下:
应用程序将不再是单线程的,因为 QFJ 发起者会创建线程,所以需要一些同步。 在这里,我使用的是 Socketinitiator(我只处理一个 FIX 会话),但如果我稍后使用线程版本,我希望有类似的设置。
将启动器集成到我的应用程序中有两个方面:
- 接收端(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();
}
其他要点:
这里我使用的是 SocketInitiator(我只处理一个 FIX 会话),但如果我稍后使用线程版本,我希望类似的设置。
您是否总是只使用一个 Session
?如果是,则使用 ThreadedSocketInitiator
没有任何用处,因为它所做的只是每个会话创建一个线程。
应用程序将不再是单线程的,因为 QFJ 发起者将创建线程
正如此处 Use own TCP layer implementation with QuickFIX/J 所述,您可以尝试传递 ExecutorFactory
。但这可能不适用于您的特定用例。