NettyタスクキューのTaskには、3つの一般的な使用シーンがあります.

10955 ワード

各NioEventLoopにはselectorとTaskQueueがあり、時間のかかる操作を行うとブロックが発生し、TaskQueueを使用することができます.
具体的な実装は3つあります.
1.ユーザーズプログラムカスタマイズの一般的なタスク:カスタマイズされたhandlerのchannelReadメソッドで:
        //                 ,    ,   channel    NioEventLoop TaskQueue 
        //     1:
        ctx.channel().eventLoop().execute(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(10000);
                    ctx.writeAndFlush(Unpooled.copiedBuffer("hello,   1",CharsetUtil.UTF_8));
                } catch (InterruptedException e) {
                    System.out.println("    ");
                }
            }
        });

2.scheduleTaskQueueにコミットされたカスタムタイミングタスク
        ctx.channel().eventLoop().schedule(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(5000);
                    ctx.writeAndFlush(Unpooled.copiedBuffer("hello,   1",CharsetUtil.UTF_8));
                } catch (InterruptedException e) {
                    System.out.println("    ");
                }
            }
        },5, TimeUnit.SECONDS);

3.現在のreactorスレッド呼び出し以外の様々な方法では、パラメータを設定する際にhashcode、例えばプッシュシステムのビジネススレッドで、ユーザの識別に基づいて対応するchannel参照を見つけ、Writeクラスメソッドを呼び出してそのユーザにメッセージをプッシュすると、このようなシーンに入る.最終的なWriteはタスクキューにコミットされ非同期消費されます
serverBootstrap.group(bossGroup,workGroup)
                    //   NioServerSocketChannel          
                    .channel(NioServerSocketChannel.class)
                    //             
                    .option(ChannelOption.SO_BACKLOG,128)
                    //           
                    .childOption(ChannelOption.SO_KEEPALIVE,true)
                    //     workGroup EventLoop          
                    //           
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        //  pipeline     
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            //             socketChannel ,
                            //       ,          channel   NIOEventLoop taskQueue  scheduleTaskQueue 
                            System.out.println("  socketChannel hashcode="+socketChannel.hashCode());
                            socketChannel.pipeline().addLast(new JymNettyServerHandler());
                        }
                    });

シナリオの再説明
1.nettyは2組のスレッドプールを抽象化し、BossGroupはクライアント接続を担当し、WorkerGroupはネットワーク読み書き操作を担当する.NioEventLoopは、処理タスクを繰り返し実行するスレッドを表し、各NioEventLoopには、その上にバインドされたsocketネットワークチャネル3を傍受するselectorがある.NioEventLoop内部はシリアル化設計を採用し、繊細な読み書き、復号化、処理、符号化、送信から、常にIOスレッドのNioEventLoopが担当する
オブジェクトの前の関係
NioEventGroupの下に複数のNioEventLoopを含む各NioEventLoopには1つのSelectorが含まれており、1つのtaskQueue各NioEventLoopのselectorには複数のNioChannelを登録して傍受することができる各NioChannelは唯一のNioEventLoopにバインドされるだけである各NioChannelには1つの自分のChannelとPipelineがバインドされている
学習年限が足りなくて、知識が浅くて、言うことが間違っています.
世界には10種類の人がいて、1つはバイナリを知っていて、1つはバイナリを知らないのです.