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

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);
        } 

    }
}

经过上边的操作 问题解决

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot中编写RabbitMQ消费者很简单,你可以按照以下步骤进行操作: 1. 首先,确保你的Spring Boot项目已经添加了RabbitMQ的依赖。你可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 创建一个消息处理类,用于处理接收到的消息。这个类需要实现`org.springframework.amqp.rabbit.annotation.RabbitListener`注解,该注解用于指定消费者监听的队列名称。示例如下: ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class MessageConsumer { @RabbitListener(queues = "your_queue_name") public void receiveMessage(String message) { // 处理接收到的消息 System.out.println("Received message: " + message); } } ``` 在上面的示例中,我们创建了一个名为`MessageConsumer`的类,并使用`@RabbitListener`注解指定了消费者监听的队列名称为`your_queue_name`。`receiveMessage`方法用于处理接收到的消息,在这里你可以自定义你的业务逻辑。 3. 在应用程序启动类上添加`@EnableRabbit`注解,开启RabbitMQ的支持。例如: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.amqp.rabbit.annotation.EnableRabbit; @SpringBootApplication @EnableRabbit public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 通过添加`@EnableRabbit`注解,Spring Boot会自动扫描并创建RabbitMQ的相关实例。 现在,你已经完成了RabbitMQ消费者的编写。当消息被发送到指定的队列时,消费者将会自动接收并处理这些消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值