https://blog.csdn.net/weixin_43343423/article/details/103382661
添加 @RabbitListener 注解來指定某方法作為消息消費的方法,例如監聽某 Queue 里面的消息
MessageConvert
涉及網絡傳輸的應用序列化不可避免,發送端以某種規則將消息轉成 byte 數組進行發送,接收端則以約定的規則進行 byte[] 數組的解析
RabbitMQ 的序列化是指 Message 的 body 屬性,即我們真正需要傳輸的內容,RabbitMQ 抽象出一個 MessageConvert 接口處理消息的序列化,其實現有 SimpleMessageConverter(默認)、Jackson2JsonMessageConverter 等
當調用了 convertAndSend 方法時會使用 MessageConvert 進行消息的序列化
SimpleMessageConverter 對於要發送的消息體 body 為 byte[] 時不進行處理,如果是 String 則轉成字節數組,如果是 Java 對象,則使用 jdk 序列化將消息轉成字節數組,轉出來的結果較大,含class類名,類相應方法等信息。因此性能較差
當使用 RabbitMQ 作為中間件時,數據量比較大,此時就要考慮使用類似 Jackson2JsonMessageConverter 等序列化形式以此提高性能
@RabbitListener 用法
使用 @RabbitListener 注解標記方法,當監聽到隊列 debug 中有消息時則會進行接收並處理
@RabbitListener(queues = "debug") public void processMessage1(Message bytes) { System.out.println(new String(bytes)); }
@Payload 與 @Headers
使用 @Payload 和 @Headers 注解可以消息中的 body 與 headers 信息
@RabbitListener(queues = "debug") public void processMessage1(@Payload String body, @Headers Map<String,Object> headers) { System.out.println("body:"+body); System.out.println("Headers:"+headers); }
也可以獲取單個 Header 屬性
@RabbitListener(queues = "debug") public void processMessage1(@Payload String body, @Header String token) { System.out.println("body:"+body); System.out.println("token:"+token); }
通過 @RabbitListener 注解聲明 Binding
通過 @RabbitListener 的 bindings 屬性聲明 Binding(若 RabbitMQ 中不存在該綁定所需要的 Queue、Exchange、RouteKey 則自動創建,若存在則拋出異常)
@RabbitListener(bindings = @QueueBinding( exchange = @Exchange(value = "topic.exchange",durable = "true",type = "topic"), value = @Queue(value = "consumer_queue",durable = "true"), key = "key.#" )) public void processMessage1(Message message) { System.out.println(message); }
@RabbitListener 和 @RabbitHandler 搭配使用
@RabbitListener 可以標注在類上面,需配合 @RabbitHandler 注解一起使用
@RabbitListener 標注在類上面表示當有收到消息的時候,就交給 @RabbitHandler 的方法處理,具體使用哪個方法處理,根據 MessageConverter 轉換后的參數類型
@Component @RabbitListener(queues = "consumer_queue") public class Receiver { @RabbitHandler public void processMessage1(String message) { System.out.println(message); } @RabbitHandler public void processMessage2(byte[] message) { System.out.println(new String(message)); } }