Oracle Advanced Queuingでの無関係なメッセージの選択的デキュー
-
09-10-2019 - |
質問
この質問は、次のメッセージのデキューに関するものです。 Oracle Streamsアドバンスト・キューイング.
相互に関連するメッセージが順番に処理されるようにする必要があります。
たとえば、トランザクション参照 (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);
ここで私が望むことを達成することは可能ですか?
解決
直接的な質問に答えるには、次のコマンドを使用して回答できます。 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);
他のヒント
可能であれば、メッセージ グループを使用する戦略を試してみてください。の オラクルのドキュメント 簡単に説明しますが、私が見つけたのは このヒキガエルの世界の記事 はるかに便利になります。基本的に、同時にコミットされたすべてのメッセージを 1 つの「グループ」として扱うようにキュー テーブルを設定します。デキューする場合、メッセージの「グループ」からデキューできるのは一度に 1 人のユーザーだけです。