Netty知識點(雜記)
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
public class Server {
public static void main(String[] args) throws Exception {
// 這1個執行緒用於接收客戶端的連線
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
// 這4個執行緒用於處理IO讀寫
EventLoopGroup workerGroup = new NioEventLoopGroup(4);
// 這8個執行緒用於業務處理
EventLoopGroup businessGroup1 = new NioEventLoopGroup(8);
// 這8個執行緒也是用於業務處理
EventLoopGroup businessGroup2 = new NioEventLoopGroup(8);
ServerBootstrap serverBootstrap = new ServerBootstrap();
try {
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel ch) {
ChannelPipeline channelPipeline = ch.pipeline();
channelPipeline.addLast(new StringEncoder());
channelPipeline.addLast(new StringDecoder());
// 這個ServerInHandler1是由哪類執行緒處理?
channelPipeline.addLast(new ServerInHandler1());
// 這個ServerInHandler2是由哪類執行緒處理?
channelPipeline.addLast(businessGroup2, new ServerInHandler2());
}
});
ChannelFuture channelFuture = serverBootstrap.bind("127.0.0.1", 8080).sync();
channelFuture.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
以上程式碼是使用Netty建立服務端時的常規程式碼.
這裡主要關注一個地方
// 這個ServerInHandler1是由哪類執行緒處理?
channelPipeline.addLast(new ServerInHandler1());
// 這個ServerInHandler2是由哪類執行緒處理?
channelPipeline.addLast(businessGroup2, new ServerInHandler2());
唯一不同的地方就是ServerInHandler2使用了一個businessGroup2.
那麼ServerInHandler1是由EventLoopGroup workerGroup中的某一個執行緒來處理它的業務程式碼的.ServerInHandler2是由EventLoopGroup businessGroup2中的某一個執行緒來處理它的業務程式碼的.
如果把程式碼改成如下
// 這個ServerInHandler1是由哪類執行緒處理?
channelPipeline.addLast(businessGroup2, new ServerInHandler1());
// 這個ServerInHandler2是由哪類執行緒處理?
channelPipeline.addLast(businessGroup2, new ServerInHandler2());
那麼ServerInHandler1和ServerInHandler2都是由EventLoopGroup businessGroup2中的某一個執行緒來處理它們的業務程式碼的.
如果再把程式碼改成如下
// 這個ServerInHandler1是由哪類執行緒處理?
channelPipeline.addLast(businessGroup1, new ServerInHandler1());
// 這個ServerInHandler2是由哪類執行緒處理?
channelPipeline.addLast(businessGroup2, new ServerInHandler2());
那麼ServerInHandler1是由EventLoopGroup businessGroup1中的某一個執行緒來處理它的業務程式碼的.ServerInHandler2是由EventLoopGroup businessGroup2中的某一個執行緒來處理它的業務程式碼的.
程式程式碼是由執行緒來執行的,因此哪塊程式碼是由哪個執行緒執行的需要很清楚,這樣出現問題,也便於排查.
相關文章
- Generator知識點雜燴
- 從 BIO、NIO 到 Netty【前置知識點】Netty
- Vlan相關知識雜記
- 雜湊表知識點小結
- C 語言複雜知識點
- 知識點記錄
- 生物知識點筆記筆記
- ElasticSearch知識點小記Elasticsearch
- HTML+CSS知識點大雜燴(二)HTMLCSS
- Netty中的這些知識點,你需要知道!Netty
- 知識雜庫
- 記錄的小知識點
- python知識點記錄_01Python
- python知識點記錄_03Python
- 學習記錄 -- 知識點
- 知識盲點 隨筆筆記筆記
- Flutter個人小知識點記錄Flutter
- vueX基礎知識點筆記Vue筆記
- Redis知識點筆記總結Redis筆記
- 雜亂樂理知識
- [Android學習筆記]雜碎知識(持續更新)Android筆記
- vuex狀態管理知識點記錄Vue
- React學習筆記知識點整理React筆記
- 零碎知識點記事本
- 知識點
- Netty雜記2—NIO網路程式設計Netty程式設計
- kubebuilder實戰之八:知識點小記UI
- rabbitmq 知識點MQ
- SQL知識點(+)SQL
- 前端知識點前端
- Android 知識點Android
- Weex 知識點
- Promise知識點Promise
- Laravel 知識點Laravel
- MySQL知識點MySql
- 知識點——terms
- ajax知識點
- 通用知識點