临床表现
主要的情况,便是今天在调试Netty的时候,准备利用Http接口来调用 Netty 来实现某种业务需求的开发图中。突然发现,服务器之中的所有Http接口无法正常响应。
启动服务器,运行Netty , 接口输出异常。
关闭服务器,关闭Netty,重启服务器,接口正常输出。
只要Netty一开,就有问题。netty一关,问题再见!!
主要病因
看到这里,屏幕前的你可能也正为这件事发愁,也十分的焦急的想知道问题的方法。因此,我先告诉大家:
解决方案:
打开最后配置与启动Netty的那个Java文件。最特别是这两句:
ChannelFuture = boostrap.bind(socketAddress).sync();
future.channel().closeFuture().sync()
//当然也包括前面还有后面 try , finnally 里面语句也算
//PS.不要问我为什么不全复制出来
把上面我所说到的代码,全部放入一个 Thread 内部 ,简单的说,就是让Netty的启动,与我们程序的启动不能再同一个线程内启动。
问题原因:
如果,你耐心的看完上面的信息,你就会知道,问题的主要原因,便是Netty启动之后的导致的线程阻塞
。socket 接收消息会导致线程阻塞,这个大家应该都知道,但是,我们不知道的是sync(),竟然不会帮助我们直接将接受消息的逻辑直接进入异步,这我们还挺蛋疼的。
PS:最重要的是,大家在网上,初学Netty的时候。大家其实都差不多看的都是同样的内容,所以大家都算同门师兄弟,结果师父本身代码有问题,结果把下面的人全拖垮了
最后的话
多一句嘴,大家在写Thread的时候,要注意一点。如果你没有很好让这个netty线程与主线程一起关闭的策略,就最好设置成守护线程。虽然我之前没加,没有看见太大的问题。但是,最好还是保持安全一点的策略。