在jfinal中使用netty的关闭问题

发布于 2021-11-29 16:50:23 字数 2024 浏览 863 评论 11

为了提高系统性能, 要在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

屌丝范 2021-12-04 18:30:46

回复
换了, 还是不行~

一人独醉 2021-12-04 18:30:46

@韩斌 c3p0 换 druid 了没?

贱贱哒 2021-12-04 18:30:46

刚试了下, 还是不行的. 我先用System.exit(0);来关闭掉. 让程序先跑起来. 这个关闭的问题完了再继续研究

沙与沫 2021-12-04 18:29:41

@韩斌 启动在调试模式下,然后看一下有多少线程正在运行,确保所有线程都是 daemon的,这样才能在tomcat退出时自动退出这些线程

回眸一笑 2021-12-04 18:26:58

   把这句:new PreServer().start(); 改为以下三句即可打完收工:

PreServer ps = new PreServer();
ps.setDaemon(true);
ps.start();

   如果还是不行,再查找其它地方是否也有线程没有设置为 daemon 的问题,例如 c3p0,这个是 java 基础问题。

柒夜笙歌凉 2021-12-04 17:34:57

能详细说下么?

终陌 2021-12-04 16:39:41

回复
用netty的原因是不是连接数很多,用jfinal的原因是不是连接数很少的管理界面?如果是这个场景的话,netty和jfinal分成两个服务开发,jfinal通过调用netty编写的接口(传json之类)来控制netty或者读取netty的状态信息。

别再吹冷风 2021-12-04 16:32:39

回复
还有一种做法就是netty连一些协议比较轻量的数据库(memcache/redis)把状态信息写进去,然后jfinal开发的网站读写这些状态信息进行操作。

嘦怹 2021-12-03 02:38:36

回复
再有一种做法就是jfinal提供一些简单的http接口给netty,如果netty需要记录什么东西,netty调用jfinal的接口,通过jfinal把东西记录下来(比如插入什么数据到数据库,或者写什么数据到文件之类的)。

复古式 2021-11-30 13:52:37

回复
无论怎么做要看你的场景,我可能没理解对你的场景,那我说的方案都是不可行的。所以需要你自己取舍。最简单就是System.exit,这个方法并不差,操作系统会帮你回收该回收的,一般不会造成太多问题。除非你的服务本身设计得毫无抗打击性(服务器断电后无法恢复)。

泛滥成性 2021-11-30 12:46:33

System.exit这个方案一般没问题,操作系统会帮你回收socket/打开的文件/大部分持有的锁

另一方面,netty和jfinal放一起这种架构不太合适,推荐netty做管理类的API,然后jfinal另开一个网站调用api生成页面。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文