码迷,mamicode.com
首页 > Web开发 > 详细

Netty

时间:2018-10-10 20:11:20      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:通过   任务   技术分享   结束   actor   tde   img   cto   方式   

ChannelInboundHandlerAdapter#channelRead 中如果通过 ChannelHandlerContext#writeAndFlush 发送多条消息的话,消息都是在处理完之后,一起 flush 出去的。
如果想要实现每隔一段时间,发送一条消息这种需求的话,可以另起一个 schdule 线程,定时去发送消息。

场景:接收到任务开始消息后,每隔2s上报一次任务状态,上报10次后,发送一个任务结束消息
两种方式实现:
1. 接收到任务开始消息后,启一个 schdule 线程,每隔 2s 上报一次任务状态,上报到第 10 次的时候,在任务状态消息中打个任务结束标记
当客户端接收到服务端处理任务状态消息的回包后,发现任务结束标记后,就发送任务结束消息
注:这种方式要求客户端和服务端在收发消息时将任务结束标记在一来一回的传递中原样传递

2. 接收到任务开始消息后,启一个 schdule 线程,每隔 2s 上报一次任务状态,上报到第 10 次的时候,发送任务结束消息

错误的做法1:在 ChannelHandler 线程中每隔 2s 上报一次消息,这样消息会在最后一次才全部 flush。
错误的做法2:在 ChannelHandler 线程中启一个 schdule 线程,每隔 2s 上报一次任务状态。同时在 ChannelHandler 线程中监听任务状态上报是否结束,没有结束就 sleep,直到上报完成再发送任务结束消息
这两种做法错误的原因在于: ChannelHandler 线程在发送消息的过程中阻塞了,所以所有的消息都是在整个逻辑处理完之后再 flush 出去的

排查netty错误时,可以将 netty 的日志开启:
//记录请求与响应报文
InternalLoggerFactory.setDefaultFactory(Slf4JLoggerFactory.INSTANCE);
pipeline.addAfter("idleEventHandler","loggingHandler",new LoggingHandler(LogLevel.INFO));

这样就会得到类似如下的日志,这样就可以清楚的看到 netty wirte、read、flush的日志了:
技术分享图片

Netty

标签:通过   任务   技术分享   结束   actor   tde   img   cto   方式   

原文地址:https://www.cnblogs.com/kevin-yuan/p/9768481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!