Ignite 中的 PrintWriter 之谜

PrintWriter mystery in Ignite

我正在使用两个节点,一个从 IDE (Intellij IDEA) 开始计算,另一个已经在控制台上启动(启用远程调试)。我正在从 IDE.

进行调试

我没有使用 peerClassLoading,我已将 jar 放在控制台节点的库中。

有一行代码:System.out.println(x); - 两者都可以正常打印。但是下面几行:

getPrintWriter().println(x);
getPrintWriter().flush();

仅在从 IDE 开始的节点上工作。 PrintWriter 包装了一个 System.out。控制台节点抛出 IOException - 'the file handle is invalid' during flush.

这是堆栈跟踪的屏幕截图:

这里是与控制台节点相关的代码部分:


根据建议,我重新设置了打印机,问题就解决了。这是屏幕截图:


序列化上下文

这是启动点火计算的代码部分:

对于控制台 JVM 上的节点,ConsoleClient 被序列化,因此它包含 类(命令、侦听器及其打印编写器等)。在列表 clients 中,所有 ConsoleClient 对象都将它们的打印编写器作为 System.out 的包装器,因此理想情况下,不需要运行中的标记块。请注意,如果删除此标记的块,IDE 节点会正确打印,但控制台节点不会打印。

这个 PrintWriter 试图委托给 FileOutputStream,所以它要么不在下面 System.out,要么 System.out 被替换了。 Ignite 从不这样做,所以这个问题与它无关。您应该检查 getPrintWriter() 方法的代码并确保 System.out 是您正在寻找的控制台编写器。