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