タスクキュー内のタスクには、次の3つの一般的な使用シナリオがあります。
1)ユーザープログラムによって定義される一般的なタスク
public class NettyServerHandlerTask01 extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 比如这里有一个非常耗时长的业务 -> 异步执行 -> 将业务提交到该 channel 对应的
// NioEventLoop 的 taskQueue 中处理
// 解决方案1:用户程序自定义的普通任务
// 10秒后运行
ctx.channel().eventLoop().execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10 * 1000);
ctx.writeAndFlush(Unpooled.copiedBuffer("Hello,客户端222", CharsetUtil.UTF_8));
}catch (Exception ex){
System.out.println("发生异常:" + ex.getMessage() );
}
}
});
// 30秒后运行
ctx.channel().eventLoop().execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(20 * 1000);
ctx.writeAndFlush(Unpooled.copiedBuffer("Hello,客户端222", CharsetUtil.UTF_8));
}catch (Exception ex){
System.out.println("发生异常:" + ex.getMessage() );
}
}
});
System.out.println("go on...");
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(Unpooled.copiedBuffer("Hello,客户端1111",CharsetUtil.UTF_8));
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
2)、ユーザー定義のタイミングタスク
public class NettyServerHandlerTask02 extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 用户自定义定时任务 -> 该任务提交到scheduleTaskQueue
ctx.channel().eventLoop().schedule(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5 * 1000);
ctx.writeAndFlush(Unpooled.copiedBuffer("Hello,客户端444", CharsetUtil.UTF_8));
}catch (Exception ex){
System.out.println("发生异常:" + ex.getMessage() );
}
}
},5, TimeUnit.SECONDS);
System.out.println("go on...");
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(Unpooled.copiedBuffer("Hello,客户端",CharsetUtil.UTF_8));
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
3)非現在のReactorスレッドによってチャネルを呼び出すさまざまな方法
たとえば、プッシュシステムのビジネススレッドで、ユーザーIDに従って、対応するチャネル参照を見つけ、Writeメソッドを呼び出してユーザーにメッセージをプッシュすると、このシナリオに入ります。最終的な書き込みは、非同期消費のためにタスクキューに送信されます。
アイデア:コレクションを使用してSocketChannelを管理でき、メッセージをプッシュするときに、各チャネルに対応するNioEventLoopのtaskQueueまたはscheduleTaskQueueにビジネスを追加できます。