使用netty实现的tcp通讯中如何实现同步返回
2016-03-24 14:40
387 查看
在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为空的话,则将消息给业务系统处理。
实现要点:
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为空的话,则将消息给业务系统处理。
相关文章推荐
- 情感分析利器——Doc2vec
- HTTP中Get与Post的区别
- SYN(synchronous)是TCP/IP建立连接时使用的握手信号
- TCP/IP传送方式有三种:单播,广播,组播
- httpPost提交数据
- 神经网络用于多分类的一个疑问
- 深入理解Java的接口和抽象类 (http://www.cnblogs.com/dolphin0520/p/3811437.html)
- CentOS7 网络管理与配置
- 网络驱动设备:ISCSI实战!!!
- NSURLSession网络请求
- AsyncHttpClient, RequestParams ,AsyncHttpResponseHandler三个类使用方法
- pycnn以多项式为例的动态网络结构
- 使用 python 创建最简单的 https 服务器
- 关于TCP流模式与UDP数据报模式的区别
- 三种经典iPhone上网络抓包方法详解
- TCP/IP面试题整理
- Volley+OkHttp的整合
- Windows2012中安装PHP-5.6.20+Apache httpd2.4.18+Composer+Laravel+MySQL5.7
- tcpcopy
- Applet建立HTTP连接报错java.security.AccessControlException