2017-07-25 16 views
1

.NET AQを使用して、.NET 4.7でアプリケーションのキューイング・システムを構築しようとしています。Oracleアドバンスト・キュー - コミット/ロールバックのデキュー

私たちの問題は、他の命令を含む上位レベルのトランザクションでデキュープロセスを包み込み、queue.Dequeue()命令を実行した後に "手動で"コミットまたはロールバックできるようにすることです。

これが唯一のエンキューと連携し、これまで:

using (var tr = con.BeginTransaction()) 
{ 
    try 
    { 
     enqMsg.SenderId = new OracleAQAgent("SUBSCRIBER1"); 
     enqMsg.Payload = new OracleXmlType(con, new XDocument(
      new XElement("workflowexecution", 
       new XElement("id", i), 
       new XElement("workflowname", Guid.NewGuid().ToString().Substring(0, 8)), 
       new XElement("requestsource", Guid.NewGuid().ToString().Substring(0, 6)))).ToString()); 

     queue.Enqueue(enqMsg); 

     //Other instructions here... 

     tr.Commit(); 
    } 
    catch (Exception) 
    { 
     tr.Rollback(); 
    } 
} 

同じアプローチでは、我々は

queue.Dequeue() 

を実行してコミットまたはロールバックしようとしているが、それはいないようです働くここでデキューの抜粋だ:

//Queue declaration 
queue = new OracleAQQueue("QueueName", con) 
{ 
    MessageType = OracleAQMessageType.Xml, 
    NotificationConsumers = new[] { "SUBSCRIBER1" }, 
    DequeueOptions = 
    { 
     ConsumerName = "SUBSCRIBER1", 
     DequeueMode = OracleAQDequeueMode.Remove, 
     Visibility = OracleAQVisibilityMode.OnCommit, 
    } 
}; 

//Dequeueing process 
using (var tr = con.BeginTransaction()) 
{ 
    try 
    { 
     OracleAQMessage _deqMsg = queue.Dequeue(); 

     //read the payload 
     var reader = _deqMsg?.Payload as XmlTextReader; 

     if (reader != null) 
     { 
      reader.Read(); 
      Console.WriteLine("Received message from queue: " + reader.ReadOuterXml()); 
     }      

     //Further instructions... 
     tr.Commit(); 
    } 
    catch (Exception ex) 
    { 
     tr.Rollback(); 
    } 
} 

デキューは常にトランザクションをコミットし、キューからメッセージを完全に削除し、ロールバックを実行する場合でも、代わりにコミットします。だれかがデキューするとうまくいかない理由を知っていますか?

+0

にそれを渡します。また、検査の機会がなくてもエラーを投げ捨てる例外ハンドラは使用しないでください。 –

+0

私は、メッセージがロールバックを実行した後でも、キューからデキューした後にキューから永久に削除されてしまうことを意味します。 –

答えて

0

は、取引が始まった後にデキュー・オプションを設定するか、「動作しない」の定義queue.Dequeue()

関連する問題