Столкнулся с тем, что при недоступности базы очередь растет, потому что задачи перестают выполняться. Каков наилучший способ установить тайм-аут для задач, выполняемых в методе 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);
}
}
TaskScheduler
, или установите флаг, который подсчитывает ошибки, обнаруженные в вашемrun()
, и если ошибки превышают пороговое значение, вы можете использовать операторThread.sleep()
. - person Lino   schedule 19.03.2021catch
, чтобы поймать ошибки, возникающие, когда база данных становится недоступной, иначе вашrun()
просто прекратит работу после первого исключения. - person Lino   schedule 19.03.2021Entry
s в базу данных? Используется ли эта конструкция только для случая, когда база данных недоступна, или у вас есть конкретный вариант использования? - person Lino   schedule 19.03.2021