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

Netty的任务队列的Task的三种使用场景

时间:2020-07-20 10:56:39      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:自定义   out   ast   cut   throw   trace   keepaliv   比较   keep   

在Netty中 事务的处理都是放入自定义的Handler中的 如果某些业务比较耗时 最终也会阻塞线程 这时就需要任务队列来异步处理任务了。

1.用户自定义的普通任务

例:

ctx.channel().eventLoop().execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100 * 10);
ctx.writeAndFlush(Unpooled.copiedBuffer("执行", CharsetUtil.UTF_8));
} catch (Exception e) {
e.printStackTrace();
}
}
});
2.用户自定义定时任务
例:
//解决阻塞问题2 用户自定义定时任务 任务提交到scheduleTaskQueue
ctx.channel().eventLoop().schedule(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100 * 10);
ctx.writeAndFlush(Unpooled.copiedBuffer("执行200", CharsetUtil.UTF_8));
} catch (Exception e) {
e.printStackTrace();
}
}
}, 5, TimeUnit.SECONDS);
3.非当前Recator线程调用channel的各种方法
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(boosGroup,workerGruop)//设置两个线程组
.channel(NioServerSocketChannel.class)//设置通道类型
.option(ChannelOption.SO_BACKLOG,128)//设置线程队列的连接个数
.childOption(ChannelOption.SO_KEEPALIVE,true)//设置保持活动状态
.childHandler(new ChannelInitializer<SocketChannel>() {
//创建一个通道测试对象(匿名对象)
//给pipeline设置处理器
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
System.out.println("客户SocketChannel的hashcode:"+socketChannel.hashCode());
//可以使用一个集合管理SocketChannel 再推送消息时,可以将业务加入到各个channel中 对应的NIOEventLoop的taskQueue
//或者scheduleTaskQueue
socketChannel.pipeline().addLast(new NettyServerHandler());
}
});

Netty的任务队列的Task的三种使用场景

标签:自定义   out   ast   cut   throw   trace   keepaliv   比较   keep   

原文地址:https://www.cnblogs.com/mc-74120/p/13343055.html

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