Oracle AQ出列方法的建议

Oracle AQ出列方法的建议,oracle,oracle10g,oracle-aq,Oracle,Oracle10g,Oracle Aq,我需要连续地将来自Oracle队列的消息排出队列 就我所能想象的,我们可以通过两种方式来对消息进行排队,一种是通过异步自动通知方法,另一种是通过手动轮询过程,一次可以对一条消息进行排队 我不能使用异步通知功能,因为它在高峰时间和高峰时间的5分钟内收到的消息数量可能会达到1000条 我不想在后台生成多个回调过程,从而使数据库过载 通过手动轮询过程,我可以创建一个24*7运行的一次性调度程序作业,它调用一个存储的进程,在等待模式(类似于侦听消息)下在循环中对消息进行查询。 这种方法的问题在于 1)

我需要连续地将来自Oracle队列的消息排出队列

就我所能想象的,我们可以通过两种方式来对消息进行排队,一种是通过异步自动通知方法,另一种是通过手动轮询过程,一次可以对一条消息进行排队

我不能使用异步通知功能,因为它在高峰时间和高峰时间的5分钟内收到的消息数量可能会达到1000条 我不想在后台生成多个回调过程,从而使数据库过载

通过手动轮询过程,我可以创建一个24*7运行的一次性调度程序作业,它调用一个存储的进程,在等待模式(类似于侦听消息)下在循环中对消息进行查询。 这种方法的问题在于 1) 调度程序作业连续运行并占用一个永久作业槽 2) 存储过程不会退出,因为它在循环中运行,等待消息

在我不需要让作业/过程持续运行以查找消息的情况下,是否有其他/更好的解决方案

我是否可以使用自动通知方法来获取第一条消息的通知、取消订阅订阅者并将其他消息和消息排出队列 当没有更多消息时,是否再次订阅队列?这是一种安全的方法吗?我会在订阅和取消订阅之间丢失任何消息吗? 顺便说一句,我们使用Oracle 10gR2数据库,所以我不能使用通知清除选项


感谢您的专家解决方案

没错,对大容量队列使用自动通知不是个好主意

在一个客户机上,我看到了一个24*7运行的一次性调度程序作业,它似乎工作得相当好,它们可以将一条特殊的“停止”消息(到达队列顶部)排入队列,它会侦听并停止处理消息

然而,一般来说,我倾向于定期运行的作业(例如,每分钟一次,或任何适合您的粒度),这将使所有消息出列。我将出列放在一个循环中,循环计数器和“最大消息数”限制器基于1分钟内预期的最大消息数。作业将继续处理消息,直到(a)队列中没有更多消息,或(b)达到最大限制

然后,您可以根据希望在排队和出列之间看到的最大延迟设置作业的计划。例如,如果邮件在5分钟内未被处理并不重要,您可以将作业设置为每5分钟运行一次

最大限制必须是相当高的数字-例如,预期最大数量的10倍或100倍-否则尖峰可能会淹没您的队列,并且可能无法跟上。最大限制的思想是确保作业永远不会运行。这应该给ops足够的时间来检测队列问题(例如,如果某个恶意进程正在用虚假消息淹没队列)