Spring AMQP:RabbitTemplate SimpleMessageListenerContainer

秋風颯颯吹發表於2020-06-02

一.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監聽的佇列。

相關文章