繁体   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