gpt4 book ai didi

oracle - Oracle Advanced Queuing 中不相关消息的选择性出队

转载 作者:行者123 更新时间:2023-12-04 06:43:22 25 4
gpt4 key购买 nike

这个问题是指中消息的出队问题Oracle Streams 高级队列 .

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

例如,假设队列中包含四个消息,这些消息具有称为事务引用 (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_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 - Oracle Advanced Queuing 中不相关消息的选择性出队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3974500/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com