У нас есть микросервис, который прослушивает события, давайте пока назовем это AuditService
. Он слушает события аудита (AuditEvent
) на rabbitmq. Любой, кто хочет вызвать AuditService
, должен создать и запустить AuditEvent
. Мы поделились AuditEvent
pojo в общем модуле, чтобы его можно было использовать совместно.
В AuditService
есть прослушиватель событий, который прослушивает AuditEvent
из очереди rabbitmq. Когда мы получаем сообщение, мы затем выполняем некоторую обработку / проверку для AuditEvent
и затем сохраняем его в таблице базы данных AuditEntry
.
Затем мы хотим опубликовать другое событие. Позволяет назвать это AuditPublishEvent
. Таким образом, чтобы сделать это, мы создаем другую команду (AuditPublishCommand
), которая в свою очередь запускает AuditPublishEvent
. Это событие снова для очереди, и любая служба, публикующая AuditEvent
, будет прослушивать его. Будет служба для отправки ее по электронной почте, а другая - для отправки в виде push-уведомлений и т. Д.
На данный момент мы делаем на AuditService
Listen for AuditEvent
|
v
Trigger AuditEvent event handler
|
v
Validate audit event and process it
|
v
Save it to the database
|
v
If save is successful then send AuditPublishEvent to queue via AuditPublishCommand
Обратите внимание, что последняя часть должна быть синхронной, то есть, если сохранение db не удалось, мы не хотим отправлять электронную почту или что-то подобное. В настоящее время это выполняется путем вызова commandGateway из обработчика событий в AuditService
. Правильно ли вызывать commandGateway из EventListener
, если нет, какова альтернатива?
Вопрос в том, является ли это правильным / лучшим способом ведения дел с использованием структуры Axon и пружины?