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