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;
      }
    }

  }

    
}