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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM