Spring Modulith增加事件外部化的支持


SpringBoot应用程序的事务绑定发件箱模式 实现,专门基于Kafka、AMQP和JMS的代理。

应用程序模块之间交换的一些事件可能对外部系统感兴趣。Spring Modulith 允许将选定的事件发布到各种消息代理。要使用该支持,您需要执行以下步骤:

  1. 代理特定的 Spring Modulith 工件添加到您的项目中。
  2. 通过使用 Spring Modulith 或 jMolecules 注释来注释事件类型,以选择要外部化的事件类型@Externalized。
  3. 在注释的值中指定特定于代理的路由目标。

支持的消息队列:

  • spring-modulith-events-kafka:使用 Spring Kafka 与代理进行交互。逻辑路由键将用作
  • spring-modulith-events-amqp:使用 Spring AMQP 与任何兼容的代理进行交互。例如,需要 Spring Rabbit 的显式依赖声明。逻辑路由键将用作 AMQP 路由键。
  • spring-modulith-events-jms:使用 Spring 的核心 JMS 支持。不支持路由键。

事件外部化会对发布的每个应用程序事件执行三个步骤:

  1. 确定事件是否应被外部化--我们称之为 "事件选择"。默认情况下,只有位于 Spring Boot 自动配置包内并使用其中一个受支持的 @Externalized 注解注释的事件类型才会被选中进行外部化。
  2. 映射事件(可选)--默认情况下,事件会使用应用程序中的 Jackson ObjectMapper 序列化为 JSON 格式,并按原样发布。映射步骤允许开发人员自定义表示法,甚至用适合外部各方的表示法完全替换原始事件。请注意,映射步骤在实际序列化待发布对象之前进行。
  3. 确定路由目标 - 消息代理客户端需要一个发布消息的逻辑目标。目标通常标识物理基础架构(主题、交换或队列,具体取决于代理),通常从事件类型静态导出。除非在 @Externalized 注解中特别定义,否则 Spring Modulith 会使用应用程序本地类型名称作为目标。换句话说,在基础包为 com.acme.app 的 Spring Boot 应用程序中,事件类型 com.acme.app.sample.SampleEvent 将发布到 sample.SampleEvent。

有些消息代理还允许定义一个动态路由键,在实际目标中用于不同目的。默认情况下,不使用路由键。

@Externalized
要通过注释定义自定义路由键,可以对每个特定注释中可用的目标/值属性使用 的@Externalized模式:

通过 SpEL 表达式定义动态路由键:

@Externalized("customer-created::#{this.getLastname()}"
class CustomerCreated {

  String getLastname() { 
   
// …
  }
}

CustomerCreated 事件通过访问者方法公开了客户的姓氏。然后,在目标声明的::分隔符后的关键表达式中,通过 this.getLastname() 表达式使用该方法。

如果键值计算变得更加复杂,建议将其委托给一个以事件为参数的 Spring Bean:

调用 Spring Bean 计算路由键:

@Externalized("…::#{@beanName.someMethod(this)}")

更多点击标题

补充知识点:
在SpringBoot 3.2中,一旦启用虚拟线程,虚拟线程执行器将自动配置为Kafka和RabbitMQ侦听器(Spring Boot 3.2附带新的@ `ConditionalOnThreading`和`spring.threads.virtual.enabled`属性)