Как установить тайм-аут чтения на канале Jsch exec - PullRequest
0 голосов
/ 08 октября 2019

Я использую 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 после подключения?

...