Oracle Advanced排队中无关消息的选择性登录
-
09-10-2019 - |
题
这个问题是指在 Oracle流高级排队.
我需要确保彼此相关的消息进行顺序处理。
例如,假设队列与具有与业务相关的字段的四个消息称为事务参考(TXN_REF),并且两条消息(1,3)属于同一交易(000001):
id | txn_ref |
---+---------+
1 | 000001 |
2 | 000002 |
3 | 000001 |
4 | 000003 |
还假设我正在运行希望从这个队列中排出的4个线程/进程。以下情况应发生:
- 线程1 Dequeues消息#1
- 线程2 Dequeues消息#2
- 线程3 Dequeues消息#4(因为消息#3与#1相关,并且#1尚未完成)。
- 线程4个块等待消息
- 线程1为消息#1提交工作
- 线程4(或也许线程1)Dequeues消息#3。
我最初的想法是,我可以在dequeue条件下实现这一目标,在该条件下,ENQ_TIME(ENQUEUE TIME)不晚于具有相同TXN_REF的所有消息的任何其他ENQ_TIME。但是我的问题是如何参考我尚未选择的消息的txn_ref,以便选择它。例如
// Java API
String condition = "ENQ_TIME = (select min(ENQ_TIME) from AQ_TABLE1 where ??";
dequeueOption.setCondition(condition);
可以在这里实现我想要的东西吗?
解决方案
为了回答您的直接问题,可以使用 correlation
字段(调用 CORRID
在表中),是为此目的而设计的。
因此,在入口上,您将使用 AQMessageProperties.setCorrelation()
用TXN_REF值作为参数的方法。然后,在您的情况下,您会做这样的事情:
// Java API
String condition = "tab.ENQ_TIME = (select min(AQ_TABLE1.ENQ_TIME) from AQ_TABLE1 self where tab.CORRID=AQ_TABLE1.CORRID)";
dequeueOption.setCondition(condition);
不隶属于 StackOverflow