Netty(18)-taskQueueカスタムタスク

タスクキュー内のタスクには、次の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にビジネスを追加できます。

おすすめ

転載: blog.csdn.net/yangxshn/article/details/114038658