Per semplificare il mio problema, hoPrimavera/RabbitMQ: gestione delle transazioni
App1 con il metodo createUser @Transactionnal():
- Inserisci nuovo utente nel database
- Aggiungi messaggio asincrona in RabbitMQ in modo che l'utente riceva una mail di notifica
- (potenzialmente qualche codice aggiuntivo, ma non molto)
App2 con il messaggio RabbitMQ consummer
- messaggi Consummes sulla coda mailing in tempo reale
- dati leggere la posta in database
- Invia posta
Il problema è che a volte, App2 tenta di consumare il messaggio RabbitMQ prima che la transazione venga eseguita su App1. Ciò significa che App2 non può leggere i dati della posta sul database perché l'utente non è ancora stato creato.
Alcune soluzioni possono essere:
- Usa READ_UNCOMMITED livello di isolamento su App2
- Aggiungi un po 'di ritardo nella RabbitMQ messaggi di consegna (o qualche RetryTemplate sul consummer)
- Cambiare il nostro modo di inviare messaggi di posta elettronica ...
Ho visto che c'è un RabbitTransactionManager in primavera, ma non riesco a capire come dovrebbe ork. Gli interni di materiale per la gestione delle transazioni sembrano essere sempre un po 'difficili da capire e anche la documentazione non aiuta molto.
C'è un modo per fare qualcosa del genere?
- Aggiungere un messaggio a una coda RabbitMQ in un metodo @Transactionnal
- Quando si conclude la transazione, il messaggio si impegna a coda, e le modifiche vengono commessi al database
- modo che il messaggio non può essere consumato prima che la transazione db termini
Come? E cosa aspettarsi per esempio se invio messaggi RabbitMQ sincroni invece di messaggi asincroni? Bloccherebbe il thread in attesa di una risposta o qualcosa del genere? Perché inviamo messaggi di sincronizzazione e asincroni per diversi casi di utilizzo.
ho ragione che entrambe le applicazioni consumare messaggi dalla stessa coda? – pinepain
No, App1 inserisce i messaggi in una coda e App2 consuma messaggi in quella coda –
Sei riuscito a risolvere questo problema in qualche modo? Sto affrontando lo stesso problema. –