[英]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.