Задача Java Spring Runnable с тайм-аутом

Столкнулся с тем, что при недоступности базы очередь растет, потому что задачи перестают выполняться. Каков наилучший способ установить тайм-аут для задач, выполняемых в методе run()? Может быть, есть хороший подход с использованием ExecutorService?

@Service
public class AsyncWriter implements Writer, Runnable {
    
    private LinkedBlockingQueue<Entry> queue = new LinkedBlockingQueue<>();

    private volatile boolean terminate = false;

    private AtomicInteger completedCounter = new AtomicInteger();

    @PostConstruct
    private void runAsyncWriter() {
        Thread async = new Thread(this);
        async.setName("Writer Thread");
        async.setPriority(2);
        async.start();
    }

    @Override
    public void run() {
        while (!terminate) {
            try {
                Entry entry = queue.take();                
                    dao.save(entry);
                    completedCounter.incrementAndGet();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void write(Entry entry) {
        queue.add(entry);
    }   
}

person Rodriguez    schedule 19.03.2021    source источник
comment
Либо не запускайте задачи самостоятельно, а используйте TaskScheduler, или установите флаг, который подсчитывает ошибки, обнаруженные в вашем run(), и если ошибки превышают пороговое значение, вы можете использовать оператор Thread.sleep().   -  person Lino    schedule 19.03.2021
comment
Также вам понадобится еще один оператор catch, чтобы поймать ошибки, возникающие, когда база данных становится недоступной, иначе ваш run() просто прекратит работу после первого исключения.   -  person Lino    schedule 19.03.2021
comment
Вопрос: Почему именно вам нужно асинхронно сохранять Entrys в базу данных? Используется ли эта конструкция только для случая, когда база данных недоступна, или у вас есть конкретный вариант использования?   -  person Lino    schedule 19.03.2021
comment
Потому что это фоновая, низкоприоритетная задача. Эта конструкция используется всегда, и она должна пропускать задачи с некоторым тайм-аутом, когда база данных недоступна.   -  person Rodriguez    schedule 19.03.2021
comment
Но главная причина в том, что BlockingQueue блокирует все приложение, если оно не будет работать асинхронно.   -  person Rodriguez    schedule 19.03.2021


Ответы (1)


Может быть, вы можете попробовать RxJava https://www.baeldung.com/rx-java. можете установить ваши функции aync Timeout в RxJava

person ebey    schedule 19.03.2021
comment
Я думаю, что должен быть какой-то хороший подход с ExecutorService - person Rodriguez; 19.03.2021