axon-事件處理

Event Handling

Event listeners組件主要是將接收到的事件進(jìn)行處理。他們通常是根據(jù)命令模型來做具體的業(yè)務(wù)邏輯處理。通常涉及更新視圖模型或?qū)⒏罗D(zhuǎn)發(fā)給其他組件箱蝠,如第三方集成。在某些情況下沙兰,Event Handlers會根據(jù)事件的(模式)而自己發(fā)出事件涮毫,甚至發(fā)送命令來觸發(fā)進(jìn)一步的更改。

定義Event Handlers

在Axon中呢铆,一個對象可以用@EventHandler注解來聲明多個Event Handler方法晦鞋。方法的聲明參數(shù)定義了它將接收什么樣的事件。
Axon提供以下參數(shù)類型的開箱即用支持:

  1. 第一個參數(shù)總是事件消息的payload 棺克。在 Event Handlers不需要訪問消息的payload的情況下悠垛,您可以在@EventHandler注解中指定你所期望的payload類型。指定時逆航,使用下面指定的規(guī)則來解析第一個參數(shù)鼎文。如果您希望將payload作為參數(shù)傳遞渔肩,請不要在注解中配置payload類型因俐。
  2. 用@MetaDataValue注解的參數(shù),將用注解上的鍵對元數(shù)據(jù)值進(jìn)行解析周偎。如果這個值是false(默認(rèn))抹剩,則當(dāng)元數(shù)據(jù)值不存在時會傳遞null。如果值是true蓉坎,而元數(shù)據(jù)值不存時澳眷,這時解析器會發(fā)現(xiàn)錯誤,并阻止該方法的調(diào)用蛉艾。
  3. 參數(shù)為MetaData的話钳踊,那么將注入一個EventMessage的整個MetaData
  4. 使用@Timestamp注解并且類型為java.time.Instant(或java.time.temporal.Temporal)的參數(shù)將解析為EventMessage的時間戳。這是事件產(chǎn)生的時間勿侯。
  5. 用@SequenceNumber和類型java.lang.Long或long注解的參數(shù)將解析為DomainEventMessage的sequenceNumber拓瞪。這提供了事件生成的順序(在同一聚合范圍內(nèi)的生成順序)。
  6. Message類型的參數(shù)將會被整個EventMessage所注入(如果消息可分配給該參數(shù))助琐,如果第一個參數(shù)直接是一個Message類型祭埂,則它會匹配任何類型的事件,即使泛型參數(shù)可以提供幫助選擇兵钮,但是由于類型的擦除蛆橡,axon也不能檢測出預(yù)期的參數(shù)。在這種情況下掘譬,最好聲明有payload的參數(shù)泰演,然后是Message類型的參數(shù)。
    7.當(dāng)使用Spring且Axon配置被激活時(通過包含Axon Spring Boot Starter模塊葱轩,或者在@Configuration文件中指定@EnableAxon)粥血,如果當(dāng)前的上下文中只有一個可入被spring注入的柏锄,那么任何其他參數(shù)都將被解析到autowired注入進(jìn)來的bean上。這使您可以將資源直接注入到@EventHandler注解的方法中复亏。

您可以通過實(shí)現(xiàn)ParameterResolverFactory接口并創(chuàng)建一個名為/META-INF/service/org.axonframework.common.annotation.ParameterResolverFactory的文件來配置其他ParameterResolver趾娃,該文件包含實(shí)現(xiàn)類的全名。詳情請 參考Advanced Customizations 缔御。

