RabbitMQ
- 流程圖
- Exchage交換機
Direct Exchange 直連交換機
發送消息到直連類型的交換機時,只有routing key跟binding key完全匹配時,綁定的隊列才能收到消息。
Topic Exchange 主題交換機
發送消息到主題類型的交換機時,routing key符合binding key的模式時,綁定的隊列才能收到消息。
Fanout Exchange 廣播交換機
當消息發送到廣播類型的交換機時,不需要指定routing key,所有與之綁定的隊列都能收到消息
- 聲明交換機
Map<String,Object> arguments = new HashMap<>();
/**
* 交換機名稱
* 設置是否持久化
* 設置是否自動刪除
* 參數
*/
new TopicExchange("交換機名稱",true,false,arguments);
- 聲明隊列
Map<String, Object> arguments = new HashMap<String, Object>();
// 指定隊列的死信交換機
arguments.put("x-dead-letter-exchange","死信交換機名稱");
// 如果設置了隊列的最大長度,超過長度時,先入隊的消息會被髮送到DLX
arguments.put("x-max-length", 4);
//通過隊列屬性設置消息過期時間
arguments.put("x-message-ttl",7000);
//聲明隊列的優先級
arguments.put("x-max-priority",10);
/**
* 隊列名稱
* 設置是否持久化
* 設置是否排他(排他性隊列只能在聲明它的Connection中使用,連接斷開時自動刪除)
* 設置是否自動刪除
* 參數
*/
Queue queue = new Queue("隊列名稱", false, false, true, arguments);
- 聲明綁定關係
// 聲明一個隊列跟一個topicExchange交換機的綁定
@Bean
public Binding bindFirst(@Qualifier("隊列名") Queue queue, @Qualifier("交換機名") TopicExchange exchange){
//#用於匹配多規格單詞(可以是零個),*用於匹配一個單詞
return BindingBuilder.bind(queue).to(exchange).with("#.etoak.*");
}
- 生產者
//發送消息
/**
* 交換機名稱
* 路由鍵
* 消息體
* 參數
*/
amqpTemplate.convertAndSend("交換機名稱","路由鍵",message,processor);
//消息屬性配置
MessagePostProcessor processor = new MessagePostProcessor(){
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("10000" );//10秒後超時
message.getMessageProperties().setPriority(1);// 優先級,默認爲5,配合隊列的 x-max-priority 屬性使用
message.getMessageProperties().setContentType("UTF-8");// 編碼
message.getMessageProperties().setMessageId(String.valueOf(UUID.randomUUID()));
return message;
}
};
- 消費者
@RabbitHandler
@RabbitListener(queues = "隊列名")
public void getMessage(Message message, Channel channel){
log.info("消息爲"+new String (message.getBody()));
}