在jfinal中使用netty的关闭问题
为了提高系统性能, 要在JFinal中使用netty框架. 现在的情况是这样的:
public class PreServer extends Thread { private static final Logger logger = Logger.getLogger(PreServer.class); boolean isClose = false; static final int PORT = 8007; // Configure the server. EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); @Override public void run() { try { b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 100) .handler(new LoggingHandler(LogLevel.INFO)). childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); // p.addLast(new LoggingHandler(LogLevel.INFO)); p.addLast(new PreServerHandler()); } }); // Start the server.通过调用sync同步方法阻塞直到绑定成功 ChannelFuture f = b.bind(PORT).sync(); logger.info(PreServer.class.getName() + " started and listen on " + f.channel().localAddress()); // Wait until the server socket is closed. f.channel().closeFuture().sync(); logger.info("netty started....~~~"); } catch (InterruptedException e) { logger.error("netty started failure..."); e.printStackTrace(); } finally { // Shut down all event loops to terminate all threads. logger.info("netty closed"); bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }
然后在afterJFinalStart中启动netty.
public void afterJFinalStart(){ try { new PreServer().start(); } catch (Exception e) { logger.error("启动socket失败...."); e.printStackTrace(); } logger.info("server started..."); }运行起来跑得很好. 可是, 正常关闭tomcat的时候, netty不能完全退出. 已经连上来的客户端会持续工作~~
各位大神, 有没有什么好的方案.
--------------------
直接用System.exit(0);退出如何呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
回复
换了, 还是不行~
@韩斌 c3p0 换 druid 了没?
刚试了下, 还是不行的. 我先用System.exit(0);来关闭掉. 让程序先跑起来. 这个关闭的问题完了再继续研究
@韩斌 启动在调试模式下,然后看一下有多少线程正在运行,确保所有线程都是 daemon的,这样才能在tomcat退出时自动退出这些线程
把这句:new PreServer().start(); 改为以下三句即可打完收工:
如果还是不行,再查找其它地方是否也有线程没有设置为 daemon 的问题,例如 c3p0,这个是 java 基础问题。
能详细说下么?
回复
用netty的原因是不是连接数很多,用jfinal的原因是不是连接数很少的管理界面?如果是这个场景的话,netty和jfinal分成两个服务开发,jfinal通过调用netty编写的接口(传json之类)来控制netty或者读取netty的状态信息。
回复
还有一种做法就是netty连一些协议比较轻量的数据库(memcache/redis)把状态信息写进去,然后jfinal开发的网站读写这些状态信息进行操作。
回复
再有一种做法就是jfinal提供一些简单的http接口给netty,如果netty需要记录什么东西,netty调用jfinal的接口,通过jfinal把东西记录下来(比如插入什么数据到数据库,或者写什么数据到文件之类的)。
回复
无论怎么做要看你的场景,我可能没理解对你的场景,那我说的方案都是不可行的。所以需要你自己取舍。最简单就是System.exit,这个方法并不差,操作系统会帮你回收该回收的,一般不会造成太多问题。除非你的服务本身设计得毫无抗打击性(服务器断电后无法恢复)。
System.exit这个方案一般没问题,操作系统会帮你回收socket/打开的文件/大部分持有的锁
另一方面,netty和jfinal放一起这种架构不太合适,推荐netty做管理类的API,然后jfinal另开一个网站调用api生成页面。