Spring AMQP:RabbitTemplate SimpleMessageListenerContainer

一.RabbitTemplate介绍

RabbitTemplate:消息模板,在与Spring AMQP整合时,进行发送消息的关键类。

包括了可靠性投递消息方法、回调监听消息接口ConfirmCallBack、返回值确认接口ReturnCallBack等,同样需要进行注入到ioc容器中。

与spring整合需要实例化,与spring boot整合只需要在配置文件中配置就好了

相关配置

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
        return new RabbitTemplate(connectionFactory);
    }

测试

发送消息

    @Test
    public void testSend1(){
        rabbitTemplate.convertAndSend("amqp.bean.topic", "amqp.send","hello spring");
    }

结果:

 测试2:

    @Test
    public void testSend(){
        //创建消息
        MessageProperties properties = new MessageProperties();
        properties.getHeaders().put("send.amqp","测试发送信息");
        Message message = new Message("hello spring amqp".getBytes(), properties);

        //发送
        rabbitTemplate.convertAndSend("amqp.bean.topic", "amqp.send", message, message1 -> {
            System.out.println("添加额外的设置");
            message1.getMessageProperties().getHeaders().put("extra","额外信息");
            return message1;
        });
    }

 测试结果:

二.SimpleMessageListenerContainer介绍

 简单消息容器,对于消费者的配置项,这个类可以满足

监听多个队列、自动启动、自动声明,事务设置,设置消费者属性,批量消费、设置消息确认和自动确认模式、重回队列,异常捕获handler函数,消费者标签生成测虐,多占模式,设置监听器、转换器。

SimpleMessageListenerContainer可以进行动态设置,在运行的应用中动态修改其消费者数量的大小、接收消息模式等

配置:

    @Bean
    public SimpleMessageListenerContainer simpleMessageListenerContainer(ConnectionFactory connectionFactory){
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
        //设置监听的队列
        container.setQueues(queue());
        //设置当前消费者数量
        container.setConcurrentConsumers(1);
        container.setMaxConcurrentConsumers(5);
        //重回队列
        container.setDefaultRequeueRejected(false);
        //签收机制
        container.setAcknowledgeMode(AcknowledgeMode.AUTO);
        //消费端标签策略
        container.setConsumerTagStrategy(queue-> queue+"_"+ UUID.randomUUID().toString());
        //消息监听
        container.setMessageListener((ChannelAwareMessageListener) (message, channel) -> System.out.println(new String(message.getBody())));
        return container;
    }

运行springboot主应用,

可以看到在rabbitmq的控制台中,有Container监听的队列。