标签:自定义 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());
}
});
标签:自定义 out ast cut throw trace keepaliv 比较 keep
原文地址:https://www.cnblogs.com/mc-74120/p/13343055.html