2009-12-24 6 views
0

Я новичок в Servlet, я использовал следующий код, чтобы прочитать некоторые InputStream,Как разрешить контейнер сервлетов (Tomcat) прерывать/уничтожать запрос сервлета?

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 после некоторого настраиваемого времени. И в этом случае, какой метод (ы) он вызовет?

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

+0

Какое функциональное требование? Прямо сейчас вы спрашиваете, как достичь решения, которое, по вашему мнению, является решением вашего функционального требования. Но это решение воняет. Вы действительно не хотите, чтобы сервлет выполнялся в течение нескольких минут и, конечно же, не имел контроля над прерыванием запроса. Опять же, уточните функциональное требование, тогда мы можем предложить гораздо лучшие решения. – BalusC

+0

для вопросов, моя служба не должна обрабатывать больше определенного времени, если это так должно закончиться. т. е. ничего не делать, а затем повторять попытку в указанное время до его успеха. Надеюсь, мои функциональные требования ясны? спасибо – mebada

ответ

1

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

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

+0

спасибо ,,, как метод сервлетов прерывания контейнера? Мне просто нужно прервать метод обслуживания, если требуется определенное время больше предложений? – mebada

+0

Возможно, вы можете сделать это с помощью java.nio или обернуть его в таймер. Но API сервлета не должен быть частью решения. Это проблема ввода-вывода. – duffymo

+0

является таймером Сохранить для использования в сервлетах? – mebada

2

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

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

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

FutureTask f = new FutureTask(new Runnable{...}); 
try { 
    Object o = f.get(TIMEOUT, UNITS) 
    // report success 
} 
catch (TimeoutException e) { 
    // report failure 
} 
+0

Сохраняется ли использование потоков в сервлет? – mebada

+0

Да. Это не проблема и общее решение таких проблем –

0

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

Смежные вопросы