Как я могу закрыть поток вывода после включения JSP - PullRequest
0 голосов
/ 06 мая 2010

У меня есть веб-страница, которая выполняет вызов ajax для получения некоторых данных. Эти данные требуют много времени для вычисления, поэтому то, что я сделал, было первым вызовом ajax-сервера, который возвращает «loading ...», а затем поток продолжает вычислять данные и сохранять их в кеше. тем временем клиентский javascript проверяет каждые несколько секунд с помощью другого ajax-вызова, чтобы узнать, загружен ли кеш еще.

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

...getServletContext().getRequestDispatcher(jsppath).include(request, response);

тогда я использую этот поток, чтобы сделать вычисления. Я не против связать поток веб-сервера с этим, но я хочу, чтобы браузер получил ответ, а не ждал, пока сервер закроет сокет.

Я не могу сказать, закрывает ли сервер сокет после включения, но я предполагаю, что это не так.

Так как я могу принудительно закрыть поток после того, как записал свой ответ, прежде чем начинать свои длинные вычисления?

Я пытался

o = response.getOutputStream();
o.close();

но я получаю исключение о недопустимом состоянии, сообщающее, что выходной поток уже получен (предположительно включенным jsp)

Итак, мои вопросы:

  1. - веб-сервер, закрывающий сокет (я полагаю, нет, потому что вы всегда можете включить другой jsp)

  2. если, как я предполагаю, не закрывать сокет, как мне это сделать?

1 Ответ

2 голосов
/ 06 мая 2010

Я не вижу, как можно даже закрыть OutputStream, если вычисления все еще продолжаются в том же потоке.

Вам нужно начать вычисления в новом потоке и просто вернуться из сервлета, и ответ будет отправлен обратно автоматически.

Если вам действительно нужно закрыть писателя, сделайте это,

  response.getWriter().close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...