目錄
1、聲明隊列和交換機
方法一:基于@Bean的方式聲明
方法二:基于Spring注解的方式聲明
2、消息轉換器
1、聲明隊列和交換機
方法一:基于@Bean的方式聲明
注:隊列和交換機的聲明是放在消費者這邊的,這位發送的人他并不需要去關注發送給那個隊列,但消費者這邊是需要隊列自己清楚應該監聽那個交換機,監聽那個類型的消息的~
上述的方式還是很繁瑣的
方法二:基于Spring注解的方式聲明
Direct模式:
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){System.out.println("消費者1接收到direct.queue1的消息:【" + msg + "】");
}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),key = {"red", "yellow"}
))
public void listenDirectQueue2(String msg){System.out.println("消費者2接收到direct.queue2的消息:【" + msg + "】");
}
Topic模式:
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue1"),exchange = @Exchange(name = "hmall.topic", type = ExchangeTypes.TOPIC),key = "china.#"
))
public void listenTopicQueue1(String msg){System.out.println("消費者1接收到topic.queue1的消息:【" + msg + "】");
}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue2"),exchange = @Exchange(name = "hmall.topic", type = ExchangeTypes.TOPIC),key = "#.news"
))
public void listenTopicQueue2(String msg){System.out.println("消費者2接收到topic.queue2的消息:【" + msg + "】");
}
2、消息轉換器
? ? ? ? Spring的消息發送,代碼接收的消息體是一個Object,在數據傳輸時,它會把你發送的消息序列化為字節發送給MQ,接收消息的時候,還會把字節反序列化為Java對象~
? ? ? ? 默認情況下,Spring采用的序列化方式是JDK序列化,而JDK序列化是存在諸多問題的,例如:
- 數據體積過大
- 有安全漏洞
- 可讀性差
為了解決以上問題,我們可以使用JSON轉換器~
具體操作:
項目中引入依賴:
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.10</version>
</dependency>
配置消息轉換器:
在publisher和consumer服務的啟動類中添加即可:
@Bean
public MessageConverter messageConverter(){// 1.定義消息轉換器Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();// 2.配置自動創建消息id,用于識別不同消息,也可以在業務中基于ID判斷是否是重復消息jackson2JsonMessageConverter.setCreateMessageIds(true);return jackson2JsonMessageConverter;
}