Oracle高级排队中不相关消息的选择性出列

Oracle高级排队中不相关消息的选择性出列,oracle,advanced-queuing,oracle-aq,oracle-streams,Oracle,Advanced Queuing,Oracle Aq,Oracle Streams,此问题涉及Oracle Streams Advanced Queueing中的消息出列 我需要确保按顺序处理彼此相关的消息 例如,假设队列中有四条消息,它们具有一个称为事务引用txn_ref的业务相关字段,其中两条消息1,3属于同一事务000001: id | txn_ref | ---+---------+ 1 | 000001 | 2 | 000002 | 3 | 000001 | 4 | 000003 | 还假设我正在运行4个线程/进程,希望从该队列中退出。应发生以下情

此问题涉及Oracle Streams Advanced Queueing中的消息出列

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

例如,假设队列中有四条消息,它们具有一个称为事务引用txn_ref的业务相关字段,其中两条消息1,3属于同一事务000001:

id | txn_ref | 
---+---------+
 1 | 000001  |
 2 | 000002  |
 3 | 000001  |
 4 | 000003  |
还假设我正在运行4个线程/进程,希望从该队列中退出。应发生以下情况:

线程1退出消息1的队列 线程2退出消息2的队列 线程3退出消息4的队列,因为消息3与1相关,而1尚未完成。 线程4块等待消息 线程1提交消息1的工作 线程4或线程1可能会使消息3退出队列。 我最初的想法是,我可以通过一个退出条件来实现这一点,即ENQ_时间进入队列时间不晚于所有具有相同TXN_REF的消息的任何其他ENQ_时间。但我的问题是如何引用我尚未选择的消息的TXN_REF,以便选择它。e、 g

// Java API
String condition = "ENQ_TIME = (select min(ENQ_TIME) from AQ_TABLE1 where ??";
dequeueOption.setCondition(condition);

有可能实现我在这里想要的吗?

要回答您的直接问题,可以使用表中名为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);

如果可能的话,您可以尝试使用消息组。文章简要地描述了它,但我发现它更有用。基本上,您可以将队列表设置为将同时提交的所有消息视为一个组。退出队列时,一次只能有一个用户从一组消息中退出队列。

我要做的是退出消息队列,除非相关id与另一个工作进程当前正在处理的消息相匹配。如果我可以识别当前正在处理的相关ID,那么我可以将条件设置为corrid不在{a,b…z}中。然后可能需要两个队列:一个用于消息本身,如上所述,另一个用于每个TXN_REF充当头消息1。线程首先将头出列以获得TXN_REF/corrid,然后这个线程会用这个有趣的想法处理所有的记录。头消息队列类似于令牌系统。仅当消息头消息在队列中不存在时,排队进程才应将其排队。我想知道这可能吗。然后,因为我希望每个事务处理不超过1条消息,所以出列进程可以使用报头有选择地将单个消息从消息队列中出列。当它处理完该消息后,如果有其他相关消息要处理,它会将头消息放回队列中。复杂,但有一些承诺。我非常感谢你的帮助。它当然值得赏金。这是有希望的,但仍然不太可能。我的消息在逻辑上是相关的,但它们不在同一事务中排队。我仍然可以使用消息组吗?我几乎肯定它们必须是同一事务的一部分。