NC6 使用NIO实现消息推送

1.需求背景
在nc人力资源模块有些业务计算非常耗时,比如薪资,排班,假期等等,在服务器使用Nginx等反向代理的情况下,不会进行长时间的等待,而且长时间等待也是非常不好的体验。所以将计算做成异步任务就应运而生,即服务器收到请求后,另起线程执行任务,请求线程直接响应回去。如此不会影响客户端进行其他操作,但是任务在后台运行,前端需要可以查询相关任务的进度。那么进度信息可以通过两种方式进行反馈,一是客户端进行轮询,二是服务端实时推送,第一种方式比较简单不做赘述,这里讲第二种方式的实现。
2.实现依赖
NIO,NC远程调用信息(RemoteInvocation)
3.具体步骤
1>流程图
在这里插入图片描述
2>服务端实现重点

1.注册服务组件,在NC服务启动时,初始化ServerSocketChannel的类,使用单例模式
2.初始化一个同步Map容器用来装客户端Socket,key是clientIp,value是SocketChannel,请求连接时注册
3.selector还是要注册read事件,用于监听客户端的连接断开
4.为了防止粘包,发送消息对象时,将实体对象的size放在前面一并发送

3>客户端实现重点

1.第一次请求时,初始化SocketChannel,与服务器建立连接,使用单例
2.初始化一个同步Map容器用来装客户端的进度显示器,key是callid(任务id),value是progress
3.selector注册read事件,用于监听服务端发送的数据和监听服务端的连接断开
4.读数据时,先读size,再使用size长度的ByteBuffer读实体数据,读完后发送给对应callid的progress

对自已而言,Java的socket通信,只是知道,还从来没有实际运用过,对于使用了Nginx等代理,肯定要进行配置,还有就是不知道会不会有安全漏洞,因为代码比较多,如有需要,我可以上传补丁供下载参考交流。

猜你喜欢

转载自blog.csdn.net/guaizang/article/details/106675434