一、现象:
1.从界面上“Queues”选项观察到
消费者从rabbitmq消费消息,消息状态从“Ready”变为“Unacked”,然后多线程处理并多线程调用amqp-cpp发送消息,中间处理过程中,rabbitmq消息状态从“Unacked”突然又变为“Ready”,出现消息回退。
2.从界面上“Connections”选项观察到
消费者连接状态从“running”突然变为“closed”。
二、查看rabbitmq服务端日志
Error on AMQP connection <0.26819.0> (172.19.0.1:40386 -> 172.19.0.10:5672, vhost: '/', user: 'guest', state: running), channel 1:
operation basic.publish caused a connection exception unexpected_frame: "expected content header for class 60, got non content header frame instead"
三、原因分析
1.连接断开,导致消息回退;
2.从网上百度到类似问题,https://www.cnblogs.com/StitchSun/p/11654835.html
问题的根本原因为多线程向channel发送消息导致。
四、解决方法
方法1:心跳设置为0,即设置connect为长连接;多线程发送时,加入延时,目的是消息发送成功,再发下一条,避免并发;该方法影响多线程效率;
virtual uint16_t onNegotiate(AMQP::TcpConnection *connection, uint16_t interval) override
{
interval = 0;//秒
cout<<"心跳周期:"<<interval<<endl;
return interval;//禁用心跳
}
sleep(1);
方法2:心跳设置为0,即设置connect为长连接;发送消息的线程加锁;
std::lock_guard<std::mutex> lock(mtx);