/ / Odloženie odosielania pošty, kým sa transakcia nezaviaže - java, jar, e-mail, transakcie, xa

Oneskorenie odosielania pošty do transakcie - java, jar, e-mail, transakcie, xa

Má niekto dobrý návod alebo radu?o tom, ako implementovať jeden vlastný XAResource? Potrebujem, aby bol Spring's MailSender transakčný, takže pošta bude odoslaná až po spáchaní transakcie a zdá sa, že neexistuje žiadny existujúci transakčný obal.

odpovede:

2 pre odpoveď č. 1

Ak potrebujete iba počkať na potvrdenie, ako uvádzate v komentári, môžete problém preskúmať pomocou TransactionSynchronizationManager.registerSynchronization() spustiť odosielanie e-mailov pri potvrdení.


2 pre odpoveď č. 2

Môžete použiť a TransactionSynchronizationManager.registerSynchronization (Páči sa mi to gpeche uvedené) s a TransactionSynchronizationAdapter ktorá má rôzne metódy, ktoré sa volajú v rôznych fázach aktuálnej transakcie. Myslím si, že najvhodnejšou metódou pre túto otázku je afterCommit.

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
super.afterCommit();
sendEmail();
}
});

1 pre odpoveď č. 3

Pochybujem, že je možné implementovať pravdivéXAResource pre SMTP. Správca zdrojov (v tomto prípade server SMTP) by mal mať podporu transakcií a ja neverím, že nejaké existujú. Povedal by som, že najlepším riešením je vzor „Posledné potvrdenie zdroja“ - ktorý umožňuje účasť jedného zdroja, ktorý nie je XA, na transakcii XA. . Vyhľadajte na Googli, je tu veľa informácií. Väčšina serverov Java EE to podporuje.


1 pre odpoveď č. 4

Ďalšou možnosťou vedľa možnosti, ktorú spomenul gpeche, je odoslanie transakčnej správy JMS z transakcie. Potom nechajte poslucháča správ (ako napr. Fazuľa MDB) poslať e-mail.

Ďalším trikom v EJB je plánovanie časovača zv rámci transakcie. Časovač je tiež transakčný a spustí sa, až keď sa transakcia zaviaže. Jednoducho použite časovač s časovým limitom = 0, takže sa spustí okamžite po spáchaní transakcie.