在所有情況下抬闷,每個event handler實(shí)例最多調(diào)用一個事件處理程序方法。 Axon將使用以下規(guī)則搜索最匹配的調(diào)用方法:

  1. 在類層次結(jié)構(gòu)(注:類的繼承關(guān)系)的實(shí)際實(shí)例層次(由this.getClass()返回)中耕突,將評估所有注解的方法
    2.如果找到一個或多個方法可以將所有參數(shù)解析為一個值笤成,則選擇并調(diào)用最匹配(注:像java的多繼承接口同時繼承一個類的同一個方法調(diào)用沖突,也就是子接口或者實(shí)現(xiàn)優(yōu)先)的類型的方法
    3.如果在這個級別的類層次結(jié)構(gòu)中沒有找到方法,那么超類的評估方法是相同的
    4.當(dāng)達(dá)到類層次結(jié)構(gòu)的頂層時眷茁,還沒有找到合適的事件處理程序炕泳,該事件就被忽略掉。
    // assume EventB extends EventA // and EventC extends EventB// and a single instance of SubListener is registered
    public class TopListener {
@EventHandler
public void handle(EventA event) {
}

@EventHandler
public void handle(EventC event) {
}

}
public class SubListener extends TopListener {

@EventHandler
public void handle(EventB event) {
}

}
在上面的例子中上祈,SubListener的處理器方法將被調(diào)用EventB及EventC的所有實(shí)例(因?yàn)樗鼣U(kuò)展了EventB)培遵。換句話說,TopListener的處理程序方法根本不會收到EventC的任何調(diào)用登刺。由于EventA不能分配給EventB(它是它的父類)籽腕,所以這些將由TopListener中的處理程序方法處理。

注冊Event Handler

事件處理組件是使用EventHandlingConfiguration類定義的纸俭,該類是使用全局Axon 配置器注冊為模塊的皇耗。通常,應(yīng)用程序?qū)⒍x一個EventHandlingConfiguration揍很,但更大的模塊化應(yīng)用程序可能會選擇為每個模塊定義一個郎楼。

使用@EventHandler方法注冊對象,請使用EventHandlingConfiguration上的registerEventHandler方法:
// define an EventHandlingConfiguration
EventHandlingConfiguration ehConfiguration = new EventHandlingConfiguration()
.registerEventHandler(conf -> new MyEventHandlerClass());
// the module needs to be registered with the Axon Configuration
Configurer axonConfigurer = DefaultConfigurer.defaultConfiguration()
.registerModule(ehConfiguration);
有關(guān)使用Spring AutoConfiguration注冊事件處理程序的詳細(xì)信息窒悔,請參閱事件處理配置呜袁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛉迹,隨后出現(xiàn)的幾起案子傅寡,更是在濱河造成了極大的恐慌,老刑警劉巖北救,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荐操,死亡現(xiàn)場離奇詭異,居然都是意外死亡珍策,警方通過查閱死者的電腦和手機(jī)托启,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攘宙,“玉大人屯耸,你說我怎么就攤上這事拐迁。” “怎么了疗绣?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵线召,是天一觀的道長。 經(jīng)常有香客問我多矮,道長缓淹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任塔逃,我火速辦了婚禮讯壶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湾盗。我一直安慰自己伏蚊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布格粪。 她就那樣靜靜地躺著躏吊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匀借。 梳的紋絲不亂的頭發(fā)上颜阐,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天平窘,我揣著相機(jī)與錄音吓肋,去河邊找鬼。 笑死瑰艘,一個胖子當(dāng)著我的面吹牛是鬼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播紫新,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼均蜜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芒率?” 一聲冷哼從身側(cè)響起囤耳,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎偶芍,沒想到半個月后充择,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匪蟀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年椎麦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片材彪。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡观挎,死狀恐怖琴儿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘁捷,我是刑警寧澤造成,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雄嚣,受9級特大地震影響谜疤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜现诀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一夷磕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仔沿,春花似錦坐桩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至成福,卻和暖如春碾局,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奴艾。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工净当, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕴潦。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓像啼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親潭苞。 傳聞我的和親對象是個殘疾皇子忽冻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,823評論 6 342
  • Command Model 在一個基于CQRS的應(yīng)用程序中,一個領(lǐng)域模型(如Eric Evans和Martin F...
    water_lang閱讀 1,487評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理此疹,服務(wù)發(fā)現(xiàn)僧诚,斷路器,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • 回家的路上蝗碎,她讓我買了壽司湖笨。我建議她不要坐在車上吃(電動車),會被顛翻掉地上衍菱,她接受了赶么。 一路上,緊緊地抓著袋子脊串。...
    四只腳的團(tuán)子閱讀 154評論 0 0
  • 親愛的 我是你另一個自己生活不易 且行且珍惜日子再難 也要活出淚中帶笑的樣子出來不卑不亢的過好自己的生活可以由衷的...
    akingm1949閱讀 267評論 0 0