(第2天)每日源码调试之旅--实现CQRS模式的AXON框架

8 篇文章 3 订阅

接前一天的调试,调试断点来到SimpleCommandBus的doDispatch方法:

直接看新建unitOfWork实例,调用DefaultUnitOfWork(UnitOfWork的实现,用来处理单个message)的startAndGet方法:

此处先获得DefaultUnitOfWork实例,调用实例的start方法:

此处主要开启一个CurrentUnitOfWork,并设置Phase(unitOfWork的阶段)为STARTED,回到doDispatch方法:

接着开启一个事务,设置unitOfWork提交和回滚时进行事务提交和回滚的回调,下一步利用已有的unitOfWork、handlerInterceptors(组成链的拦截器List,默认只有一个 CorrelationDataInterceptor(可以注册CorrelationDataProvider的拦截器,CorrelationDataProvider用来将相关元数据从工作单元处理的消息复制到处理期间创建的新消息))和handler(支持注解那个)实例注册一个DefaultInterceptorChain(初始化默认的拦截器链以分派commandMessage,通过链到达handler)实例,最后进入到unitOfWork的executeWithResult方法:

先看该方法传入的两个参数,后一个rollbackConfiguration(定义当在处理消息过程中发生异常时是否该回滚UnitOfWork)比较简单,只是一个rollback的配置,实际值为UNCHECKED_EXCEPTIONS,指发生UNCHECKED异常时才回滚,前一个参数是一个回调方法(lambda表达式):chain::proceed:

此方法会在随后的result = task.call()中被调用,在调用前,executeWithResult先保证了UnitOfWork已处于started阶段,进入回调:逐个取出chain中的拦截器,调用其handle(unitOfWork,this)方法:

此chain中只有一个默认的CorrelationDataInterceptor拦截器,所以只进入它的handle方法,此处主要是为拦截器注册CorrelationDataInterceptor然后返回到chain::proceed,所有拦截器的handle方法调用完毕后,进入handler的handle方法,即实际的command处理过程。本demo所有的命令handler都是应用聚合类中的注解定义的,所以会进入到总的注解handler代理类AggregateAnnotationCommandHandler中进行处理:

此处先通过命令名称,获取相应的handler,再根据注解是定义在构造器上还是方法上来判断是调用构造器handler还是方法handler:

本demo是定义的构造器handler,见聚合类ProductAggregate的构造器:


先暂停,具体的handle过程,明天继续调试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值