簡體   English   中英

設置了jsch會話后,它是否擁有錯誤流,並且沒有其他線程可以使用它嗎?

[英]Does jsch session own error stream, when it is set, and no other thread can use it?

我正在創建jsch會話以遠程運行命令,並且遇到了奇怪的行為。 在我的一個線程中,我創建會話,將輸出流設置為System.err並使用該會話。

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之后沒有出現記錄器消息?

如果有人可以解釋這一點,那將非常有用。

您可以在此處找到Jsch javadoc的在線副本。 此頁面記錄ChannelExec setErrStream()單參數版本的描述是這樣的(強調):

公共無效setErrStream(OutputStream out)

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

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

該文檔描述setErrorStream()另一個版本,版本setErrorStream()兩個參數:

public void setErrStream(OutputStream out,boolean dontclose)

設置錯誤流。 遠程進程的標准錯誤輸出將發送到此流。

參數:

dontclose-如果為true,則不關閉Channel.disconnect(com.jcraft.jsch.Session)上的流。

換句話說,使用此功能的版本,您可以控制在斷開通道時是否應關閉錯誤流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM