1. 程式人生 > >(第一天)每日原始碼除錯之旅--實現CQRS模式的AXON框架

(第一天)每日原始碼除錯之旅--實現CQRS模式的AXON框架

demo檔案結構:

github地址:https://github.com/zxc1210449483/axondemo

開始除錯:先在ProductController的commandGateway.sendAndWait(command)前打上端點,然後用postman傳送POST請求:

http://127.0.0.1:8080/product/31?name=ttt&price=10&stock=100

F5單步除錯進入DefaultCommandGateway的sendAndWait方法:

DefaultCommandGateway的作用:CommandGateway的預設實現,它可以配置RetryScheduler和CommandDispatchInterceptors。RetryScheduler用來配置non-transient exception(非暫時性異常)發生時的重試排程,CommandDispatchInterceptors用來攔截和改變分派給規定gatway的命令。

sendAndWait:首先新建FutureCallback<Object, Object>例項,允許分配執行緒去等待呼叫的返回結果,同時允許呼叫者在非同步的命令匯流排過程中同步“呼叫”(calls)。接著進入send(command, futureCallback)方法:

此處呼叫父類AbstractCommandGateway(CommandGateway的抽象實現,處理分派攔截器並在異常時重試,實際的命令分派留給子類)的send方法:

此處首先呼叫GenericCommandMessage(CommandMessage的實現,將Command裝配成CommandMessage)的asCommandMessage靜態方法處理command引數:判讀command是否為CommandMessage的例項,是則返回command,不是則用command建立一個CommandMessage。

隨後進入AbstractCommandGateway的processInterceptors方法:

此處主要是攔截CommandMessage並處理(如果註冊了攔截器的話,本demo沒用到),返回需要分派的CommandMessage。

回到AbstractCommandGateway的send方法,futureCallback賦值給commandCallback(upcasting),判讀有沒設定retryScheduler,有則將其配置到commandCallback,不配置,直接呼叫SimpleCommandBus(CommandBus的實現,用來分派命令到指定的handlers,此類中也有攔截器,用來做一些無光命令型別和名稱的處理任務,如登入、安全和SLA監控等)的dispatch方法:

攔截器處理完畢後呼叫doDispatch方法:

此處首先獲取MonitorCallback的列舉類NoOpMessageMonitor的例項,用於後來監控命令傳送的成功與失敗,接著獲取命令對應的handlers,呼叫findCommandHandlerFor方法:

從subscriptions這個ConcurrentMap屬性中用command的名字取出對應的handler,這裡是aggregateAnnotationCommandHandler,本demo使用註解定義的handler方法。取不到handler則丟擲異常,取到則返回handler,回到doDispatch中,呼叫doDispatch(command, handler)方法:

先暫停,明天繼續。