2010-06-21 4 views
4

Возможно ли реализовать фоновый процесс в сервлете !?Фоновый процесс в сервлете

Позвольте мне объяснить. У меня есть сервлет, который показывает некоторые данные и генерирует некоторые отчеты. Генерация отчета подразумевает, что данные уже присутствуют, и это так: кто-то еще загружает эти данные.

В дополнение к генерации отчетов я должен реализовать способ отправки электронной почты по прибытии новых данных (загруженных).

ответ

17

Функциональное требование неясно, но для ответа на вопрос: да, можно запустить фоновый процесс в servletcontainer.

Если вы хотите использовать фоновый поток с обложкой, используйте ServletContextListener, чтобы подключиться к запуску и выключению Webapp и использовать ExecutorService для его запуска.

@WebListener 
public class Config implements ServletContextListener { 

    private ExecutorService executor; 

    public void contextInitialized(ServletContextEvent event) { 
     executor = Executors.newSingleThreadExecutor(); 
     executor.submit(new Task()); // Task should implement Runnable. 
    } 

    public void contextDestroyed(ServletContextEvent event) { 
     executor.shutdown(); 
    } 

} 

Если вы не в Servlet 3.0 еще и, следовательно, не может использовать @WebListener, зарегистрировать его как следует в web.xml вместо:

<listener> 
    <listener-class>com.example.Config</listener-class> 
</listener> 

Если вы хотите sessionwide фоновый поток, используйте HttpSessionBindingListener, чтобы начать и остановить его.

public class Task extends Thread implements HttpSessionBindingListener { 

    public void run() { 
     while (true) { 
      someHeavyStuff(); 
      if (isInterrupted()) return; 
     } 
    } 

    public void valueBound(HttpSessionBindingEvent event) { 
     start(); // Will instantly be started when doing session.setAttribute("task", new Task()); 
    } 

    public void valueUnbound(HttpSessionBindingEvent event) { 
     interrupt(); // Will signal interrupt when session expires. 
    } 

} 

На первом создании и начать, просто сделать

request.getSession().setAttribute("task", new Task()); 
+0

Благодарим за повторное воспроизведение. Извините. Просьба меня спросила, чтобы реализовать способ отправки электронной почты (предупреждение), когда некоторые данные загружены (новые данные загружены в БД). Я решил реализовать этот механизм, изменив существующее веб-приложение, создав фоновый процесс, который опросит новые данные. Данные загружаются в другое приложение, которое мне не удается. Контейнер сервлета - Tomcat. Спасибо за ответы – sangi

+0

Почему бы вам просто не написать это сразу после фрагмента кода, который обновляет данные в БД? – BalusC

+0

Поскольку у меня нет доступа к приложению, которое загружает данные: оно управляется и разрабатывается другими людьми, которых я не могу достичь. – sangi

0

Спасибо! Мне было интересно, следует ли это лучше сделать внутри от объема запроса, например:

public class StartServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {     
     request.getSession().setAttribute("task", new Task());  
    } 
} 

Таким образом, процесс останавливается, когда пользователь покидает страницу.

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