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監聽的隊列。