Ответ заключается в запуске задач в отдельных потоках.
Для чего-то подобного, я думаю, вы должны использовать ThreadPoolExecutor
с ограниченным размером пула, а не создавать потоки самостоятельно.
Код будет выглядеть примерно так. (Обратите внимание, что это всего лишь эскиз. Проверьте детали в javadoc, узнайте, что означают цифры и т. Д.)
// Create the executor ... this needs to be shared by the servlet threads.
Executor exec = new ThreadPoolExecutor(1, 10, 120, TimeUnit.SECONDS,
new ArrayBlockingQueue(100), ThreadPoolExecutor.CallerRunsPolicy);
// Prepare first task
final ArgType someArg = ...
FutureTask<ResultType> task = new FutureTask<ResultType>(
new Callable<ResultType>() {
public ResultType call() {
// Call remote service using information in 'someArg'
return someResult;
}
});
exec.execute(task);
// Repeat above for second task
...
exec.execute(task2);
// Wait for results
ResultType res = task.get(30, TimeUnit.SECONDS);
ResultType res2 = task2.get(30, TimeUnit.SECONDS);
Вышеприведенное не пытается обработать исключения, и вам нужно сделать что-то более сложное с таймаутами; например отслеживание общего времени запроса и отмена задач, если мы выполняем со временем.
Это не проблема, для решения которой предназначен Кварц. Кварц - система планирования работы. У вас просто есть некоторые задачи, которые вам нужно выполнить как можно скорее ... возможность с возможностью отменить их.