2017-07-25 3 views
1

Nous essayons d'utiliser Oracle AQ pour créer un système de mise en file d'attente pour notre application dans .NET 4.7. Fondamentalement, notre problème est que nous voudrions emballer le processus de dequeueing dans une transaction de niveau supérieur contenant d'autres instructions et être capable de Commit ou Rollback "manuellement" après l'exécution de l'instruction queue.Dequeue().Oracle Advanced Queues - Déqueueing Commit/Rollback

Jusqu'à présent, cela ne fonctionne qu'avec Enqueueing:

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

Avec la même approche, nous essayons de réaliser une

queue.Dequeue() 

puis valider ou annuler, mais cela ne semble pas travailler. Voici l'extrait Dequeueing:

//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 engage toujours la transaction et supprime les messages de façon permanente à partir de la file d'attente, même lors de l'exécution Rollback au lieu de commettre. Quelqu'un at-il une idée pourquoi il ne fonctionne pas avec Dequeueing?

+0

Définir « ne fonctionne pas ». En outre, envisagez de ne pas utiliser les gestionnaires d'exceptions qui jettent simplement toute erreur sans possibilité d'inspection. –

+0

En ne fonctionnant pas, je veux dire que le message est définitivement supprimé de la file d'attente après la mise en file d'attente, même après une restauration. –

Répondre

0

Définissez les options de dequeue après la transaction avaient commencé ou passer à la queue.Dequeue()