Чтобы упростить мою проблему, яSpring/RabbitMQ: управление транзакциями
App1 с @Transactionnal методом CreateUser():
- Вставьте новый пользователь в базе данных
- Добавить асинхронной сообщение в RabbitMQ так что пользователь получает письмо-уведомление
- (возможно, дополнительный код, но не очень)
App2 с RabbitMQ сообщение consummer
- Consummes сообщения на очереди рассылки в режиме реального времени
- Чтение почты данные в базе данных
- Отправить письмо
Проблема заключается в том, что иногда, App2 пытается использовать сообщение RabbitMQ до того, как транзакция будет совершена даже в App1. Это означает, что App2 не может читать почтовые данные в базе данных, так как пользователь еще не создан.
Некоторые решения могут быть:
- Используйте READ_UNCOMMITED уровень изоляции на App2
- Добавить некоторую задержку в доставке RabbitMQ сообщений (или некоторые RetryTemplate на consummer)
- изменить способ отправки сообщений электронной почты ...
Я видел, что весной есть RabbitTransactionManager, но я не могу понять, как это предполагается орк. Внутренние элементы обработки транзакций всегда кажутся немного трудными для понимания, и документация также не помогает.
Есть ли способ сделать что-то подобное?
- Добавить сообщение в очередь RabbitMQ в @Transactionnal метода
- При завершении транзакции, сообщение поручен в очередь, и изменения поручены к базе данных
- Так что сообщение не могут быть использованы до завершения транзакции db
Как? И что ожидать, например, если я отправляю синхронные сообщения RabbitMQ вместо асинхронных сообщений? Будет ли он блокировать поток, ожидающий ответа или что-то еще? Поскольку мы отправляем сообщения синхронизации и асинхронные сообщения для разных случаев использования.
я прав, что оба приложения потребляют сообщения из одной и той же очереди? – pinepain
Нет, App1 помещает сообщения в очередь, а App2 потребляет сообщения в этой очереди. –
Удалось ли вам решить эту проблему? Я столкнулся с той же проблемой. –