接着前一天的调试,断点来到LockingRepository的prepareForCommit方法:
此处先保证持有锁,然后进入父类AbstractRepository的prepareForCommit(用Current UnitOfWord注册handlers,用于在UnitOfWork提交后保存或删除所给的aggregate)方法:
此处添加CurrentUnitOfWork的保存或者删除操作回调,以便稍后调用,直接返回,结束两个prepareForCommit方法,回到AbstractRepository的newInstance方法:
返回得到的LockAwareAggregate实例,回到AggregateConstructorCommandHandler的handle方法,开始解析handle操作的返回结果:
此处返回AggregateAnnotationCommandHandler的resolveReturnValue方法的处理结果:
得到的是创建的聚合类的标志符,即Id,继续返回,结束handle方法,结束此处DefaultInterceptorChain的proceed方法,结束CorrelationDataInterceptor的handle方法,回到DefaultUnitOfWork的executeWithResult方法:
task.call得到的结果聚合类id赋值给result,进入ExecutionResult的构造器:
新建包含result的ExecutionResult实例,接着进入DefaultUnitOfWork的setExecutionResult方法:
此方法调用MessageProcessingContext(维护围绕单个消息处理的上下文,当UnitOfWork处理消息的过程过渡到下一阶段时提醒handlers)的setExecutionResult(设置处理当前message的执行结果,如果上下文存在先前设置的执行结果,只有当新的处理结果是一个异常结果时才允许设置,如果先前设置的也是一个异常结果,新执行结果中的异常作为被抑制的异常添加到原始异常中)方法:
设置完毕后返回,结束所有setExecutionResult方法,进入AbstractUnitOfWork的commit方法:
此处先保证UnitOfWork已经开启,并且是Current UnitOfwork,当UnitOfWork没有parent时,进入AbstractUnitOfWork的commitAsRoot方法:
首先调用AbstractUnitOfWork的changePhase方法:
先设置DefaultUnitOfWork的phase为PREPARE_COMMIT,接着进入DefaultUnitOfWork的notifyHandlers方法:
调用MessageProcessingContext的notifyHandlers(调用集合中关联到给定阶段的handlers)方法
此处细节不提,直接跳到之前eventsQueue中设置的PREPARE_COMMIT阶段的回调:
先暂停,明天重点分析这个4个阶段的回调干了什么。