netty使用进阶
- 2016-05-25 11:08:00
- admin
- 原创 406
一、netty使用进阶
Bootstrap extends AbstractBootstrap
ServerBootstrap extends AbstractBootstrap
1、AbstractBootstrap.option(option,value),value非空时设置选项,value为空时清除选项;
2、AbstractBootstrap.channel(channelClass),初始化channelFactory,用于生成对象channel;
3、AbstractBootstrap.handler(handler),用于初始化channel,channel注册成功后调用此处理器;
4、Bootstrap.group(workerGroup),设置线程池,workerGroup用于建立连接,workerGroup用于数据收发;
5、Bootstrap.connect(host,port),连接网络地址,先生成一个channel注册任务,后生成一个channel连接任务;
6、ServerBootstrap.group(bossGroup,workerGroup),设置线程池,bossGroup用于接受连接,workerGroup用于数据收发;
7、ServerBootstrap.childHandler(childHandler),初始化新建的socketChannel,socketChannel注册成功后调用此处理器;
8、ServerBootstrap.bind(port),绑定本地网络地址,先生成一个channel注册任务,后生成一个channel绑定任务;
Channel配置以及函数:
1、DefaultChannelConfig.connectTimeoutMillis,默认连接超时时间30秒;
2、DefaultChannelConfig.allocator,默认缓存分配器ByteBufAllocator.DEFAULT;
3、Channel.eventLoop(),返回分配给channel的SingleThreadIoEventLoop;
4、Channel.pipeline(),返回关联的pipeline,此对象实例化于DefaultChannelPipeline;
5、Channel.closeFuture(),返回关联的closeFuture,此对象继承于DefaultChannelPromise;
6、Channel.id(),返回会话ID,此对象实例化于DefaultChannelId;
7、Channel.attr(key),获取指定的属性,如果没有则生成;
8、Channel.hasAttr(key),通道是否存在指定的属性;
9、Channel.remoteAddress(),返回对端网络地址;
netty工具类介绍:
1、MacAddressUtil.defaultMachineId(),根据MAC地址生成机器ID;
2、DefaultChannelId.newInstance(),生成会话ID,使用五个字段生成;
3、DefaultChannelId.asShortText(),返回会话ID字符串,使用随机数字段生成;
4、DefaultChannelId.asLongText(),返回会话ID字符串,使用所有字段生成;
5、DefaultChannelId.toString(),返回会话ID字符串,实际调用asShortText();
二、Channel事件介绍
Channel事件介绍
1、NioServerSocketChannel注册任务成功后调用channelRegistered;
2、NioServerSocketChannel绑定任务成功后调用channelActive;
3、服务端NioSocketChannel注册任务成功后调用channelRegistered;
4、服务端NioSocketChannel注册任务成功后调用channelActive;
5、客服端NioSocketChannel注册任务成功后调用channelRegistered;
6、客服端NioSocketChannel连接任务成功后调用channelActive;
7、取消注册任务成功后调用channelInactive和channelUnregistered;
handler注册:
1、Bootstrap注册处理器ChannelInitializer到channel;
2、ServerBootstrap注册处理器ChannelInitializer到channel;
3、ServerBootstrap注册处理器ServerBootstrapAcceptor到channel;
4、ServerBootstrapAcceptor用于处理事件SelectionKey.OP_ACCEPT;
5、ServerBootstrapAcceptor用于注册childHandler到childChannel;
channel关闭:
1、Channel.close(),调用SocketChannel.close(),然后生成一个取消注册任务;
2、DefaultChannelPipeline.close(),调用SocketChannel.close(),然后生成一个取消注册任务;
3、AbstractChannel.AbstractUnsafe.close(promise),调用SocketChannel.close(),然后生成一个取消注册任务;
4、AbstractChannel.AbstractUnsafe.deregister(promise),取消注册SelectableChannel,同时执行相关回调;
5、ChannelInboundHandler.channelInactive(ctx),执行取消激活相关回调,激活过才会执行;
6、ChannelInboundHandler.channelUnregistered(ctx),执行取消注册相关回调,注册过才会执行;
三、Promise使用介绍
GlobalEventExecutor:
1、全局执行事件线程池,GlobalEventExecutor.INSTANCE获取实例;
2、最多只有一个线程,提交任务时自动启动线程;
3、静默期内没有提交任务,自动关闭线程,默认1秒;
4、支持提交立即执行的任务,支持提交定时执行的任务;
DefaultPromise:
1、用于设置成功失败回调,包含一个执行回调线程池;
2、promise完成之后唤醒所有等待线程,然后使用线程池执行所有回调;
3、生成实例:new DefaultPromise(GlobalEventExecutor.INSTANCE)
4、DefaultPromise.addListener(listener),增加一个回调;
5、DefaultPromise.removeListener(listener),删除一个回调;
6、DefaultPromise.await(),等待完成,使用Object.wait()实现,可以被中断;
7、DefaultPromise.awaitUninterruptibly(),等待完成,使用Object.wait()实现,不可以中断;
8、DefaultPromise.sync(),等待完成,promise失败时抛出异常,可以被中断;
9、DefaultPromise.syncUninterruptibly(),等待完成,promise失败时抛出异常,不可以中断;
10、DefaultPromise.get(),调用await,等待完成,成功时返回结果,失败时抛出异常;
ChannelPromise:
1、Channel.newPromise():pipeline().newPromise()
2、DefaultChannelPipeline.newPromise():new DefaultChannelPromise(channel)
3、继承关系:class DefaultChannelPromise extends DefaultPromise implements ChannelPromise;
4、继承关系:interface ChannelPromise extends ChannelFuture, Promise;
四、netty线程池介绍
SingleThreadIoEventLoop:
1、单线程执行事件线程池,提交任务时自动启动线程,不断循环以下流程;
2、SingleThreadIoEventLoop.run(),调用runIo,处理IO事件;
3、SingleThreadIoEventLoop.run(),ST_SHUTTING_DOWN状态则会关闭通道;
4、SingleThreadIoEventLoop.run(),执行任务队列,最长时间1秒,避免影响处理IO事件;
5、SingleThreadIoEventLoop.run(),调用confirmShutdown,判断线程是否需要关闭;
6、AbstractNioChannel.AbstractNioUnsafe.handle(registration,event),处理IO事件;
线程池相关函数:
1、MultiThreadIoEventLoopGroup.shutdownGracefully(),优雅关闭线程池;
2、MultiThreadIoEventLoopGroup.awaitTermination(timeout,unit),等待线程池终止;
3、MultiThreadIoEventLoopGroup.terminationFuture(),线程池终止异步操作结果;
4、Channel.eventLoop(),返回分配给channel的SingleThreadIoEventLoop;
5、ChannelHandlerContext.executor(),如果不显示设置,默认返回Channel.eventLoop();
6、ThreadExecutorMap.currentExecutor(),返回线程属于哪个EventExecutor,使用线程局部变量实现;
线程池关闭详解:
1、MultiThreadIoEventLoopGroup.shutdownGracefully(),SingleThreadIoEventLoop数组顺序调用shutdownGracefully();
2、MultiThreadIoEventLoopGroup.shutdown(),SingleThreadIoEventLoop数组顺序调用shutdown();
3、SingleThreadIoEventLoop.shutdownGracefully(),线程状态扭转到ST_SHUTTING_DOWN,线程未启动时会启动线程;
4、SingleThreadIoEventLoop.shutdown(),线程状态扭转到ST_SHUTDOWN,线程未启动时会启动线程;
5、SingleThreadIoEventLoop.confirmShutdown():线程在运行中循环调用,判断线程是否需要关闭;
6、SingleThreadIoEventLoop.confirmShutdown()步骤1:state<ST_SHUTTING_DOWN,直接返回false;
7、SingleThreadIoEventLoop.confirmShutdown()步骤2:执行任务队列的任务,或者执行线程关闭的钩子;
8、SingleThreadIoEventLoop.confirmShutdown()步骤3:state>=ST_SHUTDOWN,直接返回true关闭线程;
9、SingleThreadIoEventLoop.confirmShutdown()步骤4:state是否可以从ST_SHUTTING_DOWN扭转到ST_SHUTDOWN;
10、SingleThreadIoEventLoop.shutdownGracefully()包含参数quietPeriod静默期,默认2秒;
11、SingleThreadIoEventLoop.shutdownGracefully()包含参数timeout超时时间,默认15秒;
12、ST_SHUTTING_DOWN扭转到ST_SHUTDOWN:静默期内没有新增任务,返回true关闭线程,
13、ST_SHUTTING_DOWN扭转到ST_SHUTDOWN:关闭时间达到超时时间,返回true关闭线程;