この質問は、 Oracle Streams Advanced Queuingでのメッセージのデキューに関するものです。
相互に関連するメッセージが順次処理されるようにする必要があります。
たとえば、トランザクション参照 (txn_ref) と呼ばれるビジネス関連フィールドを持つ 4 つのメッセージがキューにシードされており、そのうちの 2 つのメッセージ (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);
ここで私が望むものを達成することは可能ですか?