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ď č. 1Ak 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.