您的位置:首页 > 编程语言 > Java开发

spring与RabbitMQ整合 消费者消费不到消息 重启才能消费到的问题解决

2017-02-07 09:08 2156 查看
RabbitMQ是当前一个挺火的消息队列中间件 相比ActiveMQ 消息更不容易丢失

我之前用的是ActiveMQ 后边有的时候会莫名其妙的收不到消息 项目紧后边也没时间排查 经朋友的推荐下 换了RabbitMQ 后边用着也没啥问题

今天 的RabbitMQ 突然就出了问题 生产者发送消息 消费者监听不到 消费者重启才能接收到 这样的情况肯定不行 项目上线的话要是出现这种问题影响很大的



进入RabbitMQ的监控中心 登录 在queue里边找到自己的queue 进入 在里边可以看到消息发送情况

昨天我看了一下我的queue监控 Unacked是1以上 ready是1以上 ready好像是未消费消息

网上查了一下 好像说消息未确认 但是却消费了消息 这时候消息堵塞 不知情况如何 先记录一下

<rabbit:listener-container  connection-factory="connectionFactory" acknowledge="auto">
<rabbit:listener ref="searchListenner" queues="coursequeue" response-routing-key="coursequeue"/>
</rabbit:listener-container>


查看了我的spring配置文件 我当时的acknowledge为auto 接收到消息后自动确认消息 于是就在想 是不是确认不成功了

于是乎 在网上查了手动确认的资料

1.在rabbitmq整合spring的配置文件中 把下述配置中的acknowledge改为manual

<rabbit:listener-container  connection-factory="connectionFactory" acknowledge="manual">
<rabbit:listener ref="searchListenner" queues="coursequeue" response-routing-key="coursequeue"/>
</rabbit:listener-container>


2.监听器继承ChannelAwareMessageListener 然后重写onMessage 对消息进行手动确认

@Component("searchListenner")
public class SearchListenner implements ChannelAwareMessageListener   {
@Override
public void onMessage(Message message, Channel channel) throws Exception {
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);//这个就是消息确认的语句 再往下边写自己的逻辑就好
System.out.println(message.getBody());
} catch (Throwable e) {
getLog().error(e.getMessage(), e);
}

}
}


经过上边的操作 问题解决
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: