/ / Retrasar el envío de correo hasta que se confirme la transacción: Java, Spring, correo electrónico, transacciones, xa

Retrasar el envío de correo hasta que se confirme la transacción: java, spring, correo electrónico, transacciones, xa

¿Alguien tiene un buen tutorial o algún consejo?sobre cómo implementar un XAResource propio. Necesito que el MailSender de Spring sea transaccional, de modo que el correo solo se envíe una vez que se confirme la transacción, y parece que no hay ningún envoltorio transaccional existente.

Respuestas

2 para la respuesta № 1

Si solo necesita esperar la confirmación, como dice en un comentario, puede investigar usando TransactionSynchronizationManager.registerSynchronization() para activar el envío de correo electrónico al confirmar.


2 para la respuesta № 2

Puedes usar un TransactionSynchronizationManager.registerSynchronization (me gusta gpeche mencionado) con un TransactionSynchronizationAdapter que tiene una variedad de métodos que se llaman en varias etapas de la transacción actual. Creo que el método más adecuado para la pregunta es el afterCommit.

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

1 para la respuesta № 3

Dudo que sea posible implementar verdaderoXAResource para SMTP. Debería haber soporte de transacciones en el administrador de recursos (servidor SMTP en este caso) y no creo que haya ninguno. Diría que su mejor opción es el patrón "Último compromiso de recursos", que permite que un recurso no XA participe en la transacción XA Busque en Google, hay mucha información. La mayoría de los servidores Java EE lo admiten.


1 para la respuesta № 4

Otra opción junto a la mencionada por gpeche es enviar un mensaje JMS transaccional desde la transacción. Luego, deje que el oyente del mensaje (como, por ejemplo, un bean MDB) envíe el correo electrónico.

Otro truco en EJB es programar un temporizador desdedentro de una transacción. El temporizador también es transaccional y solo se iniciará cuando se confirme la transacción. Simplemente use un temporizador con tiempo de espera = 0, por lo que comenzará inmediatamente después de que se confirme la transacción.