netty使用进阶

2016-05-25 11:08:00
admin
原创 406
摘要:netty使用进阶

一、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关闭线程;

发表评论
评论通过审核之后才会显示。