Netty closeFuture()。sync()。channel();阻止api

时间:2017-01-06 12:33:48

标签: java spring-boot netty

我正在学习Netty,并使用spring boot启动了一些教程。我的目标是创建一个应用程序,该应用程序设置一个用于接收消息的tcp端口,并通过其余的api呈现它们。

大多数教程都说我应该添加类似这样的内容

serverChannel = serverBootstrap.bind(tcpPort).sync().channel().closeFuture().sync().channel();

启动netty。 当我这样做时,我实施的其他服务无效。 现在,当我使用以下代码片段启动应用程序时:

serverChannel = serverBootstrap.bind(tcpPort).sync().channel();
一切似乎都运转得很好。 有人可以解释一下这可能会导致这个问题吗?

由于

1 个答案:

答案 0 :(得分:3)

第一部分启动服务器, 1)将其绑定在TCP端口上, 2)等待服务器准备好(套接字正在侦听) 3)并返回相关频道。

serverBootstrap.bind(tcpPort).sync().channel();
                 (1)           (2)       (3)

第二部分是等待主通道(侦听套接字)关闭(closeFuture().sync()),其中closeFuture给你“关闭”操作的“未来”(意味着关闭服务器套接字) ),sync等待这个未来的完成。 channel()会为您提供与第一次相同的频道,但现在已关闭。

所以你可能会在各种例子中找到这个代码,因为通常你会在主线程中启动服务器(bind),然后如果你不等某事,主线程就会结束,让你的JVM完成,因此您的服务器在启动后立即停止。

所以一般来说,我们所做的是:

  • 启动服务器
  • 在管道中添加必要的处理程序来处理您的业务逻辑(当然还有网络协议)
  • 然后等待closeFuture完成你的主程序,这样,一旦你的业务逻辑中你得到关闭的命令,你关闭主要通道,因此你的主线程也在关闭。

例如参见Shutdown netty programmatically