我目前正在使用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 并正常关闭应用程序的正确方法?