Многопоточность внутри Java-сервлетов

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

private static final ExecutorService executor = Executors.newSingleThreadExecutor();

public static JSON createFilter(HttpServletRequest req, HttpServletResponse resp){
...
// some type checking then apply filters   
...
for(Integer appId : appIds){
        executor.execute(new ApplyFilterTask(appId));
        }
}

Мой ApplyFilterTask прост:

private static class ApplyFilterTask implements Runnable{

    private static ManagerService ms = null;
    int appId;


    public ApplyFilterTask(int appId) {
        this.appId = appId;
    }


    @Override
    public void run() {
        if (ms == null){
            ms = new ManagementService();
            }
        try {
            ms.applyFilters(appId);
        } catch (Exception e) {
            // log the error
        }
}

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

мои проблемы:

  • я не знаю куда положить executor.shutdown(); в моем коде
  • что произойдет, если во время процесса другой пользователь создаст фильтр? Как я могу заставить свой сервлет использовать тот же поток или хотя бы подождать, пока первый не будет сделан, прежде чем создавать другой?

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

1 ответ

Я не знаю, изменилась ли спецификация, но вы действительно не должны использовать потоки в своем коде сервлета: http://www.coderanch.com/mobile/t/535749/Servlets/java/Threads-Servlets?foo=a.

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

Другие вопросы по тегам