在netty實現的tcp通訊中,一切都是異步操作,這提高了系統性能,但是,有時候client需要同步等待消息返回,如何實現呢?筆者已經實現,在此總結下重點要素
實現要點:
1、消息結構設計
消息頭中需要有id和correspondId,即消息id和響應id,使用UUID實現。message發出去的時候需設置id,服務器接收到message處理業務,響應消息中的correspondId設置成原消息的id;
2、采用CountDownLatch實現線程同步等待;
流程示意圖:
1、業務系統調用統一api發送消息;
2、消息發送服務將消息緩存到消息管理器,緩存鍵值為id;
3、消息發送服務將消息發送到服務器,同時線程進入休眠等待,還可以設置timeout;
4、服務器處理消息后,將響應消息寫到tcp流;
5、消息接收服務接收到消息后,判斷消息correspondId是否有值,如果有值,則說明有一個線程在等待該消息返回,根據correspondId找到該線程喚醒運行,此刻服務調用即得到返回值;
6、correspondId為空的話,則將消息給業務系統處理。