這個類很是的強大,咱們能夠對他進行不少的設置,用對於消費者的配置項,這個類均可以知足。它有監聽單個或多個隊列、自動啓動、自動聲明功能。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 看日誌,綁定的三個隊列都能被消費