1. 程式人生 > 其它 >關於SpringCloud Bus RemoteApplicationEvent 使用注意事項

關於SpringCloud Bus RemoteApplicationEvent 使用注意事項

最近使用SpringCloud Bus 用於服務直接訊息通訊,遇到一些問題,記錄下來給一樣碰到問題的你一個解決方案

開發環境 :

  • springboot 2.3.9.RELEASE
  • spring-cloud-alibaba-starters 2.2.5.RELEASE
  • rabbitmq

問題一:訊息publishEvent出去,監聽服務收不到訊息

  • 監聽服務的類沒有注入到spring容器中,未加RemoteApplicationEventScan註解掃描自定義的Event物件,配置加入以下即可

  • 訊息傳送的時候originService傳入的服務id和springcloud bus的不一致

在spring-cloud-bus包中的BusAutoConfiguration配置資訊可以看到,傳送訊息時會匹配serviceId,配置一致才傳送,而預設情況下bus會自動生成一個serviceId,如果我們傳送的時候用的是自己隨便定義的id,則無法傳送訊息。

建議在配置檔案中配置busId,然後從BusProperties類中獲取。這樣就保證了二者一致

獲取配置的bus id

  • 訊息傳送者和接收者的rabbitmq訊息序列化配置不一致

預設情況下,rabbitmq有自己的訊息序列化規則,由於我在訊息傳送服務配置過rabbitmq的序列化為json格式,但是接收服務沒有使用的預設的格式,導致訊息發出去之後,接收服務無法正確反序列化,導致訊息消費失敗。所以要麼就都不配置,要麼所有服務都配置


問題二:訊息傳送成功,監聽服務也收到訊息,但是Event的source欄位為空。

這個問題困擾了我很久,明明source欄位傳了值,但是別的服務就是拿不到,而且傳送服務自己建立監聽服務,是能拿到的。經過查詢離職發現,RemoteApplicationEvent的煩序列化的時候忽略了source,也就是說就算你傳值了,也不會處理,可能是怕使用者傳的資料大?

解決辦法,自定義Event的時候可以自定義引數進行傳值。

結果如下,是可以拿到引數的