Spring Modulith:模块内领域事件发给外部Kafka的示例


使用spring modulith轻松地将选定的域事件外部化到消息代理:

  1. 添加例如,Kafka集成模块
  2. 选择要外部化的域类型(例如,通过使用(At)外部化)

点击标题见案例,展示如何自动将域事件外部化到 Kafka。两个基本必需的步骤是:

  1. 将依赖项添加spring-modulith-events-kafka到项目中(runtime范围足够)。
  2. 添加spring-modulith-events-api依赖项来注释要自动外部化的事件类型@Externalized(请参阅 参考资料OrderCompleted)。

TestApplication(在src/test/java) 中声明了一个KafkaOperations实例,这样我们就不需要为示例运行实际的 Kafka 实例。声明的 bean 只是触发一些模拟与 Kafka 实际交互的日志输出。

使用运行测试应用程序./mvnw spring-boot:test-run应显示以下输出:

22:20:20.398 D -     main : Registering domain event externalization to Kafka… (1)

22:20:21.267 I -     main : Triggering order completion… (2)
22:20:21.277 D -     main : Registering publication of example.order.OrderCompleted for org.springframework.modulith.events.support.DelegatingEventExternalizer.externalize(java.lang.Object). (3)
22:20:21.325 D -   task-1 : Externalizing event of type class example.order.OrderCompleted to RoutingTarget[value=order.OrderCompleted]. (4)
22:20:21.327 I -   task-1 : Sending message {"orderId":{"id":"ef3521e8-d498-4539-8745-3a1c74bbe90d"}} to RoutingTarget[value=order.OrderCompleted]. (5)
22:20:21.376 D -   task-1 : Marking publication of event example.order.OrderCompleted to listener org.springframework.modulith.events.support.DelegatingEventExternalizer.externalize(java.lang.Object) completed. (6)

  1. 在应用程序引导时,spring-modulith-events-kafka模块注册一个ApplicationModuleListener将侦听要外部化的域事件的模块。
  2. 一旦启动,应用程序的方法就会调用最终导致事件发布的main业务方法。反过来,它又用 Spring Modulith 进行注释,因此符合外部化的条件。OrderManagementOrderCompleted@Externalized
  3. 事件发布基础设施检测到@ApplicationModuleListener对事件感兴趣,它会在事件发布注册表中创建一个条目来跟踪事件的处理。
  4. 外部化@ApplicationModuleListener被触发(注意它如何异步运行,由task-1线程指示)。
  5. 我们的模拟KafkaOperations被调用并触发模拟实际发送的日志消息。
  6. 事件发布注册表最终将发布标记为已完成,因为发送已成功完成。