RabbitMQ第四課 多線程收發異常

異常
    Internal error: unable to determine timeout reason

場景
    在調用rabbitMQ接收數據的時候,出現如上的錯誤。代碼斷點在amqp_consume_message函數,發現如果consume阻塞時,其他線程用該socket去發送數據,會導RabbitMQ裏面amqp_tcp_socket.c裏面amqp_tcp_socket_recv會退出,導致調用amqp_tcp_socket_recv的wait_frame_inner裏面報異常

原因
    剛開始還以爲多線程情況下,同時收發,沒有設置接收超時,就會出現上述問題,提出如下的解決方案:
 timeval valTimeOut;
 valTimeOut.tv_sec = 1;
 valTimeOut.tv_usec = 0;
 ret = amqp_consume_message(m_connState, &envelope, &valTimeOut, 0);
實際上並不是如此

解決
    C語言版本打開一個連接後是用一個結構體amqp_connection_state_t_作爲句柄標示一個連接;該句柄不是線程安全的,庫是基於單線程,事件響應來設計的,多個線程同時使用,肯定會衝突的。因此收發都需要實例化不同的amqp_connection_state_t_連接,進行RabbitMQ的連接。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章