2012-12-15 8 views
5

Datenbanktransaktionen sind ein bekanntes Konzept.JMS-Transaktion

Wenn ein Fehler auftritt, werden alle von updateDB vorgenommenen Änderungen verworfen.

Ich wollte wissen, was eine Message Queue Transaktion Rollback rückgängig machen wird.

try{ 
    ... 
    ... 
    //EDIT: swapped the order of receive and send 
    Message m = queue1.receiveMessage(..) 
    .. 
    .. 
    queue2.sendMessage(..) 
    .. 
    .. 
    commit(); 
} catch error { 
    rollback(); 
} 

speziell, was Rollback

  1. das Senden von Nachrichten
  2. un-empfangen die Nachricht abzubrechen, dh wieder die empfangene Nachricht setzen zurück

Schlange stehen oder am Ich dehne die Datenbank tx Analogie zu weit.

dank

EDIT: i was impliziert, bin nicht die Sende- und Empfangsvorgänge in Zusammenhang stehen. Ich wollte nur sagen, dass es zwei Operationen gibt, die den Status des Nachrichtenbrokers ändern - receive nimmt eine Nachricht aus der Warteschlange heraus, die für andere Konsumenten nicht verfügbar ist, wenn es welche gibt.

Antwort

9

Rollback des Sendens ist einfach, die Nachricht wird nicht in die Warteschlange2 gelegt.

Beim Rollback des Receivers wird die Nachricht normalerweise in die Warteschlange zurückgestellt (queue1). Je nach Konfiguration und Konfiguration Ihres JMS-Providers wird die Nachricht mehrmals erneut gesendet. Wenn die Transaktion zu oft zurückgesetzt wird (zu viele sind konfigurierbar), wird sie in eine "Rücksetzwarteschlange" (oder eine Warteschlange für nicht zustellbare Nachrichten) gestellt, sodass sie die Warteschlange für andere Nachrichten nicht blockiert. Eine zurückgesetzte Nachricht benötigt normalerweise eine manuelle Fehlerbehandlung.

0

Ja, Sie dehnen es zu weit.

Im transaktionsmodus wird Ihre queue.receiveMessage() niemals zurückkehren (vorausgesetzt, dass sie auf eine bestimmte Antwortnachricht und nicht nur auf eine Nachricht wartet), weil queue.sendMessage() die Nachricht noch nicht wirklich gesendet hat (sie wird es tun) gesendet werden, wenn die Transaktion festgeschrieben ist).

Es ist übrigens ein üblicher Fehler. Wenn JMS (ein asynchrones Protokoll) für synchrone Kommunikation verwendet wird, ist es natürlich, den Sende-/Empfangszyklus als aus einer Transaktion bestehend zu betrachten. Das ist jedoch nicht der Fall. Sobald Sie im Transaktionsmodus sendMessage() ausgeben, passiert noch nichts wirklich; Die Nachricht wird nur gesendet, wenn die Transaktion festgeschrieben wurde.

+0

danke für Ihre Einblicke. aber ich deutete nicht an, dass ich auf eine antwort der send-nachricht wartete, sondern wollte nur zwei veränderungen anzeigen. Ich habe meine Frage geklärt und die Reihenfolge der empfangenen/gesendeten Nachrichten getauscht. – mzzzzb