Я работаю над Java веб-приложением, которое выполняет команды в командной строке в фоновом режиме и отображает результаты на веб-странице. Я уже реализовал несколько команд, и все работает нормально, но теперь у меня есть асинхронная команда, которая постоянно отправляет данные в командную строку, пока она не остановится. Я был близок к тому, чтобы сдаться, когда я узнал о AJAX и снова нашел новую надежду выполнить команду через JavaScript, но теперь я снова зашел в тупик, так как не могу найти способ постоянно отправлять данные на jsp.
Итак, мой вопрос: Возможно ли вообще постоянно читать из командной строки и постоянно перенаправлять вывод в jsp, пока не будет остановлена другой кнопкой? ?
Это кнопка, которая должна начинаться с асин c чтения:
<input type="button" onclick="sendRequest();" name="async" value="Start asynchronous reading"/>
Следующие JavaScript -коды AJAX:
var xmlhttp = new XMLHttpRequest();
function sendRequest() {
url = "../TestServlet";
xmlhttp.open("POST", url, true);
xmlhttp.onreadystatechange = handleRequest;
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(createQueryString());
}
function createQueryString() {
return "async=true";
}
function handleRequest() {
if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
alert("Response: "+xmlhttp.responseText);
}
}
Мой сервлет имеет следующий (тестовый) код для выполнения команды (я взял ping для тестирования, поскольку он также регулярно отправляет данные, но останавливается автоматически)
response.setContentType("text/html;charset=UTF-8");
try {
ProcessBuilder pb = new ProcessBuilder();
pb.command("ping", "192.168.116.1"); //Test-command
Process process = pb.start();
Thread clThread = new Thread(() -> {
StreamGobbler streamGobbler = new asyncTest.StreamGobbler(process.getInputStream(), System.out::println); //everything that's printed here with sout should be forwarded to the jsp
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(streamGobbler);
executor.shutdown();
});
clThread.start();
process.waitFor();
System.out.println("Task dispatched");
}catch(Exception e) {
System.out.println(e.toString());
}
Единственное возможное решение, о котором я мог подумать, - это сброс ReadyState к 0, когда команда завершается, чтобы создать как al oop, остановленный только при нажатии Stop-Button , но я не знаю, если это компилируемо.
Редактировать после ответа Jaromanda X ' : Для доступа к частичным данным я изменил if в JavaScript на readyState == 3 , но я до сих пор не знаю, куда мне направить данные в моем сервлете (возможно, с response.getWriter () .println ();
.