线程池执行时抛出异常时线程会发生什么?
它会终止并被垃圾收集吗?
背景故事:
我正在使用a ScheduledThreadPoolExecutor
来不时地运行任务,而且它也被Netty使用.现在,使用此应用程序的客户告诉我,他们有时会注意到一堆客户端随机断开连接,每次发生这种情况时,都会记录来自单独的非网络相关任务的堆栈跟踪.我的假设是线程被中断并且垃圾被收集,因此Netty丢失了对线程的任何引用并断开了分配的tcp客户端.
我在 IntelliJ 中构建了一个简单的程序,并使用使用依赖项 io.netty 的 Maven。我已经添加到我的 POM 文件中:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.0.Beta1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
为了编译并获取 jar 文件,我通常这样做:
但是我注意到依赖项没有添加到 jar 中,既不存在于目标文件夹中(或其任何子文件夹中),也不像通常情况那样添加到资源文件夹中。
为了将 io.netty 库添加到 jar 中,我尝试过:
我还链接了其他几个库,包括:
谢谢阅读。
为什么channelRead()没有给我发送到服务器的完整消息?当消息超过140字节时(有时,有时更多,有时更少),有时会发生碎片。我正在使用使用NioServerSocketChannel类的TCP套接字。
我正在使用4.1.0.Beta5。
到达后,没有办法阅读完整的消息吗?
this.serverBootstrap = new ServerBootstrap();
this.serverBootstrap.group(new NioEventLoopGroup(1), new NioEventLoopGroup(6))
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>()
{
@Override
public void initChannel(SocketChannel ch) throws Exception
{
ch.pipeline().addLast(new TestServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG, (int)Short.MAX_VALUE)
.option(ChannelOption.SO_RCVBUF, (int) Short.MAX_VALUE)
.option(ChannelOption.SO_KEEPALIVE, true)
.option(ChannelOption.TCP_NODELAY, true);
this.serverBootstrap.bind(this.host, this.port);
Run Code Online (Sandbox Code Playgroud)
而TestServerHandler类扩展了ChannelInboundHandlerAdapter:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
String s = buffer.toString(CharsetUtil.UTF_8);
for(int i = 0; i < 20; i++)
{
s = s.replace("[" + ((char)i) + "]", i + "");
}
System.out.println(s.length() + "");
System.out.println();
System.out.println();
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
我需要一种方法来在完全到达服务器时获取完整的bytebuf / …