SpringAMQP 消息容器 - SimpleMessageListenerContainer

SimpleMessageListenerContainer 即簡單消息監聽容器。

  • 這個類很是的強大,咱們能夠對他進行不少的設置,用對於消費者的配置項,這個類均可以知足。它有監聽單個或多個隊列、自動啓動、自動聲明功能。git

  • 它能夠設置事務特性、事務管理器、事務屬性、事務併發、是否開啓事務、回滾消息等。可是咱們在實際生產中,不多使用事務,基本都是採用補償機制。github

  • 它能夠設置消費者數量、最小最大數量、批量消費。spring

  • 它能夠設置消息確認和自動確認模式、是否重回隊列、異常捕獲 Handler 函數。後端

  • 它能夠設置消費者標籤生成策略、是否獨佔模式、消費者屬性等。api

  • 它還能夠設置具體的監聽器、消息轉換器等等。bash

    注意: SimpleMessageListenerContainer 能夠進行動態設置,好比在運行中的應用能夠動態的修改其消費者數量的大小、接收消息的模式等。併發

不少基於 rabbitMQ 的自制定化後端管控臺在進行設置的時候,也是根據這一去實現的。因此能夠看出 SpringAMQP 很是的強大。dom

代碼示例:

代碼地址:  https://github.com/hmilyos/rabbitmqdemo.git  rabbitmq-api 項目下
複製代碼

在上一節的 SpringAMQP 之 RabbitTemplate 的 RabbitMQConfig 原有代碼的基礎上加上ide

@Bean   //connectionFactory 也是要和最上面方法名保持一致
    public SimpleMessageListenerContainer messageContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
        container.setQueues(queue001(), queue002(), queue003());    //監聽的隊列
        container.setConcurrentConsumers(1);    //當前的消費者數量
        container.setMaxConcurrentConsumers(5); //  最大的消費者數量
        container.setDefaultRequeueRejected(false); //是否重回隊列
        container.setAcknowledgeMode(AcknowledgeMode.AUTO); //簽收模式
        container.setExposeListenerChannel(true);
        container.setConsumerTagStrategy(new ConsumerTagStrategy() {    //消費端的標籤策略
            @Override
            public String createConsumerTag(String queue) {
                return queue + "_" + UUID.randomUUID().toString();
            }
        });


        container.setMessageListener(new ChannelAwareMessageListener() {
            @Override
            public void onMessage(Message message, Channel channel) throws Exception {
                String msg = new String(message.getBody());
                log.info("----------消費者: " + msg);
            }
        });
        return container;
    }
複製代碼

單元測試裏面仍是繼續使用上一次的代碼函數

@Test
    public void testSendMessage2() throws Exception {
        //1 建立消息
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType("text/plain");
        Message message = new Message("mq 消息1234 --spring.abc".getBytes(), messageProperties);

        rabbitTemplate.send("topic001", "spring.abc", message);

        rabbitTemplate.convertAndSend("topic001", "spring.amqp", "hello object message send! -spring.amqp");
        rabbitTemplate.convertAndSend("topic002", "rabbit.abc", "hello object message send! -rabbit.abc");
    }
複製代碼

運行 test 看日誌,綁定的三個隊列都能被消費

自此,SimpleMessageListenerContainer 的簡單使用就介紹完畢, container 裏面還有不少方法等着你來使用,我就不繼續介紹了。
相關文章
相關標籤/搜索