2016-10-26 17 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