異常
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的連接。