JFinal 集成 Netty 不能启动web服务

@JFinal  你好

为要做的新项目做个技术调研,想使用JFinal 和 Netty ,把Netty 通信服务于JFinal 集成使用,但是在做试验时在afterJFinalStart()中启动Netty 的TCP的服务端,Netty 相关代码如下(官网示例):

    public class NettyServerBootstrap {
        private int port;

        public NettyServerBootstrap(int port) {
		this.port = port;
		bind();
	}

	private void bind() {

		EventLoopGroup boss = new NioEventLoopGroup();
		EventLoopGroup worker = new NioEventLoopGroup();
		try {
			ServerBootstrap bootstrap = new ServerBootstrap();
			bootstrap.group(boss, worker);
			bootstrap.channel(NioServerSocketChannel.class);
			bootstrap.option(ChannelOption.SO_BACKLOG, 1024); //连接数
			bootstrap.option(ChannelOption.TCP_NODELAY, true);  //不延迟,消息立即发送
			bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); //长连接
			bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
				@Override
				protected void initChannel(SocketChannel socketChannel)
						throws Exception {
					ChannelPipeline p = socketChannel.pipeline();
					p.addLast(new NettyServerHandler());
				}
			});
			ChannelFuture f = bootstrap.bind(port).sync();
			if (f.isSuccess()) {
				System.out.println("启动Netty服务成功,端口号:" + this.port);
			}
			// 关闭连接
			f.channel().closeFuture().sync();

		} catch (Exception e) {
			System.out.println("启动Netty服务异常,异常信息:" + e.getMessage());
			e.printStackTrace();
		} finally {
			boss.shutdownGracefully();
			worker.shutdownGracefully();
		}
	}
    }

afterJFinalStart()中启动:

public void afterJFinalStart(){
    NettyServerBootstrap server = new NettyServerBootstrap(8899);
}

这样Netty 的TCP服务能够成功启动,但是jeety.start()不能启动,这个web不能访问。

还请大神指点!


评论区

JFinal

2017-02-09 14:01

new NettyServerBootstrap(8899); 这行代码是否阻塞了当前线程,试试让这行代码放在新创建的线程之中,搞定后回来反馈一下

toni

2017-02-10 21:32

f.channel().closeFuture().sync(); 这句话会堵塞的。

toni

2017-02-10 21:37

@toni 这句可以考虑放到 别的线程里 ,或者直接不要。

空指针

2017-02-13 11:40

问题确实是出在f.channel().closeFuture().sync(); 当执行到这一步时阻塞了当前线程。按照 @JFinal 提供的新创建线程解决。

具体解决办法是让Netty的功能类 NettyServerBootstrap 实现Runnable接口:

public class NettyServerBootstrap implements Runnable

并将bind()方法中的具体操作在run()方法中实现:

@Override
public void run() {
bind();
}

启动Netty时,还是在afterJFinalStart()方法中调用即可。

解决思路如此,就不在贴代码了 。

百年孤寂

2017-06-26 11:48

@空指针 请教大神,你是怎么做的?

百年孤寂

2017-06-26 11:49

@空指针 我按照思路做了下,发现网站的线程还是阻塞的

烟雨

2017-10-31 15:58

@空指针 贴代码看看啊,我也遇到这问题了,被阻塞然后项目起不来了!

空指针

2017-11-16 17:16

@百年孤寂 @烟雨
让Netty的功能类 NettyServerBootstrap 实现Runnable接口 就可以了。看上面的回复,其实是有代码的。

mydq

2017-12-04 15:10

@空指针 @烟雨
new Runnable() {
@Override
public void run() {
try {
f.channel().closeFuture().sync();// 关闭连接
} catch (InterruptedException e) {
e.printStackTrace();
log.info("关闭异常..........................");
}
}
};
这样就可以了 不用实现的 如果用实现Runnable还是一样回锁死

why_Sailor

2018-05-25 09:23

@JFinal @Override
public boolean start() {
System.err.println("netty Startup!");
new Thread(){
@Override
public void run(){
try {
new NyServer().bind(NyComMsgConst.PORT);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
System.err.println("netty end!");
return true;

}
这样写可以,帮忙看看有什么弊端吗

maxwade

2019-09-04 22:44

想和你讨论下netty编解码及如何注入数据库查询

热门反馈

扫码入社