Сервлеты, длительные операции - PullRequest
1 голос
/ 17 мая 2010

Я выполняю рефакторинг большого фрагмента кода, когда в сервлете выполняется долгая операция взятия. Теперь иногда я не получаю ответ после завершения операции. (Закончено, потому что напечатано в журналах)

То, чего я хотел бы достичь, - это какое-то поведение «запустить и забыть» со стороны сервлета. Я передал бы свои параметры в действие, и сервлет немедленно вернул бы статус (что-то вроде: операция началась, проверьте ваши журналы для дальнейшей информации)

Возможно ли это с сервлетом 2.5 spec? Я думаю, что я мог бы получить такое поведение с JMS, может быть, есть какие-то другие решения?

Ответы [ 4 ]

3 голосов
/ 17 мая 2010

Асинхронные сервлеты будут служить вашим целям, но они доступны только как часть спецификации Servlet 3.0. Вы можете прочитать больше об Async Servlets здесь

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

Есть несколько способов сделать это. Асинхронные сервлеты являются частью Servlet API 3.0. Я знал многих людей, которые запускали отдельный поток, обычно поток демона. Недостаток создания собственных потоков состоит в том, что вы теряете все свои «контейнерные» преимущества, поскольку поток работает более или менее независимо в JVM. Чаще всего я использовал бин, управляемый сообщениями, который подается JMS, он работает в контейнере EJB со всеми вытекающими отсюда преимуществами и недостатками. YMMV.

1 голос
/ 17 мая 2010

Вместо того, чтобы запускать (и управлять) своими собственными шагами, вы должны рассмотреть возможность использования абстракции ExecutorService Java (платформа Executor / Future). Если вы используете Spring, вы можете определить Executor как еще один bean-компонент в контексте Spring, и ваш сервлет может просто вызвать его, передавая вашу задачу как экземпляр Runnable. Там должно быть много образцов, если вы его Google.

1 голос
/ 17 мая 2010

Если обновление до Servlet 3.0 (часть Java EE 6, в которой Glassfish v3 является единственной реализацией; Tomcat 7 все еще находится в процессе разработки и ожидается в следующем месяце), не является вариантом, то альтернативой является Комета . Почти все сервлетконтейнеры Java имеют средства для этого. Неясно, какой из них вы используете, поэтому вот целевой документ Tomcat 6: Что такое Apache Tomcat Comet API .

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

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