Как разрешить сервлет-контейнеру (Tomcat) прерывать / уничтожать запрос сервлета? - PullRequest
0 голосов
/ 24 декабря 2009

Я новичок в сервлете, я использовал следующий код для чтения некоторого inputStream,

class MyServlet implements Servlet{
  void service(ServletRequest req, ServletResponse res){
  InputStream inA, inB, inC;
   //...
   inA.read(); // May block
   inB.read(); // May block
   inC.read(); // May block
   // ...
   }
 }

Как разрешить сервлет-серверу (Tomcat) прерывать / уничтожать MyServlet через некоторое настраиваемое время. И в этом случае какой метод (ы) он будет вызывать?

спасибо заранее ,,,

Ответы [ 3 ]

2 голосов
/ 24 декабря 2009

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

Самый простой способ может состоять в том, чтобы порождать трудоемкий процесс в отдельном потоке, вызывать его и устанавливать время ожидания для этого вызова. Вы можете легко это сделать, используя объект FutureTask и вызывая get () , указав тайм-аут. Вы получите TimeoutException, если задача занимает слишком много времени, и вы можете использовать сервлет, чтобы сообщить об этом (приятно) пользователю.

например. (очень просто)

FutureTask f = new FutureTask(new Runnable{...});
try {
   Object o = f.get(TIMEOUT, UNITS)
   // report success
}
catch (TimeoutException e) {
   // report failure
}
1 голос
/ 24 декабря 2009

Вы не вызываете эти методы, контейнер делает.

Я бы удивился, почему ты это сделал. Вы действительно хотите перечитывать эти файлы при каждом запросе? Если вам нужно содержимое, я бы предпочел, чтобы вы прочитали их в методе init и кэшировали их.

0 голосов
/ 24 декабря 2009

Это, пожалуй, лучшее приближение без использования собственных потоков: метод service может выдавать javax.servlet.UnavailableException , который будет сигнализировать контейнеру о том, что сервлет недоступен временно или постоянно.

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