簡體   English   中英

Axon amqp 消息傳遞,未觸發事件處理程序

[英]Axon amqp messaging, event handler not triggered

所以我正在開發我的第一個 Axon 應用程序。 到目前為止,我讓整個軸突項目都在單體應用中工作。 之后,我開始使用 Sprint Boot 中的 @Profile 將應用程序分成幾部分。 也像魅力一樣工作。 所以我的下一步是 go 完全分布式並為我的 Axon 流程使用 2 個完全不同的 intellij 項目。 在這里我遇到了一個問題。 我使用 AMQP 進行事件消息傳遞。 使用文檔中的信息,我可以從一個服務到另一個服務獲取事件。 但是沒有觸發事件處理程序。 我想問題是因為事件的類型。 第一個服務發送如下事件: com.departureExample.Departure.coreapi.events.CheckIn.CheckedInEvent 但是我在其他項目中的事件處理程序會監聽: com.checkInService.CheckIn.Service.coreapi.events.CheckIn.CheckedInEvent 我的猜測是這就是為什么沒有觸發事件處理程序,但我不確定?

amqp 的所有其他配置均已正確設置,我還將 ampqmessagesource 連接到我的 processingroup。

所以我的問題是,是否有可能因為 checkedInEvent 有 2 個不同的路徑而沒有觸發事件處理程序? 如果是這樣,我該如何解決這個問題?

你的假設確實是正確的。 EventHandler 的有效負載類型與發出的事件不匹配。 您的 EventHandler 方法注冊它可以處理com.departureExample.Departure.coreapi.events.CheckIn.CheckedInEvent類型的事件。 但是,通過 rabbit 發送的事件的類型是com.departureExample.Departure.coreapi.events.CheckIn.CheckedInEvent ,沒有注冊處理程序。

對於任何 EventHandler,(超)類都需要與正在發出的內容相匹配,其中包括 package 名稱。 一些更詳細的解釋可以在文檔中找到( https://docs.axoniq.io/reference-guide/implementing-domain-logic/event-handling/handling-events ):

在所有情況下,每個偵聽器實例最多調用一個事件處理程序方法。 Axon 將使用以下規則搜索最具體的調用方法:

  1. 在 class 層次結構的實際實例級別(由 this.getClass() 返回),評估所有帶注釋的方法

  2. 如果找到一個或多個方法,其中所有參數都可以解析為一個值,則選擇並調用具有最具體類型的方法

  3. 如果在 class 層次結構的這個級別上沒有找到方法,則以相同的方式評估超類型

  4. 當到達層次結構的頂層並且沒有找到合適的事件處理程序時,將忽略該事件。

我的建議是使用發出事件的服務的完全限定名稱,在您的情況下是com.departureExample.Departure.coreapi.events.CheckIn.CheckedInEvent 即使您在其中處理事件的服務位於不同的限界上下文中,您仍在處理屬於發出它的限界上下文的事件。 讓您的 package 結構反映使您的代碼更具可讀性。

@ViveTech 為您提供了解決問題的正確指示,但我想在這里補充一點。

消息(在這種情況下為事件)是應用程序之間的公共 API。 由於它是公開的,它可以/應該作為“核心 API”模塊/包在存儲庫之間共享。

將事件格式(又名實現)復制到兩個項目都可以,但是就像您已經 state 一樣,這是一個相當草率的解決方案。 共享一個專用的核心 API 模塊我會更好地為您服務。

如果您不想在共享庫中共享此“隱式模式”(也就是事件的實現),您可以調整框架中的Serializer程序以使用 class 名稱的別名。

您可以提供給XStreamSerializerXStream實例為別名提供了很好的處理,使用JacksonSerializer您必須使用ObjectMapper進行一些操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM