gpt4 book ai didi

java - 关闭 Netty 服务器本身

转载 作者:太空宇宙 更新时间:2023-11-04 09:27:33 25 4
gpt4 key购买 nike

我正在使用 Netty 服务器来解决这个问题:逐行读取一个大文件并处理它。在单台机器上执行此操作仍然很慢,因此我决定使用服务器向客户端提供数据 block 。这已经有效,但我还想要的是服务器在处理整个文件时自行关闭。我现在使用的源代码是:

public static void main(String[] args) {
new Thread(() -> {
//reading the big file and populating 'dq' - data queue
}).start();

final EventLoopGroup bGrp = new NioEventLoopGroup(1);
final EventLoopGroup wGrp = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(new StringDecoder());
p.addLast(new StringEncoder());
p.addLast(new ServerHandler(dq, bGrp, wGrp));
}
});
ChannelFuture f = b.bind(PORT).sync();
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}

class ServerHandler extends ChannelInboundHandlerAdapter {
public ServerHandler(dq, bGrp, wGrp) {
//assigning params to instance fields
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
//creating bulk of data from 'dq' and sending to client
/* e.g.
ctx.write(dq.get());
*/
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
if (dq.isEmpty() /*or other check that file was processed*/ ) {
try {
ctx.channel().closeFuture().sync();
} catch (InterruptedException ie) {
//...
}
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
ctx.close();
ctx.executor().parent().shutdownGracefully();
}
}

channelReadComplete(...) 方法中的服务器关闭是否正确?我担心的是,仍然可能有另一个服务的客户端(例如,在其他客户端中发送大量数据,并且当前客户端到达“dq”的末尾)。

基本代码来自 netty EchoServer/DiscardServer 示例。

问题是:当达到特定条件时如何关闭 netty 服务器(从处理程序)。

谢谢

最佳答案

您无法从处理程序关闭服务器。您可以做的是向另一个线程发出信号,指示它应该关闭服务器。

关于java - 关闭 Netty 服务器本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57492408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com