这个问题是指在 Oracle流高级排队.

我需要确保彼此相关的消息进行顺序处理。

例如,假设队列与具有与业务相关的字段的四个消息称为事务参考(TXN_REF),并且两条消息(1,3)属于同一交易(000001):

id | txn_ref | 
---+---------+
 1 | 000001  |
 2 | 000002  |
 3 | 000001  |
 4 | 000003  |

还假设我正在运行希望从这个队列中排出的4个线程/进程。以下情况应发生:

  1. 线程1 Dequeues消息#1
  2. 线程2 Dequeues消息#2
  3. 线程3 Dequeues消息#4(因为消息#3与#1相关,并且#1尚未完成)。
  4. 线程4个块等待消息
  5. 线程1为消息#1提交工作
  6. 线程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);

其他提示

如果可能的话,您可以尝试使用消息组的策略。这 Oracle文档 简短地描述了它,但我发现 这本蟾蜍世界文章 更有用。基本上,您设置了队列表以同时处理与一个“组”同时处理的所有消息。当脱水时,一次只有一个用户可以从“组”消息中脱离。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top