美文网首页
【RabbitMQ-11】MQ消费端监听消息的两种方式

【RabbitMQ-11】MQ消费端监听消息的两种方式

作者: 小胖学编程 | 来源:发表于2020-11-24 18:50 被阅读0次

注解式:

【RabbitMQ-10】@RabbitListener注解生效的源码分析中,bean在初始化的时候,解析@RabbitListener注解,根据注解配置和SimpleRabbitListenerContainerFactory创建SimpleMessageListenerContainer对象。

注解式,注解配置的信息优先级高于配置文件的配置,当然也可以在代码中创建SimpleRabbitListenerContainerFactory类并放入Spring容器中。

@Bean(name = "rabbitListenerContainerFactory")
@ConditionalOnMissingBean(name = "rabbitListenerContainerFactory")
@ConditionalOnProperty(prefix = "spring.rabbitmq.listener", name = "type", havingValue = "simple", matchIfMissing = true) 
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    return factory;
}

若使用自己在代码中配置的监听工厂,那么@RabbitListener中要进行声明:

@Component
@Slf4j
public class CustomerRev {
   //声明使用的的监听器工厂(不声明使用默认的工厂)
    @RabbitListener(containerFactory = "singleListenerContainer", queues = {"kinson2"})
    public void receiver5(Message msg, Channel channel) throws IOException, InterruptedException {
        //打印数据
        String message = new String(msg.getBody(), StandardCharsets.UTF_8);
        log.info("队列消费消息{}"+message);
        channel.basicReject(msg.getMessageProperties().getDeliveryTag(), false);
    }
}

配置式:

也可以创建SimpleMessageListenerContainer类并放入到Spring容器中。在创建SimpleMessageListenerContainer时,会配置监听的队列集合监听方法

@Slf4j
@Configuration
public class RabbitConfig {
    //这种配置也可以去监听队列的消息
    @Bean
    public SimpleMessageListenerContainer messageContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer container = new MySimpleMessageListenerContainer(connectionFactory);
        //同时监听多个队列
        container.setQueues(new Queue("kinson2"));
        //设置当前的消费者数量
        container.setConcurrentConsumers(1);
        container.setMaxConcurrentConsumers(2);
        //设置是否重回队列
        container.setDefaultRequeueRejected(false);
        //设置自动签收
        container.setAcknowledgeMode(AcknowledgeMode.AUTO);
        //设置监听外露
        container.setExposeListenerChannel(true);
        //设置消息监听
        container.setMessageListener(new ChannelAwareMessageListener() {
            @Override
            public void onMessage(Message message, Channel channel) throws Exception {
                String msg = new String(message.getBody(), "utf-8");
                log.info("队列2—消费消息:" + msg);
            }
        });
        return container;
    }
}

相关文章

  • 【RabbitMQ-11】MQ消费端监听消息的两种方式

    注解式: 在【RabbitMQ-10】@RabbitListener注解生效的源码分析[https://www.j...

  • 第三面准备

    准备网络面试题 如果让你实现一个MQ,怎么样保证消息不丢失? MQ丢失数据存在两种情况,消费端丢失消息和MQ服务器...

  • 消息队列

    MQ的作用 消息通信MQ的基础功能即为消息通信。使用MQ的客户端可以将消息发送到MQ中,也可以从MQ中消费消息。 ...

  • rabbitmq保证消息可靠 消息不丢失

    三端可靠 发送方和mq保证消息送达到mq mq保证保存的消息不丢失 消费方和mq一起保证消息被成功消费 发送方和m...

  • rabbitmq保证消息可靠 消息不丢失

    三端可靠 发送方和mq保证消息送达到mq mq保证保存的消息不丢失 消费方和mq一起保证消息被成功消费 发送方和m...

  • RocketMQ消费者

    官方文档 概要 MQ中Pull和Push的两种消费方式 Push方式:由消息中间件主动地将消息推送给消费者;采用P...

  • 消息中间件push和pull模式

    一、概念 MQ的消费模式分两种:push和pull。 所谓push就是服务端主动推送消息给客户端,而pull则是客...

  • MQ消息可靠性保证----以RabbitMQ为例

    MQ的整个过程中有三处可能产生消息的丢失 生产者到MQ的链路 MQ自身宕机 MQ到消费端的链路 生产者到MQ的消息...

  • MQ消费端的幂等

    MQ消费端在接收到MQ消息之后按照业务key(uuid)进行防重,达到消费的幂等性。 业务场景 用户在使用白条优惠...

  • RocketMQ消息消费之长轮询

    RocketMQ消费端有两种获取消息的方式,Push方式和Pull方式。但这两种方式都有一定的缺陷,后来采用了一种...

网友评论

      本文标题:【RabbitMQ-11】MQ消费端监听消息的两种方式

      本文链接:https://www.haomeiwen.com/subject/vwdliktx.html