質問

この質問は、次のメッセージのデキューに関するものです。 Oracle Streamsアドバンスト・キューイング.

相互に関連するメッセージが順番に処理されるようにする必要があります。

たとえば、トランザクション参照 (txn_ref) と呼ばれるビジネス関連フィールドを持つ 4 つのメッセージがキューにシードされており、メッセージのうちの 2 つ (1、3) が同じトランザクション (000001) に属しているとします。

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

また、このキューからデキューしたい 4 つのスレッド/プロセスを実行していると仮定します。次のようなことが起こるはずです。

  1. スレッド 1 がメッセージ #1 をデキューします
  2. スレッド 2 がメッセージ #2​​ をデキューします
  3. スレッド 3 はメッセージ #4 をデキューします (メッセージ #3 は #1 に関連しており、#1 はまだ完了していないため)。
  4. スレッド 4 ブロックがメッセージを待っています
  5. スレッド 1 がメッセージ #1 の作業をコミットします
  6. スレッド 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 人のユーザーだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top