axon-事件处理

Event Handling

Event listeners组件主要是将接收到的事件进行处理。他们通常是根据命令模型来做具体的业务逻辑处理。通常涉及更新视图模型或将更新转发给其他组件,如第三方集成。在某些情况下,Event Handlers会根据事件的(模式)而自己发出事件,甚至发送命令来触发进一步的更改。

定义Event Handlers

在Axon中,一个对象可以用@EventHandler注解来声明多个Event Handler方法。方法的声明参数定义了它将接收什么样的事件。
Axon提供以下参数类型的开箱即用支持:

  1. 第一个参数总是事件消息的payload 。在 Event Handlers不需要访问消息的payload的情况下,您可以在@EventHandler注解中指定你所期望的payload类型。指定时,使用下面指定的规则来解析第一个参数。如果您希望将payload作为参数传递,请不要在注解中配置payload类型。
  2. 用@MetaDataValue注解的参数,将用注解上的键对元数据值进行解析。如果这个值是false(默认),则当元数据值不存在时会传递null。如果值是true,而元数据值不存时,这时解析器会发现错误,并阻止该方法的调用。
  3. 参数为MetaData的话,那么将注入一个EventMessage的整个MetaData
  4. 使用@Timestamp注解并且类型为java.time.Instant(或java.time.temporal.Temporal)的参数将解析为EventMessage的时间戳。这是事件产生的时间。
  5. 用@SequenceNumber和类型java.lang.Long或long注解的参数将解析为DomainEventMessage的sequenceNumber。这提供了事件生成的顺序(在同一聚合范围内的生成顺序)。
  6. Message类型的参数将会被整个EventMessage所注入(如果消息可分配给该参数),如果第一个参数直接是一个Message类型,则它会匹配任何类型的事件,即使泛型参数可以提供帮助选择,但是由于类型的擦除,axon也不能检测出预期的参数。在这种情况下,最好声明有payload的参数,然后是Message类型的参数。
    7.当使用Spring且Axon配置被激活时(通过包含Axon Spring Boot Starter模块,或者在@Configuration文件中指定@EnableAxon),如果当前的上下文中只有一个可入被spring注入的,那么任何其他参数都将被解析到autowired注入进来的bean上。这使您可以将资源直接注入到@EventHandler注解的方法中。

您可以通过实现ParameterResolverFactory接口并创建一个名为/META-INF/service/org.axonframework.common.annotation.ParameterResolverFactory的文件来配置其他ParameterResolver,该文件包含实现类的全名。详情请 参考Advanced Customizations 。

在所有情况下,每个event handler实例最多调用一个事件处理程序方法。 Axon将使用以下规则搜索最匹配的调用方法:

  1. 在类层次结构(注:类的继承关系)的实际实例层次(由this.getClass()返回)中,将评估所有注解的方法
    2.如果找到一个或多个方法可以将所有参数解析为一个值,则选择并调用最匹配(注:像java的多继承接口同时继承一个类的同一个方法调用冲突,也就是子接口或者实现优先)的类型的方法
    3.如果在这个级别的类层次结构中没有找到方法,那么超类的评估方法是相同的
    4.当达到类层次结构的顶层时,还没有找到合适的事件处理程序,该事件就被忽略掉。
    // 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的处理器方法将被调用EventB及EventC的所有实例(因为它扩展了EventB)。换句话说,TopListener的处理程序方法根本不会收到EventC的任何调用。由于EventA不能分配给EventB(它是它的父类),所以这些将由TopListener中的处理程序方法处理。

注册Event Handler

事件处理组件是使用EventHandlingConfiguration类定义的,该类是使用全局Axon 配置器注册为模块的。通常,应用程序将定义一个EventHandlingConfiguration,但更大的模块化应用程序可能会选择为每个模块定义一个。

使用@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);
有关使用Spring AutoConfiguration注册事件处理程序的详细信息,请参阅事件处理配置。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,804评论 6 342
  • Command Model 在一个基于CQRS的应用程序中,一个领域模型(如Eric Evans和Martin F...
    water_lang阅读 1,458评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 回家的路上,她让我买了寿司。我建议她不要坐在车上吃(电动车),会被颠翻掉地上,她接受了。 一路上,紧紧地抓着袋子。...
    四只脚的团子阅读 153评论 0 0
  • 亲爱的 我是你另一个自己生活不易 且行且珍惜日子再难 也要活出泪中带笑的样子出来不卑不亢的过好自己的生活可以由衷的...
    akingm1949阅读 265评论 0 0