接上一篇NioEventLoopGroup的實(shí)例化分析繼續(xù)
https://blog.51cto.com/483181/2118817
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供商城企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為商城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進(jìn)行中。
這篇博客要分析的是 “2. ServerBootstrap初始化”,如下:
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap(); //2. ServerBootstrap初始化
b.group(bossGroup, workerGroup) // 2. ServerBootstrap初始化
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
}
});
ChannelFuture f = b.bind(port).sync(); //3. bind
f.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
public ServerBootstrap() { }
ServerBootstrap提供了一個無參構(gòu)造函數(shù),其實(shí)有點(diǎn)奇怪,因為像這種網(wǎng)絡(luò)服務(wù)肯定要適應(yīng)不同的場景,所以肯定得有很多參數(shù)的構(gòu)造函數(shù)。
對于這一點(diǎn),正是因為要適配的參數(shù)太多了,所以ServerBootstrap提供了一個無參構(gòu)造函數(shù),然后使用構(gòu)造者模式來解決這個問題。
如下:
public ServerBootstrap childHandler(ChannelHandler childHandler) {
if (childHandler == null) {
throw new NullPointerException("childHandler");
}
this.childHandler = childHandler;
return this;
}
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
super.group(parentGroup);
if (childGroup == null) {
throw new NullPointerException("childGroup");
}
if (this.childGroup != null) {
throw new IllegalStateException("childGroup set already");
}
this.childGroup = childGroup;
return this;
}
父類的group(xx)
public B group(EventLoopGroup group) {
this.group = group;
return self();
}
傳入了兩個EventLoopGroup,也就是上一篇文章說的NioEventLoopGroup,一個是bossGroup,一個workerGroup.
其中bossGroup存在它的父類group屬性
workerGroup存在ServerBootstrap的childGroup屬性里面,不過暫時不知道它們之間的區(qū)別。
繼續(xù)看b.channel(NioServerSocketChannel.class)
代碼在ServerBootstrap的父類AbstractBootstrap里面,如下:
public B channel(Class<? extends C> channelClass) {
return channelFactory(new ReflectiveChannelFactory<C>(channelClass));
}
public B channelFactory(ChannelFactory<? extends C> channelFactory) {
this.channelFactory = channelFactory;
return self();
}
public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> {
private final Class<? extends T> clazz;
public ReflectiveChannelFactory(Class<? extends T> clazz) {
this.clazz = clazz;
}
@Override
public T newChannel() {
try {
return clazz.getConstructor().newInstance();
} catch (Throwable t) {
}
}
}
上面這段代碼可以看出:
繼續(xù)看b.option()方法
Map<ChannelOption<?>, Object> options;
public <T> B option(ChannelOption<T> option, T value) {
if (option == null) {
throw new NullPointerException("option");
}
if (value == null) {
synchronized (options) {
options.remove(option);
}
} else {
synchronized (options) {
options.put(option, value);
}
}
return self();
}
從上面這代碼可以看出幾點(diǎn):
1.option方法帶有remove和put兩個操作,根據(jù)value是否null來判斷。這種寫法自己以前用的比較少,一般的話會提供兩個方法出來。
2.如果是put的話,那么把值存在options這個Map集合里面。
繼續(xù)回頭看b.handler()方法
handler方法位于ServerBootstrap的父類AbstractBootstrap里面,如下:
private volatile ChannelHandler handler;
public B handler(ChannelHandler handler) {
if (handler == null) {
throw new NullPointerException("handler");
}
this.handler = handler;
return self();
}
很是簡單,就是把傳入的ChannelHandler對象保存起來,放在屬性handler里面。
另外,注意到handler對象是volatile類型的,volatile具有揮發(fā)性,如果一個線程修改了數(shù)據(jù),那么另外一個線程可以馬上看到這個修改。具體大家可以百度下。
繼續(xù)回去看b.childHandler(xx)方法
childHandler方法位于ServerBootstrap里面
private volatile ChannelHandler childHandler;
public ServerBootstrap childHandler(ChannelHandler childHandler) {
private volatile ChannelHandler childHandler;
if (childHandler == null) {
throw new NullPointerException("childHandler");
}
this.childHandler = childHandler;
return this;
}
從上面代碼可以看出:
ServerBootstrap的初始化分析完之后,我們來總結(jié)下。
ServerBootstrap提供了一個無參構(gòu)造函數(shù),為了適應(yīng)各種不同的場景。 它使用了構(gòu)造者模式,構(gòu)造者模式大家百度即可,比如: https://www.cnblogs.com/cc11001100/p/5939220.html
ServerBootstrap保存了
EventLoopGroup childGroup,在上面例子我們的類型是NioEventLoopGroup。
ChannelHandler childHandler;
父類AbstractBootstrap保存了同一個類型的
volatile EventLoopGroup group;
private volatile ChannelHandler handler;
文章標(biāo)題:57.Netty源代碼分析-服務(wù)器端啟動ServerBootstrap初始化
標(biāo)題URL:http://www.rwnh.cn/article14/jeesde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、網(wǎng)站策劃、域名注冊、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)