netty channel不关闭会有什么问题
1个回答
展开全部
netty是一个Java nio的网络框架,它屏蔽了底层网络细节,并且非常的高效。如果你是最近要开发一个消息平台,使用netty最好不过了。
一个好的消息平台有很多需要注意的细节和应该遵守的约定准则。其中平台的优雅关闭必不可少。这个主要是避免消息丢失。那么如何做到netty的优雅关闭呢?
在netty中,接受连接请求和对请求进行业务处理分别有两个线程执行器bossExecutor 和 workerExecutor,除了关闭这两个外还需要关闭channel。
netty文档说优雅关闭需要三步:
1. unbind netty创建的所有channel。channel.unbind()
2. close netty创建的所有channel。channel.close()
3. shutdown netty的线程执行器。factory.releaseExternalResources()
对于netty生成的channel,可以使用ChannelGroup管理,很方便。
具体的代码如下:(可以参看ChannelGroup的注释)
[java] view plain copy
ChannelGroup allChannels = new DefaultChannelGroup();
public static void main(String[] args) throws Exception {
ServerBootstrap b = new ServerBootstrap(..);
...
// Start the server
b.getPipeline().addLast("handler", new MyHandler());
Channel serverChannel = b.bind(..);
allChannels.add(serverChannel);
... Wait until the shutdown signal reception ...
// Close the serverChannel and then all accepted connections.
allChannels.close().awaitUninterruptibly();
b.releaseExternalResources();
}
public class MyHandler extends SimpleChannelUpstreamHandler {
@Override
public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) {
// Add all open channels to the global group so that they are
// closed on shutdown.
allChannels.add(e.getChannel());
}
}
一个好的消息平台有很多需要注意的细节和应该遵守的约定准则。其中平台的优雅关闭必不可少。这个主要是避免消息丢失。那么如何做到netty的优雅关闭呢?
在netty中,接受连接请求和对请求进行业务处理分别有两个线程执行器bossExecutor 和 workerExecutor,除了关闭这两个外还需要关闭channel。
netty文档说优雅关闭需要三步:
1. unbind netty创建的所有channel。channel.unbind()
2. close netty创建的所有channel。channel.close()
3. shutdown netty的线程执行器。factory.releaseExternalResources()
对于netty生成的channel,可以使用ChannelGroup管理,很方便。
具体的代码如下:(可以参看ChannelGroup的注释)
[java] view plain copy
ChannelGroup allChannels = new DefaultChannelGroup();
public static void main(String[] args) throws Exception {
ServerBootstrap b = new ServerBootstrap(..);
...
// Start the server
b.getPipeline().addLast("handler", new MyHandler());
Channel serverChannel = b.bind(..);
allChannels.add(serverChannel);
... Wait until the shutdown signal reception ...
// Close the serverChannel and then all accepted connections.
allChannels.close().awaitUninterruptibly();
b.releaseExternalResources();
}
public class MyHandler extends SimpleChannelUpstreamHandler {
@Override
public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) {
// Add all open channels to the global group so that they are
// closed on shutdown.
allChannels.add(e.getChannel());
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询