我注意到在下面的代码片段中,在QuickFIX中,threadID始终是相同的,因为无论线程id fromApp
输出等于MarketDataIncrementalRefresh
的线程ID。但是我也注意到从fromApp
调用到另一个fromApp
的线程可能会有所不同,这意味着QuickFIX会将消息抛出到另一个(threadpool?)线程上。
我的问题是,(或多或少相关)
void MyApplication::fromApp( const FIX::Message& message, const` FIX::SessionID& sessionID )
throw( /*FIX::FieldNotFound,*/ FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType )
{
//std::cout << std::endl << "IN: " << message << "\n";
try
{
std::cout << "fromApp " << std::this_thread::get_id() << '\n';
crack( message, sessionID );
}
catch(std::exception& ex)
{
std::cout << "crack exception: " << ex.what() << "\n";
}
}
void MyApplication::onMessage
(const FIX44::MarketDataIncrementalRefresh& message, const FIX::SessionID& fsid)
{
std::cout << "MarketDataIncrementalRefresh " << std::this_thread::get_id() << '\n';
}
答案 0 :(得分:0)
似乎有两种实例化Initiator的方法:
FIX::SocketInitiator initiator( application, storeFactory, settings);
或
FIX::ThreadedSocketInitiator initiator( application, storeFactory, settings);
但这似乎可以处理一个线程处理多个会话或多个线程处理不同会话的情况。我的问题与在这些QF线程模型中破解消息的线程和处理消息的通信/接收的线程是否相同有关。所以我认为不是一回事。换句话说,一旦消息进一步进入应用程序。
我也见过这样的代码:
new SocketAcceptor(3, new ThreadPoolExecutor(3, 3, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000)));