2017-07-25 60 views
1

我們試圖在.NET 4.7中使用Oracle AQ爲我們的應用程序構建排隊系統。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(); 
    } 
} 

出隊總是提交事務,並從隊列中永久刪除郵件,執行的,而不是提交回滾時也是如此。任何人都知道爲什麼它不與Dequeueing合作?

+0

定義「不工作」。另外,請考慮不使用異常處理程序,只是在沒有檢查機會的情況下丟棄任何錯誤。 –

+0

通過不工作,我的意思是即使在執行回滾之後,該隊列也會從隊列中永久刪除。 –

回答

0

設置事務後離隊的選擇已經開始或將其傳遞給queue.Dequeue()