springboot2.x +rabbitmq使用和源码分析四(消费者-Listener使用)

本文详细介绍了在SpringBoot2.x中使用RabbitMQ的消费者,重点分析了SimpleRabbitListenerContainerFactory和DirectRabbitListenerContainerFactoryConfigurer两种工厂的实现方式。通过源码解析和实例演示,展示了不同工厂在消费者并发处理、通道使用以及死信队列等方面的特点和区别。
摘要由CSDN通过智能技术生成

序言:

当数据通过生产者产生到发送到exchange交换器,再通过设定的路由规则,经过routingKey,最终会落地到queue 中。这个时候引出了Listener消费者了。在第一章中有对RabbitAnnotationDrivenConfiguration该类中源码做过基本分析,该类最大的作用就是通过配置文件的设定用于构建RabbitListenerContainerFactory(该接口的实现,工厂设计模式用以创建核心的MessageListenerContainer

容器类,而该类MessageListenerContainer用以管理MessageListener,最终实现的该接口类操作Connection最终来消费数据)

对于spring提供了两种工厂实现,SimpleRabbitListenerContainerFactory与DirectRabbitListenerContainerFactoryConfigurer,

1:SimpleRabbitListenerContainerFactory(SMLC)

用于构建SimpleMessageListenerContainer在章节一中也描述了该模式下,rabbitmq的消费模式,该监听容器通过客户端多线程来并行的处理消息,通过上述的配置设置并行度。也可以监控多个队列并在运行时对队列进行增删。系统通过 concurrentConsumers、maxConcurrentConsumers 灵活设定当前容器中消费者的数量,不论监控多少个队列,channel与当前线程都会一一对应(这也是为何命令为Simple的因素),即使用同一consumer线程来会处理所有的队列。即这里我们先使用该模式来进行消费。

1.1:通过Factory构建SimpleMessageListenerContainer

当设置完成,我们如果在应用中创建SimpleMessageListenerContainer,来监听queue呢。spring也提供了两种方式

yml配置:

listener:
      type: simple
      simple:
        ##这里使用none后续对此进行详细描述
        acknowledge-mode: none
        auto-startup: true
        ##设置消费并行度
        concurrency: 2
        ##设置最大并行度
        max-concurrency: 2
        ##设置一个批次最大拉取数量
        batch-size: 3
        ##不开启重试 避免重复消费
        retry:
          enabled: false
        ## 每个消费者可能未完成的未确认消息的最大数量
        #prefetch:
        ## 若容器中声明的的queue不存在了(queue在代理上不可用或在运行时被删除了) 是否需要停止对应容器默认true
        missing-queues-fatal: true
        ## 默认情况下,拒绝交付是否重新排队
        default-requeue-rejected: true
        # 应该多久发布一次空闲容器事件 可用于监控
        idle-event-interval: 10000

1.1.1: MessageListener

单条消费,可以通过配置开启自动ack或不开启ack


    @Autowired
    private SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory;


    //单条消费
    @Bean
    public MessageListenerContainer simpleMessageListenerContainer(){

        SimpleMessageListenerContainer listenerContainer = simpleRabbitListenerContainerFactory.createListenerContainer();

        //设置被监控的queue
        listenerContainer.setQueueNames(CommonConstant.queue_direct1,CommonConstant.queue_direct2);

        //等待消息到达超时时间默认1s
        listenerContainer.setReceiveTimeout(1000);
        //手动确认
        listenerContainer.setAcknowledgeMode(AcknowledgeMode.NONE);
        //默认10s
        listenerContainer.setStartConsumerMinInterval(10*1000);
        //默认60s
        listenerContainer.setStopConsumerMinInterval(60*1000);
        //设置消费者唯一标记 基于queue设置
        listenerContainer.setConsumerTagStrategy(queue -> {
            return queue+"_"+ UUID.randomUUID().toString();
        });

        listenerContainer.setMessageListener(message->{
            //获取数据
            byte[] body = message.getBody();
            String str = new String(body);

            Thread thread=Thread.currentThread();
            log.info("message:{}  ThreadId is:{}  ConsumerTag:{}  Queue:{}"
                    ,str,thread.getId(),message.getMessageProperties().getConsumerTag(),message.getMessageProperties().getConsumerQueue());

        });

        return listenerContainer;

    }

 上述设置了2个并行情况,有两个线程(consumer)并行消费

 

1.1.2: ChannelAwareMessageListener

包含channel与message可以进行手动ack确定

    @Autowired
    private SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory;

    @Bean
    public MessageListenerContainer simpleChannelMessageListenerContainer(){

        SimpleMessageListenerContainer listenerContainer = simpleRabbitListenerContainerFactory.createListenerContainer();

        //设置被监控的queue
        listenerContainer.setQueueNames(CommonConstant.queue_direct1,CommonConstant.queue_direct2);

        //等待消息到达超时时间默认1s
        listenerContainer.setReceiveTimeout(1000);
        //手动确认
        listenerContainer.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        //默认10s
        listen
要构建一个基于上述技术栈的应用程序,涉及多个组件和技术,下面是一些关键点的简介: 1. **Spring Boot**: 是一个快速开发框架,简化了Java应用的配置和启动过程。 - 示例:用于创建简单的RESTful API服务[^4]。 2. **Spring Cloud**: 提供了一组工具和服务来扩展微服务架构。 - 功能包括服务发现、配置中心、API网关等[^5]。 3. **RabbitMQ**: 消息队列服务,支持异步通信和解耦。 - 在Spring Cloud中集成,可以用来实现消息驱动架构[^6]。 4. **Redis**: 缓存数据库,提高应用程序性能。 - 可以缓存热点数据或会话信息[^7]。 5. **Elasticsearch**: 分布式搜索和分析引擎,常用于全文检索。 - 支持复杂查询和实时数据分析[^8]。 6. **Xxl-sso**: 企业级权限管理系统,用于身份验证和授权[^9]。 7. **LCN**: 可能指的是Linux容器网络,Docker的基础组件。 - 管理容器间的网络连接[^10]。 8. **Nginx**: 反向代理服务器,优化HTTP请求和负载均衡。 - 与Spring Boot结合时,可能作为API Gateway[^11]。 9. **七牛云**: 对象存储服务,用于文件上传和管理。 - 存储静态资源[^12]。 10. **Swagger2**: 开源API文档生成工具。 - 用于自动生成API文档[^13]。 11. **MySQL**: 关系型数据库,存储业务数据。 - 数据持久化[^14]。 12. **Maven**: 项目管理和依赖管理工具。 - 用于构建和打包项目[^15]。 13. **GitLab**: 代码版本控制系统,用于版本控制和协作开发。 - 版本控制和CI/CD[^16]。 14. **Docker**: 虚拟化平台,便于部署和运行应用。 - 快速构建可移植的环境[^10]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值