QuickFIX处理修复消息的线程数

时间:2015-03-30 16:50:02

标签: c++ multithreading quickfix

我注意到在下面的代码片段中,在QuickFIX中,threadID始终是相同的,因为无论线程id fromApp输出等于MarketDataIncrementalRefresh的线程ID。但是我也注意到从fromApp调用到另一个fromApp的线程可能会有所不同,这意味着QuickFIX会将消息抛出到另一个(threadpool?)线程上。

我的问题是,(或多或少相关)

  1. 如果我没有下线,我是否会阻止QF抓住 另一条消息?
  2. 是否有参数允许我控制QF的线程数 用于管理收到的消息?
  3. 看来如果这个“使用的线程数”值足够高,那么就没有理由了 处理(解析等)在一个虚拟方法中收到的消息,例如, 另一个线程中的MarketDataIncrementalRefresh?

  4. 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';
        }
    

1 个答案:

答案 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)));