Убить задачу в threadexecutor, если это займет больше времени

#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();