1. 程式人生 > 實用技巧 >Netty的任務佇列的Task的三種使用場景

Netty的任務佇列的Task的三種使用場景

在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());
}
});