我々は時間のかかる作業時間数を行ったときに、それぞれが、タスクキュー内のセレクタとNioEventLoopを持って、ブロックされて生成されます、今回はタスクキューを使用することができます
3つの具体的な実現があります。
1.一般的なタスクのユーザー定義プログラム:方法ハンドラカスタム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);
ハッシュコードは、例えば、スレッドを押し、ユーザーの身元に係る業務システムにおいて、基準に対応するチャネルを見つけるために、その後、ユーザプッシュメッセージにクラスのWriteメソッドを呼び出すときに様々な方法がパラメータを設定し、前記非現在の呼び出し側スレッドを反応器このようなAシナリオに入ります。最終的には、非同期消費した後、タスクキューにサブミットされます書きます
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読み取りおよび書き込み操作が
処理タスクを実行しているスレッドの連続ループを表す2.NioEventLoop、各NioEventLoop結合監視するため、セレクタを有しています上のソケットにネットワークチャネル
内部3.NioEventLoopシリアル設計、伝送、符号化、処理、復号化、細身から読み書き、スレッドNioEventLoop IOの原因であります
前のオブジェクトとの関係
NioEventGroupの下でより多くのNioEventLoopが含まれている
各NioEventLoopはセレクタ、タスクキューが含まれ
、各NioEventLoopは、複数のリスナーNioChannel登録できセレクタを
各NioChannelのみのみNioEventLoopに結合
各NioChannelが自身を持っているためにバインドされているがチャネルおよびパイプライン