/ / Retarder l'envoi du courrier jusqu'à ce que la transaction soit validée - java, spring, email, transactions, xa

Retarder l'envoi du courrier jusqu'à ce que la transaction soit validée - java, spring, email, transactions, xa

Quelqu'un at-il un bon tutoriel ou quelques conseilssur la façon d'implémenter sa propre XAResource? J'ai besoin que MailSender de Spring soit transactionnel, pour que le courrier ne soit envoyé qu'une fois la transaction validée, et il semble qu'il n'y ait pas de wrapper transactionnel existant.

Réponses:

2 pour la réponse № 1

Si vous avez juste besoin d'attendre la validation, comme vous le dites dans un commentaire, vous pouvez enquêter en utilisant TransactionSynchronizationManager.registerSynchronization() pour déclencher l'envoi d'e-mails lors de la validation.


2 pour la réponse № 2

Vous pouvez utiliser un TransactionSynchronizationManager.registerSynchronization (comme gpeche mentionné) avec un TransactionSynchronizationAdapter qui a une variété de méthodes qui sont appelées à différentes étapes de la transaction en cours. Je pense que la méthode la plus appropriée pour la question est la afterCommit.

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

1 pour la réponse № 3

Je doute qu'il soit possible de mettre en œuvre une véritableXAResource pour SMTP. Il devrait y avoir un support de transaction sur le gestionnaire de ressources (serveur SMTP dans ce cas) et je ne pense pas qu'il y en ait. Je dirais que votre meilleur pari est le modèle "Last resource commit" - qui permet à une ressource non XA de participer à la transaction XA Recherchez sur Google, il y a beaucoup d'informations. La plupart des serveurs Java EE le supportent.


1 pour la réponse № 4

Une autre option à côté de celle mentionnée par gpeche consiste à envoyer un message JMS transactionnel depuis la transaction. Ensuite, laissez l'écouteur de message (comme par exemple un bean MDB) envoyer l'e-mail.

Une autre astuce dans EJB consiste à planifier une minuterie à partir deau sein d'une transaction. Le minuteur est également transactionnel et ne sera démarré que lorsque la transaction sera validée. Utilisez simplement une minuterie avec timeout = 0, afin qu'elle démarre immédiatement après la validation de la transaction.