#java #spring #jms
#java #весна #jms
Вопрос:
Вот сценарий:
У меня есть основной процесс java, который использует JMS для публикации в каком-либо брокере ActiveMQ.
Каждый раз, когда сообщение должно быть отправлено брокеру, используется поток из пула потоков фиксированного размера (с использованием ThreadExecutor), и внутри него выполняются вызовы публикации.
Теперь вызов публикации является блокирующим вызовом, и если брокер не работает, сам поток продолжает ждать.
Я хочу создать пул потоков таким образом, чтобы, если определенный поток не закончил выполнение задачи за X промежутков времени, он просто возвращался, т.е. Если брокер не работает и публикация не выполняется, поток не продолжает ждать и вместо этого возвращается в пул.
На данный момент нет способа сделать этот вызов публикации асинхронным, поэтому, я думаю, единственный способ справиться с этой ситуацией — это тот, который упоминался выше.
Существуют ли какие-либо ThreadExecutors, которые позволяют мне немедленно завершить поток, если поток не может выполнить задачу за заданный промежуток времени??
Хотелось бы получить от кого-нибудь более элегантное решение.
Ответ №1:
ExecutorService
Интерфейс предлагает методы invokeAll()
и invokeAny()
с timeout
параметром.
Пример:
ExecutorService executor = Executors..newFixedThreadPool(2);
executor.invokeAll(Arrays.asList(new Callable<Void>(){
@Override
public Void call() throws Exception {
try {
// do your task
} catch (InterruptedException e) {
// your task was forced to end
}
return null;
}
}), 5, TimeUnit.SECONDS);
executor.shutdown();