/ / Transacción y envío de un correo electrónico - java, spring, correo electrónico, transacciones

Transacción y envío de un correo electrónico - java, spring, email, transactions

Teniendo en cuenta el caso de uso común de un usuario.creando una nueva cuenta en una aplicación web y la aplicación envía un correo electrónico de confirmación a la dirección del usuario. Por lo que he visto, esto generalmente se implementa de una de las siguientes tres maneras:

  1. El controlador web llama a un método de servicio, que crea la cuenta de usuario y envía el correo electrónico, ambos dentro de una sola transacción.
  2. El controlador web llama a un método de servicio (contx propagation = nunca), que invoca un primer método en sí mismo para crear la cuenta de usuario dentro de una transacción, y luego invoca un segundo método en sí mismo para enviar el correo electrónico.
  3. El controlador web llama a un primer método de servicio, que crea la cuenta de usuario dentro de una transacción, luego a un segundo método de servicio que envía el correo electrónico.

El primer enfoque es simple y directo,pero existe el riesgo de que la transacción se revierta después de que se haya enviado el correo electrónico, por lo que el correo electrónico no es válido. El segundo enfoque es más complicado, pero garantiza que el correo electrónico se envíe solo si la creación del usuario ha tenido éxito. El tercer enfoque es simple pero carga la capa web con lógica empresarial que no debería saber.

¿No hay un enfoque más simple, tal vez impulsado por AOP,¿Eso garantiza que el correo electrónico se enviará solo si la transacción de creación del usuario realmente tuvo éxito? ¿Estoy paranoico al pensar que el primer enfoque podría fallar?

Estamos utilizando una pila Java EE + Spring y estamos dispuestos a integrar API adicionales (AOP? Spring Integration?) Para lograr esto.

¡Aclamaciones!

Respuestas

6 para la respuesta № 1

Otra opción que estoy usando actualmente para resolver este problema:

http://download.oracle.com/javaee/6/api/javax/transaction/Synchronization.html


5 para la respuesta № 2

Para enviar correos electrónicos, se recomienda usar una Colay programar los correos electrónicos que se enviarán como cada 5 o 15 minutos. La cola se almacenará en la base de datos, por lo tanto, dentro de la transacción. Luego, programe un procedimiento para enviar correos electrónicos desde esa cola en intervalos regulares.

Es la única forma que encontré para asegurarme de que el correo electrónico se envíe solo cuando la transacción se complete y se comprometa, ya que los correos electrónicos, por definición, no están vinculados a ningún tipo de transacciones de base de datos.


0 para la respuesta № 3

Yo agregaría una capa JMS ligera como ActiveMQ para el correo electrónico, es bastante fácil de configurar e integra (e incluso incrusta) con Spring. Entonces tiene

1) Transacción de creación de usuario y envío de mensaje JMS en 1 transacción. Si alguno de los dos falla, aún estás en buen estado (tanto la confirmación como la retrotracción y presentas un error al usuario)

2) Si el consumidor de JMS no puede enviar el correo electrónico, puede configurar la cola de JMS para que vuelva a intentarlo varias veces y tendrá una mejor solución para administrar problemas transitorios con su sistema de correo electrónico.


0 para la respuesta № 4

Hacer cola con la tabla de la base de datos y ejecutar el programa de programación con Quartz o algo así como debería ser razonable y fácil de implementar.

También es una buena idea usar RabbitMQ para aquellosdesarrollo de características. RabbitMQ es bastante fácil de configurar y puede utilizarse en la mayoría de los casos para el interfuncionamiento de publicación / suscripción entre sistemas, aunque es posible que necesite implementar un recibo a nivel de aplicación y aplicaciones pequeñas que suscriban mensajes de RabbitMQ y envíen correos electrónicos a través de SMTP.

Puede sonar excesivo, pero puedes usar este # 2Solución para cada sistema que requiera enviar correos electrónicos en el futuro. Aún puede usar el modelo basado en la cola de la base de datos para esto, pero usará la base de datos cpu / resources para enviar emmail.