В настоящее время я работаю над java-приложением с пружинной загрузкой для удаления элементов из очереди oracle с помощью пакета oracle.AQ (база данных oracle 11g).
У меня есть один класс @Component в моемприложение с одной функцией планировщика:
@Scheduled(fixedDelay = 1000)
private void dequeueElement() {
AQQueue queue = databaseSession.getQueue(queueUser, queueName);
AQDequeueOption dequeueOption = new AQDequeueOption();
//dequeueOption.setWaitTime(10);
AQMessage queueMessage = queue.dequeue(dequeueOption, dequeueObjectType);
AQObjectPayload messagePayload = queueMessage.getObjectPayload();
Object dequeueObject = messagePayload.getPayloadData();
doStuffWithMyElement(dequeueObject);
}
и одной функцией для закрытия соединения с БД перед закрытием приложения:
@Override
public void onApplicationEvent(ContextClosedEvent event) {
Logger.info("Closing connection...");
clientDbAqSession.close();
clientDbConnection.close();
Logger.info("... done");
}
Если я запускаю приложение, dequeueElement функция будет запущена, и при queue.dequeue приложение будет ожидать, пока база данных вернет новое сообщение в очереди.
Если я сейчас закрою приложение, используя кнопку выхода в IntelliJ, я увижусообщение "Закрытие соединения ..." в моем журнале, и приложение не будет закрываться, пока сообщение не будет помещено в очередь и, следовательно, не вернется функция queue.dequeue .
Я попытался с помощью «временного решения» установить время ожидания для очереди равным 10 секундам, используя dequeueOption.setWaitTime (10), но я сомневаюсь, что это правильный подход для выхода из приложения менее чем за 10 секунд.
Как правильно прерывать / отменять queue.dequeue и корректно завершать работу моего приложения?