Я использую Jsch с каналом exec. Я могу подключиться очень хорошо, но я хочу, чтобы время ожидания истекло, если по какой-то причине данные не приходят через некоторое время и соединение не закрывается. То есть когда зависает удаленный процесс. Через отладку я вижу, что Socket.setSoTimeout () вызывается с аргументами 2000 и 5000 (неоднократно, как я пытался установить его в нескольких местах), но exec просто блокирует, пока соединение не будет закрыто. Вот код:
String host = "192.168.99.100"; // docker-machine default
String user = "docker";
String command1 = "./junk.sh";
try {
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
jsch.addIdentity("C:\\Users\\johnsmith\\.docker\\machine\\machines\\default\\id_rsa"
// , "passphrase"
);
Session session = jsch.getSession(user, host, 22);
session.setConfig(config);
session.setTimeout(2000);
session.connect(2000);
session.setTimeout(2000);
System.out.println("Connected");
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command1);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
channel.connect(5000);
session.setTimeout(5000);
byte[] buf = new byte[1024];
int read;
while ((read = in.read(buf, 0, buf.length)) >=0) {
System.out.println(".");
System.out.print(new String(buf, 0, read));
if (channel.isClosed()) {
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
}
channel.disconnect();
session.disconnect();
System.out.println("DONE");
}
catch (Exception e) {
e.printStackTrace();
}
Где junk.sh просто делает:
echo "some text"
sleep 15
echo "all done here"
Я ожидаю исключения около 2 секунд после чтения. Но он обычно завершается:
Connected
.
some text
.
all done here
DONE
Как настроить ChannelExec на тайм-аут чтения? В качестве отступления: почему необходимо сначала установить для inputStream значение null? channel.setInputStream(null)
Если я получу входной поток от канала до соединения, я пропущу первую часть, "некоторый текст". Почему это? Я думаю, вы получите InputStream после подключения?