在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为空的话,则将消息给业务系统处理。