跳到主要内容
版本:4.1.1

注解端点方法签名

Doubao 中英对照 Annotated Endpoint Method Signature

到目前为止,我们在端点中注入的是一个简单的 String,但实际上它可以具有非常灵活的方法签名。下面的示例对其进行改写,以注入带有自定义消息头的 Order:

@Component
public class MyService {

@RabbitListener(queues = "myQueue")
public void processOrder(Order order, @Header("order_type") String orderType) {
...
}
}

下面的清单列出了可在监听端点中与参数匹配的可用参数:

  • 原始的 org.springframework.amqp.core.Message。
  • 来自原始 Message 的 MessageProperties。
  • 接收该消息时所在的 com.rabbitmq.client.Channel。
  • 由传入 AMQP 消息转换而来的 org.springframework.messaging.Message。
  • 用 @Header 注解的方法参数,用于提取特定的消息头值,包括标准 AMQP 消息头。
  • 用 @Headers 注解的参数,该参数还必须可赋值给 java.util.Map,以便访问所有消息头。
  • 转换后的载荷

一个未注解、且不属于受支持类型(即 Message、MessageProperties、Message<?> 和 Channel)的元素,会与载荷匹配。你可以通过给参数添加 @Payload 注解来显式表明这一点。你还可以额外添加 @Valid 来开启校验。

注入 Spring 消息抽象的能力特别有用,它让你能够利用传输相关消息中存储的全部信息,而无需依赖传输相关的 API。下面的示例展示了如何这样做:

@RabbitListener(queues = "myQueue")
public void processOrder(Message<Order> order) { ...
}

方法参数的处理由 DefaultMessageHandlerMethodFactory 提供,你可以对其做进一步定制以支持额外的方法参数。转换和校验支持也可以在那里定制。

例如,如果我们想在处理 Order 之前确保它是有效的,可以用 @Valid 注解载荷并配置必要的校验器,如下所示:

@Configuration
@EnableRabbit
public class AppConfig implements RabbitListenerConfigurer {

@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
}

@Bean
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
factory.setValidator(myValidator());
return factory;
}
}