Многопоточность внутри 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.
Вы должны масштабировать, используя свой контейнер, или если вам нужно ввести асинхронное использование обработки вне рабочих процессов и какой-либо очереди сообщений.