使用spring modulith轻松地将选定的域事件外部化到消息代理:
- 添加例如,Kafka集成模块
- 选择要外部化的域类型(例如,通过使用(At)外部化)
点击标题见案例,展示如何自动将域事件外部化到 Kafka。两个基本必需的步骤是:
- 将依赖项添加spring-modulith-events-kafka到项目中(runtime范围足够)。
- 添加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) |
- 在应用程序引导时,spring-modulith-events-kafka模块注册一个ApplicationModuleListener将侦听要外部化的域事件的模块。
- 一旦启动,应用程序的方法就会调用最终导致事件发布的main业务方法。反过来,它又用 Spring Modulith 进行注释,因此符合外部化的条件。OrderManagementOrderCompleted@Externalized
- 事件发布基础设施检测到@ApplicationModuleListener对事件感兴趣,它会在事件发布注册表中创建一个条目来跟踪事件的处理。
- 外部化@ApplicationModuleListener被触发(注意它如何异步运行,由task-1线程指示)。
- 我们的模拟KafkaOperations被调用并触发模拟实际发送的日志消息。
- 事件发布注册表最终将发布标记为已完成,因为发送已成功完成。