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知識點雜燴
- Vlan相關知識雜記
- 雜湊表知識點小結
- C 語言複雜知識點
- 從 BIO、NIO 到 Netty【前置知識點】Netty
- 知識點記錄
- 雜湊的一些知識點
- HTML+CSS知識點大雜燴(二)HTMLCSS
- 知識雜庫
- numpy知識點筆記筆記
- 生物知識點筆記筆記
- ElasticSearch知識點小記Elasticsearch
- Netty中的這些知識點,你需要知道!Netty
- 記錄的小知識點
- 學習記錄 -- 知識點
- golang小知識點記錄Golang
- Flutter個人小知識點記錄Flutter
- vueX基礎知識點筆記Vue筆記
- 知識盲點 隨筆筆記筆記
- Redis知識點筆記總結Redis筆記
- C/C++【知識點筆記】C++筆記
- 物件與類_知識點筆記物件筆記
- python知識點記錄_01Python
- python知識點記錄_03Python
- 雜亂樂理知識
- 雜項知識統計
- 知識點
- vuex狀態管理知識點記錄Vue
- 零碎知識點記事本
- python複習。知識點小記Python
- React學習筆記知識點整理React筆記
- R學習-知識點記錄(Temp)
- 大前端公共知識雜談前端
- [Android學習筆記]雜碎知識(持續更新)Android筆記
- kubebuilder實戰之八:知識點小記UI
- Html標籤知識點學習筆記HTML筆記
- 命題邏輯重要知識點筆記筆記
- python學習-知識點記錄(Temp)Python