2016-10-26 21 views
0

我使用了两个节点,一个是从IDE(Intellij IDEA)启动计算,另一个是已经在控制台启动(启用远程调试)的另一个节点。我正在从IDE进行调试。PrintWriter在点燃中的神秘

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

有一行代码:System.out.println(x); - 在两种打印都很好。但以下几行:

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

只能在从IDE启动的节点上工作。 PrintWriter包装一个System.out。控制台节点在刷新期间抛出IOException - '文件句柄无效'。

这里是堆栈跟踪的截图:

enter image description here

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

enter image description here


提出以下建议,我重置了打印作者,问题已解决。下面是截图:

enter image description here


序列化语境

下面是一个启动的点火计算的部分代码:

enter image description here

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

+0

你能展示完整的痕迹吗? –

回答

1

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

+0

重置打印作者解决了问题(请参阅问题编辑中的屏幕截图)。但是,我仍然不清楚编组过程(监听器最初是在IDE过程中创建的,但是在控制台JVM上执行)创建了一个非null但不同的printwriter。我意识到我不应该依赖printwriter序列化,因为它是系统特定的(http://stackoverflow.com/q/27731969/225866),但是如果您可以提供一些指向Ignite中使用的序列化过程的指示以及我可以如何挖掘通过调试器进入它,那会很棒。 – Susanta

+0

看起来你的班上发生了这种情况,不是吗?你为什么认为它与Ignite序列化协议有某种联系? –

+0

我编辑了添加序列化上下文的问题。 – Susanta