Вы можете сделать это с помощью Java Executor Framework.
- Создать пул потоков
ExecutorService executorService = Executors.newFixedThreadPool(10);
Поместите вашу тяжелую задачу в новый поток и отправьте ее в executorService, которая обработает и вернет вам задание Feature. И сохраните эту функцию в сеансе
Future<String> startedTask = executorService.submit(() -> {
System.out.println(Thread.currentThread().getName() + " started!");
try {
Thread.sleep(2 * 60 * 1000);//TODO: here goes your heavy task which tooks long to process
} catch (InterruptedException e) {
e.printStackTrace();
}
return "completed at " + System.currentTimeMillis();//here you can return your results if you need any
});
session.setAttribute(ATTRIBUTE_NAME_WORKING_TASK, startedTask);
В качестве дополнительного, если вы хотите заблокировать свой пользовательский интерфейс во время процессов сервлета, вы можете вызвать метод ниже после строк выше (я не думаю, что кто-то хочет сделатьэто)
String result = startedTask.get();
Когда вы вызываете stop url через кнопку, вы можете найти задачу из сеанса и отменить ее
Object task = session.getAttribute(ATTRIBUTE_NAME_WORKING_TASK);
if (task == null)
return "Task doesnt exists";
if (task instanceof Future)
((Future<String>) session.getAttribute(ATTRIBUTE_NAME_WORKING_TASK)).cancel(true);
Это отменит вашу задачу, и даже если вы заблокировали пользовательский интерфейс, который ожидал процесс сервлета, будетбыть разблокированным