AcknowledgeTxEventQNotification
このインスタンス・メソッドは、TxEventQ通知の確認を送信します。
宣言
// C# public void AcknowledgeTxEventQNotification( OracleTxEventQNotificationDirective directive);
パラメータ
directive
- OracleTxEventQNotificationDirective
列挙値を指定します。
例外
次の場合にInvalidOperationException
がスローされます。
-
CIC接続がクローズされている場合、
-
登録が見つからない場合、または
-
確認がAQに送信されている場合。
備考
このメソッドは、通知を受信した後にコールバック関数からコールする必要があります。OracleTxEventQNotificationDirective
列挙に使用可能な値は、OracleTxEventQNotificationDirective.Commit
またはOracleTxEventQNotificationDirective.Rollback
の2つです。
確認は、TxEventQにのみ送信され、AQキューには送信されません。コールバック・メソッドは別のスレッドを使用してコールされるため、例外を捕捉することをお薦めします。そうしないと、問題が見逃される可能性があります。
TxEventQ通知では、通知の一部としてペイロードを取得します。TxEventQでは、各ペイロードは次の3つの状態のいずれかに関連付けられます。
-
Ready
: これは、メッセージをデキューできることを意味します。このメッセージの通知が送信されるとすぐに、状態はAcknowledgement_waiting
に変更されます。 -
Acknowledgement_waiting
: このメッセージの通知が送信され、現在TxEventQはクライアント・アプリケーションからの確認を待機しています。 -
Processed
- このメッセージはデキューされ、さらなるデキューには使用できません。
Commit
確認を送信すると、Acknowledgement_waiting
状態のすべてのメッセージがProcessed
としてマークされます。
Rollback
確認を送信すると、Acknowledgement_waiting
状態のすべてのメッセージがReady
としてマークされます。
メッセージの状態がAcknowledgement_waiting
で、アプリケーションとサーバー間の接続が終了またはクラッシュした場合、これらのメッセージの状態は自動的にReady
としてリセットされます。
例
/***********Oracle DB Setup*********** declare qprops sys.dbms_aqadm.QUEUE_PROPS_T; BEGIN qprops.sort_list := 'enq_time'; sys.dbms_aqadm.create_transactional_event_queue (queue_name => 'raw_txeventq', queue_payload_type => 'RAW', queue_properties => qprops); END; / BEGIN dbms_aqadm.start_queue( queue_name => 'raw_txeventq'); END; / **************************************/
// C# using Oracle.ManagedDataAccess.Client; using Oracle.ManagedDataAccess.Types; namespace TxEventQ_notification_test { class Program { bool IsNotified = false; static Random rnd = new Random(); public static void Main(String[] args) { string constr = "user id=scott;password=tiger;data source=oracle"; OracleConnection con = new OracleConnection(constr); { con.Open(); using (OracleAQQueue queue = new OracleAQQueue("raw_txeventq", con, OracleAQMessageType.Raw)) { try { queue.EnqueueOptions.Visibility = OracleAQVisibilityMode.Immediate; queue.EnqueueOptions.DeliveryMode = OracleAQMessageDeliveryMode.Persistent; Program obj = new Program(); queue.MessageAvailable += new OracleAQMessageAvailableEventHandler(obj.OnMyNotificationReceived); Console.WriteLine("Registration Done, please enqueue message inside \"raw_txeventq\" either from this application or any other application"); while(!obj.IsNotified) Thread.Sleep(1000); Console.WriteLine("Notification Received"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } } public void OnMyNotificationReceived(object src, OracleAQMessageAvailableEventArgs arg) { Console.WriteLine("********Notification Received********"); int tmp = rnd.Next(2); try { if (tmp == 0) { Console.WriteLine("Sending Commit Ack"); arg.Queue.AcknowledgeTxEventQNotification(OracleTxEventQNotificationDirective.Commit); } else { Console.WriteLine("Sending Rollback Ack"); arg.Queue.AcknowledgeTxEventQNotification(OracleTxEventQNotificationDirective.Rollback); } } catch (Exception ex) { Console.WriteLine("?????????????Exception in Callback Method??????????????????\n" + ex.Message); } finally { IsNotified = true; } } } }