Остановка потока сервера при прекращении клиентского соединения - PullRequest
0 голосов
/ 06 декабря 2018

Я запускаю следующий код на моей машине, а sample.jsp запускается на моем сервере Tomcat.В файле sample.jsp код выполняется в бесконечном цикле.

public static void main(String[] args) throws Exception {

    URL obj = new URL("http://localhost:8080/bank/sample.jsp");
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    con.setRequestMethod("GET");

    if (con.getResponseCode() == HttpURLConnection.HTTP_OK) { // success

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try(BufferedInputStream stream = new BufferedInputStream(con.getInputStream()) ) {

            byte[] buffer = new byte[1024];


            int bytesRead = 0;
            while ( (bytesRead = stream.read(buffer)) > 0 && byteArrayOutputStream.size() <= 1024 * 100) {
                byteArrayOutputStream.write(buffer, 0, bytesRead);
            }
        }

        if(byteArrayOutputStream.size() > 1024 * 100){
            stream.close();
            con.disconnect();
            throw new Exception("content too big.  hence terminating...");
        }
    }
}

Ниже приведен код в моем jsp:

<%@page import = "java.io.File" %>
<%@page import = "java.io.FileWriter" %>
<%
for(long i=0;i < 10;)
{
out.println("HelloHelloHelloHelloHelloHello");
}
%>

Я закрываю соединение, а также открываемый поток, когда выходной поток превышает определенный размер.Это не останавливает процесс, запущенный на моем сервере Tomcat.Но я хочу остановить программу на стороне сервера, когда соединение закрыто со стороны клиента.Я также не получаю IOException, и поток, кажется, работает бесконечно.Может кто-нибудь помочь мне о том, как остановить поток.

1 Ответ

0 голосов
/ 11 декабря 2018

Поток на сервере будет продолжать работать до тех пор, пока не завершит работу, если только он не попытается записать выходные данные клиенту, а клиент разорвал соединение.В этом случае будет выдано IOException, и поток обработки запросов, скорее всего, остановит выполнение вашего приложения и будет возвращен в контейнер.

Если у вас бесконечный цикл, то код насервер будет работать бесконечно.

Нет хорошего способа прервать застрявший поток на сервере приложений;это не относится только к Tomcat.

...