取消AQQueue.dequeue并退出的正确方法?

时间:2019-01-25 14:46:10

标签: java oracle spring-boot queue

我目前正在使用spring-boot java应用程序来使用oracle.AQ包(数据库为oracle 11g)从oracle队列中取出元素。

我的应用程序中只有一个@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 函数返回。

我尝试使用“替代方法”,使用dequeueOption.setWaitTime(10)将出队的等待时间设置为10秒,但是我怀疑这是在不超过10秒的时间内退出我的应用程序的正确方法。

什么是正确中断/取消 queue.dequeue 并正常关闭应用程序的正确方法?

0 个答案:

没有答案