es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enviando eventos de rabbitMQ después de la confirmación de la transacción.

Tengo una tarea grande en una transacción (@Transactional method). En esta tarea se recogen los ids y luego, después de confirmar la transacción, deben ser enviados a RabbitMQ (con el método convertAndSend). El listener de RabbitMQ, en el otro lado, toma los ids y actualiza los estados en la base de datos (es importante actualizar los estados después de los cambios en la transacción porque solo después de ellos los datos actualizados son actuales).

Tengo las siguientes preguntas:

  1. ¿Cuál es la mejor manera de utilizar el hook al final (commit) de la transacción? Necesito hacer uno un método “afterCommit” para varios clases de servicios (muchos métodos transaccionales);
  2. ¿Qué necesito usar como almacenamiento de ids? He pensado en algo como una variable ThreadLocal pero esto no es una opción – si hay un parallelStream, se crea un nuevo Thread;
  3. ¿Quizás alguna otra solución?

He leído sobre el plugin de retraso en RabbitMQ pero no es la variante para mi tarea – su tiempo es muy diferente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    1. Puede utilizar el TransactionSynchronizationManager para registrar un objeto TransactionSynchronization que se invocará después de que se confirme la transacción.
    2. Puede usar una variable ThreadLocal para almacenar las identificaciones, pero debe tener en cuenta que esto solo funcionará si la transacción se ejecuta en el mismo hilo.
    3. También puede utilizar un ConcurrentHashMap para almacenar las identificaciones, ya que es seguro para subprocesos y se puede acceder desde múltiples subprocesos.

Comments are closed.