Вы можете распараллелить задачи и дождаться завершения всех из них, прежде чем ответить на звонок.Для этого вы хотите использовать ExecutorCompletionService , который доступен в стандарте Java начиная с 5.0
Короче говоря, вы используете локатор службы своего контейнера для создания экземпляра ExecutorCompletionService
ExecutorCompletionService<List<MyResult>> queue = new ExecutorCompletionService<List<MyResult>>(executor);
// do this in a loop
queue.submit(aCallable);
//after looping
queue.take().get(); //take will block till all threads finish
Если вы не хотите ждать, вы можете обрабатывать задания в фоновом режиме, не блокируя текущий поток, но тогда вам понадобится какой-то механизм для информирования клиента о завершении задания.Это может быть через JMS или если у вас есть ajax-клиент, он может запрашивать обновления.
Кварц также имеет механизм планирования заданий, но Java предоставляет стандартный способ.
РЕДАКТИРОВАТЬ: Iвозможно, неправильно понял вопрос.Если вам не нужен более быстрый отклик, а, скорее, вы хотите уменьшить нагрузку на процессор, используйте этот подход
. Вы можете создать внутренний класс, такой как PollingThread, где пакеты, содержащие java.util.UUID для каждого задания и количествоPollingThreads определены во внешнем классе.Это будет продолжаться вечно и может быть настроено так, чтобы ваши процессоры могли свободно обрабатывать другие запросы
class PollingThread implements Runnable {
@SuppressWarnings("unchecked")
public void run(){
Thread.currentThread().setName("MyPollingThread");
while (!Thread.interrupted()) {
try {
synchronized (incomingList) {
if (incomingList.size() == 0) {
// incoming is empty, wait for some time
} else {
//clear the original
list = (LinkedHashSet<UUID>)
incomingList.clone();
incomingList.clear();
}
}
if (list != null && list.size() > 0) {
processJobs(list);
}
// Sleep for some time
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
//ignore
}
} catch (Throwable e) {
//ignore
}
}
}
}