2012-12-15 14 views
5

Le transazioni di database sono un concetto familiare.Transazione JMS

try { 
    ... 
    .. 
    updateDB() 
    .. 
    ... 
    commit(); 
} catch error { 
    rollback(); 
} 

se si verifica un errore, eventuali modifiche apportate da updateDB verranno eliminate.

Desideravo sapere cosa annullerà un rollback della transazione nella coda dei messaggi.

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

specificamente, quale sarà rollback fanno

  1. annullare l'invio di un messaggio
  2. non-ricevere il messaggio cioè rimettere il messaggio ricevuto di nuovo la fila

o sono estendendo l'analogia del database tx troppo lontano.

grazie

EDIT: Non sto dicendo l'invio e ricezione operazioni sono correlate. Volevo solo dire che ci sono due operazioni che cambiano lo stato del broker di messaggi: la ricezione eliminerà un messaggio dalla coda che non sarà disponibile per altri consumatori se ce ne fossero.

risposta

9

Il rollback della trasmissione è semplice, il messaggio non verrà messo in coda2.

Il rollback della ricezione in genere riporterà il messaggio in coda (coda1). In base all'impostazione e alla configurazione del provider JMS, il messaggio verrà riconsegnato un numero di volte. Se la transazione viene ripristinata troppe volte (troppe sono configurabili) verrà messa in una "coda di backout" (o coda di messaggi non recapitati), in modo che non blocchi la coda per altri messaggi. In genere, un messaggio di esclusione richiede una gestione manuale degli errori.

0

Sì, lo stai allungando troppo.

In modalità transazionale, il tuo queue.receiveMessage() non tornerà mai (supponendo che sia impostato per attendere un particolare messaggio di risposta, e non solo "qualsiasi" messaggio), semplicemente perché lo queue.sendMessage() non ha ancora inviato il messaggio (verrà essere inviato quando la transazione è impegnata).

È un errore comune, a proposito. Quando si utilizza JMS (che è un protocollo asincrono) per le comunicazioni sincrone, è naturale visualizzare il ciclo di invio/ricezione come consistente in una transazione. Questo, tuttavia, non è il caso. Dopo aver inviato sendMessage() in modalità transazionale, non succede ancora nulla; il messaggio verrà inviato solo quando la transazione è stata eseguita.

+0

grazie per i vostri approfondimenti. ma non stavo insinuando che stavo aspettando una risposta del messaggio di invio, volevo solo indicare due cambiamenti di stato. ho aggiunto chiarimenti alla mia domanda e ho scambiato l'ordine di ricezione/invio di messaggi. – mzzzzb