jsch 会话是否拥有错误流,当它被设置时,没有其他线程可以使用它



我正在创建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的在线副本。本页记录了ChannelExecsetErrStream()的单参数版本的描述是这样说的(强调):

public void setErrStream(OutputStream out)

设置错误流。远程进程的标准错误输出将发送到此流。该流将在 Channel.disconnect(com.jcraft.jsch.Session) 上关闭

换句话说,将 System.err 传递给此函数将导致 Jsch 在断开通道连接时关闭它。一旦 System.err 关闭,程序的其他部分(如记录器)将无法写入 System.err。

该文档描述了另一个版本的setErrorStream(),它采用两个参数:

public void setErrStream(OutputStream out, boolean dontclose)

设置错误流。远程进程的标准错误输出将发送到此流。

参数:

dontclose - 如果为 true,我们不会关闭 Channel.disconnect(com.jcraft.jsch.Session) 上的流。

换句话说,此版本的函数允许您控制在断开通道连接时是否应关闭错误流。

最新更新