gpt4 book ai didi

java - 由于在 channel 关闭后写入 channel 而出现 ClosedChannelException

转载 作者:行者123 更新时间:2023-12-01 12:19:57 25 4
gpt4 key购买 nike

我们的架构要求有两个并发工作流程:

  1. 将内容写入 netty 处理程序外部的 netty channel 。
  2. netty正常的生命周期。 (连接、关闭、重新连接..)

我们得到了 ClosedChannelException,它似乎通过查看堆栈跟踪(Netty 3.7)向执行器线程池传播错误。

java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:265)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:456)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool$UnpooledSendBuffer.transferTo(SocketSendBufferPool.java:203)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.write0(AbstractNioWorker.java:202)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromTaskLoop(AbstractNioWorker.java:152)
at org.jboss.netty.channel.socket.nio.AbstractNioChannel$WriteTask.run(AbstractNioChannel.java:335)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:366)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:290)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

我的问题是:

  1. 它真的会破坏执行器线程池吗?我担心的情况: 。如果可以的话,我会重新设计代码(糟糕的遗留代码)。让我更清楚地解释我担心的情况:一些数据写入旧的关闭 channel (由于异步行为,尚未实际写入)->通过重新连接到另一个地址创建新 channel ->数据实际上已写入由于异步属性,旧 channel 。
  2. 如何在netty channel 的close和write中处理这样的并发?

最佳答案

Does it really corrupt the executors thread pool?

没有。

看来您的代码(可能是“在 netty 处理程序之外将内容写入 netty channel ”的内容)已提前关闭 channel 。 (正如 @EJP 评论的那样,这是你的代码中的一个错误......)

这不会破坏工作线程,但它可能导致客户端收到不完整的响应。

The case I am worried about: some data written to the old closed channel, and a newly created channel (reconnected to another address), will the ClosedChannelException mess things up?

旧的关闭 channel 和新 channel 将无关。

How can I handle such concurrency in close and write of netty channel?

重新设计您的代码,以便只有正常的 Netty“工作流程”才会关闭 channel 。让两个“工作流”共同负责关闭会导致问题,特别是因为其中一个(正常的 Netty 工作流)被硬编码为认为问题只针对它。

关于java - 由于在 channel 关闭后写入 channel 而出现 ClosedChannelException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26748897/

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