一. 耗时任务

static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);

 // Tell the pipeline to run MyBusinessLogicHandler's event handler methods
// in a different thread than an I/O thread so that the I/O thread is not blocked by
// a time-consuming task.
// If your business logic is fully asynchronous or finished very quickly, you don't
// need to specify a group.
pipeline.addLast(group, "handler", new MyBusinessLogicHandler()); 其中EventExecutorGroup 就是专门来处理耗时业务的线程池。

childHandler(new ChannelInitializer<SocketChannel>() {

static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);

@Override
protected void initChannel(SocketChannel ch)
throws Exception {
ChannelPipeline p = ch.pipeline();pipeline.addLast(group, "handler", new MyBusinessLogicHandler());

此方法所在类 每次都是new  ,所以会创建很多group,  所以把group 定义为static

二.执行计划

在实际生产环境中,我们可能会碰到 需要临时执行也行计划任务,,这些任务如果不耗时,我们可以通过channel提供的计划任务方法处理:

future =  channel.eventLoop.scheduleAtFixedRate(new Runnable() {

            @Override
public void run() {
//逻辑代码,非耗时任务
}
}, 6, 6, TimeUnit.HOURS);
....

如果计划任务里面的逻辑比较耗时,那么就不能再用eventLoop,因为这会阻塞IO线程。如果是通过pipeline.addLast(group, "handler", new MyBusinessLogicHandler()); 这种方式添加的业务线程我们可以使用下面的方式添加计划任务方法实现:

***future = ctx.executor().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
}
}, 6, 6, TimeUnit.HOURS);***

...

netty 源码

public EventExecutor executor() {
return (EventExecutor)(this.executor == null?this.channel().eventLoop():this.executor);
}

如果this.executor为null,就返回channel().eventLoop(),这个是io读写线程,肯定是不能执行耗时任务的。
如果不为空,那么是怎么传进来的呢?

DefaultChannelPipeline

public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) {
final AbstractChannelHandlerContext newCtx;
synchronized(this) {
checkMultiplicity(handler);
newCtx = this.newContext(group, this.filterName(name, handler), handler);
private AbstractChannelHandlerContext newContext(EventExecutorGroup group, String name, ChannelHandler handler) {
return new DefaultChannelHandlerContext(this, this.childExecutor(group), name, handler);
}

通过源码发现:其实就是我们在添加handler时指定的DefaultEventExecutorGroup。
所以结论是:如果在处理耗时任务的Handler添加时用到了DefaultEventExecutorGroup是可以 ctx.executor().scheduleAtFixedRate这么用的,但是如果你再添加handler时没有没有指定特殊的EventExecutorGroup,是不能执行耗时任务的。

如果是在IO线程,如果想处理耗时任务逻辑,那么就需要新建一个EventExecutorGroup,并调用他的相关方法


EventLoop:其本质是一个用来处理IO事件的线程,EventLoopGroup 其本质是一个线程池。一个EventLoop可以和多个Channel绑定,处理多个Channel的IO事件;但是一个Channel在整个生命周期内只会被一个EventLoop处理,这就也就保证了线程安全。

 

最新文章

  1. 详细安装ss的过程(vultr)
  2. IIS用户权限备忘
  3. MFC中快速应用OpenCV教程
  4. java获取字符串格式日期向前或向后n天的日期
  5. COM 浅谈
  6. WISE安装程序增加注册控制
  7. g++ 编译c文件
  8. mysql 使用sqldump来进行数据库还原
  9. 自己动手写http服务器——主程序(三)
  10. DALI 2.0解码模块
  11. 在CentOS 7中启动/停止/重启服务
  12. python之算法排序模块
  13. 浅谈Kubernetes生产架构
  14. P2257 YY的GCD--洛谷luogu
  15. 根据框架的dtd或xsd生成xml文件
  16. Django中media的配置
  17. ⑥NuPlayer播放源码分析之DecoderBase分析
  18. 51Nod 1667 概率好题 - 容斥原理
  19. CentOS7图形界面启动报错unable to connect to X server
  20. windows下tomcat的安装配置

热门文章

  1. View的setLayerType() , setDrawingCacheEnabled() 方法用法
  2. 2017实习【Java研发】面经
  3. HDU 3271 数位dp+二分
  4. Python 不定参数函数
  5. python基础之02列表/元组/字典/set集合
  6. Ansible3: ansible.cfg配置说明
  7. caffe 配置文件详解
  8. Java基础-IO流对象之随机访问文件(RandomAccessFile)
  9. [应用篇]第一篇 EL表达式入门
  10. 【操作记录】Asp.Net Core 的一些基本操作或属性