Правильный подход для отмены AQQueue.dequeue и выхода? - PullRequest
0 голосов
/ 25 января 2019

В настоящее время я работаю над 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 и корректно завершать работу моего приложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...