接着前一天的调试,断点来到AggregateLifecycle的execute方法:
此处并未直接执行task,而是继续调用AggregateLifecycle的executeWithResult方法:
同之前的调用,此处依然取不到AggregateLifecycle的实例,直接装载其this(子类EventSourcedAggregate实例),返回task的调用:task.run(),进入到原始execute传入的lambda表达式:
设置applying标志,将delayedTasks中task拿出来运行:
task是之前AnnotatedAggregate的doApply方法中添加的publish回调,发布event前先处理参数,将evet包装成eventMessage:
包装细节不提,包装结果如下:
包装完毕,进入EventSourcedAggregate的publish方法:
此处先判断msg是否是domain的事件消息,是的话要获取上一个事件的序列号(默认-1),因为是第一次发布event,所以上一个事件序列号为0。接着是snapshotTrigger的eventHandled,此demo不涉及snapshot操作,snapshotTrigger是NoSnapshotTrigger,eventHandled是空方法,接着调用父类AnnotatedAggregate的publish方法:
inspector是第三天调试时的EventSourcedAggregate初始化时注入的,作用是描述描述聚合类结构的监视器,进入ModelInspector的publish中一睹究竟:
runtimeModelOf(target)大致内容是根据所给的target类型,创建一个相应的inspector,之后调用ModelInspector的doPublish方法:
此处先获取EventMessage的handler,然后调用ifPresent方法:
如果传入的EventMessage不为空,直接调用传入的lambda表达式即调用handler处理EventMessage:
这里跟之前CommandMessage的处理差不多,判断是构造器handler后解析message,进入handle方法:
handle方法只是给ProductAggregate赋值,完毕后返回到ModelInspector的doPublish方法:
依次调用ProductAggregate的子类定义的eventhandler,此处没有子类,跳过,一路返回,回到AnnotatedAggregate的publish方法:
进入EventSourcedAggregate的publishOnEventBus方法:
接下来会进入到发布事件到查询端同步命令端与查询端数据的环节,先暂停,明天继续。