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;
    }
相关推荐
SuniaWang1 小时前
《Spring AI + 大模型全栈实战》学习手册系列· 专题二:《Milvus 向量数据库:从零开始搭建 RAG 系统的核心组件》
java·人工智能·分布式·后端·spring·架构·typescript
Hui Baby1 小时前
TIDB分布式数据库提交设想
数据库·分布式·tidb
⑩-2 小时前
RabbitMQ 架构和工作原理?RabbitMQ 延迟队列如何实现?
java·分布式·架构·rabbitmq
国冶机电安装2 小时前
分布式控制系统(DCS)安装:从方案设计到投运验收的完整指南
分布式
飞Link3 小时前
告别 ROS 的臃肿:用 ZeroMQ 构建极速具身智能分布式大脑(附 Python 实战)
开发语言·分布式·python
会算数的⑨4 小时前
演进——从查日志到 AI 自治,企业监控体系的变迁
人工智能·分布式·后端·微服务·云原生
一叶飘零_sweeeet4 小时前
分布式权限体系破局:统一认证授权与 OAuth2.0 全链路架构落地实战
分布式·架构
七夜zippoe5 小时前
消息队列选型:Kafka vs RabbitMQ vs Redis 深度对比
redis·python·kafka·消息队列·rabbitmq
014-code5 小时前
Dubbo 之 “最速传说”
java·分布式·dubbo
LF3_6 小时前
监听数据库binlog日志变化,将变动实时发送到kafka
数据库·分布式·mysql·kafka·binlog·debezium