RabbitMQ简单消息监听和确认

如何监听RabbitMQ队列

简单代码实现RabbitMQ消息监听

需要的依赖

xml 复制代码
        <!--rabbitmq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>x.x.x</version>
        </dependency>

消息监听示例

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Slf4j
@Configuration
public class RabbitMQConfig {

    private String addresses = "localhost:5672";
    private String username = "xxx";
    private String password = "xxx";

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setAddresses(this.addresses);
        connectionFactory.setUsername(this.username);
        connectionFactory.setPassword(this.password);
        return connectionFactory;
    }

    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames("queue1", "queue2");//要监听的队列名称
        // 设置消息监听器
        container.setMessageListener((message) -> {
            log.info("Received message: " + new String(message.getBody()));
        });
        return container;
    }

}

手动ACK

前面的示例是默认的自动ACK,自动确认消息投递成功。但是业务场景需要执行成功后,才确认这条消息被消费,此时我们需要设置手动ACK,只有当执行成功,才确认这条消息被消费。

java 复制代码
@Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames("queue1", "queue2");//要监听的队列名称
        // 设置消息监听器
        container.setAcknowledgeMode(AcknowledgeMode.MANUAL);//手动ACK,不设置默认是AUTO
        container.setMessageListener(messageListener());
        return container;
    }

    @Bean
    public ChannelAwareMessageListener messageListener() {
        return (message, channel) -> {
            try {
                String msg = new String(message.getBody());
                log.info("Received: " + msg);

                // 业务逻辑处理
                boolean success = processMessage(msg);
                if (success) {
                    // 处理成功,手动ACK
                    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
                } else {
                    // 处理失败,手动NACK(不重新入队)
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
                }
            } catch (Exception e) {
                // 异常情况,NACK并重新入队(可选)
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
            }
        };
    }

    /**
     * 处理消息
     * @param msg
     * @return
     * @throws Exception
     */
    private boolean processMessage(String msg) throws Exception {
        boolean success = false;
        int i = RandomUtil.randomInt();
        if (i % 3 == 0) {
            success = true;
        } else if (i % 3 == 1) {
            success = false; //模拟失败
        } else {
            log.error("处理消息:" + msg + ", 模拟发生故障");
            throw new Exception("模拟发生故障");//模拟异常
        }
        log.info("处理消息:" + msg + ", flag:" + success);
        return success;
    }
相关推荐
这个DBA有点耶3 小时前
2026年分布式数据库有哪些主流选择?先评估这5个维度再决定
数据库·分布式·dba
pnoker1 天前
IoT DC3 消息总线:六适配器可插拔设计
物联网·架构·kafka·消息队列·rabbitmq
Lost of 程序猿1 天前
ASP.NET Core Saga 分布式事务深度实战:备件采购跨服务长流程,如何保证“要么全成,要么全回“
分布式·后端·asp.net
XiYang-DING1 天前
地图城市缓存优化:ApplicationReadyEvent + Caffeine + Redis + Redisson 分布式锁
redis·分布式·缓存
2601_962175661 天前
RabbitMQ 的工作模式
分布式·rabbitmq
头茬韭菜2 天前
图解 Fluss(四):分布式协调 —— 选举、副本状态机与
分布式·fluss
2601_960906722 天前
1X发布自己的世界模型1XWM
mysql·mongodb·rabbitmq·memcached
2601_962218612 天前
万象生鲜系统全链路溯源一码查询技术实现食材来源可查
分布式·微服务·云原生·架构
Dreams_l2 天前
RabbitMQ介绍及其工作模式
分布式·rabbitmq
2601_962218612 天前
万象生鲜系统大数据采购预测算法降低库存积压稳居第一
分布式·微服务·云原生·架构