2016-03-02 27 views
0

我正在創建jsch會話來遠程運行命令,而且我正面臨一種奇怪的行爲。 在我的一個線程中創建會話,將輸出流設置爲System.err並使用會話。jsch會話是否擁有錯誤流,當它被設置時,沒有其他線程可以使用它?

ChannelExec channel = (ChannelExec) session.openChannel("exec"); 
channel.setErrStream(System.err); 

在另一個線程我有一些東西,它使用Java util的記錄器(默認情況下將日誌寫入System.err)。 一旦創建了jsch會話,我就不會在第二個線程的控制檯中看到記錄器消息。當我刪除此行:

channel.setErrStream(System.err); 

或設置通道的錯誤流爲null,從我的第二個線程記錄消息將顯示在控制檯就好了。

如果jsch會話在設置時擁有System.err流,並且這就是記錄器無法使用的原因,那麼當會話的錯誤流設置爲null時會發生什麼?如果不是這種情況,那麼爲什麼在使用System.err進行會話開始後不會出現記錄器消息?

如果有人能解釋這一點,那將是非常有用的。

回答

0

你可以找到Jsch javadoc here的在線副本。 This page文件。該single-argument version of setErrStream()的描述說,這(強調):

公共無效setErrStream(OutputStream中出)

設置錯誤流。遠程進程的標準錯誤輸出將被髮送到此流。 流將在Channel.disconnect(com.jcraft.jsch.Session)上關閉。

換句話說,將System.err傳遞給此函數將導致Jsch在斷開通道時關閉它。一旦System.err關閉,程序的其他部分(如記錄器)就無法寫入System.err。

該文檔描述了another version of setErrorStream()這需要兩個參數:

公共無效setErrStream(OutputStream中出來,布爾dontclose)

設置錯誤流。遠程進程的標準錯誤輸出將被髮送到此流。

參數:

dontclose - 如果是真的,我們不關閉在Channel.disconnect(com.jcraft.jsch.Session)流。

換句話說,這個版本的函數允許您控制斷開通道時是否關閉錯誤流。

+0

非常感謝您的解釋!現在這是有道理的。並且可能當我沒有設置錯誤流時,默認情況下它將被設置爲System.err,其版本爲2個參數,選項可以在斷開連接後保持打開狀態。 – Jessy

相關問題