Annotated Endpoint Method Signature
到目前为止,我们已经向端点中注入了一个简单的 String
,但它实际上可以具有一个非常灵活的方法签名。以下示例对其进行了重新编写,以使用自定义头注入 Order
:
@Component
public class MyService {
@RabbitListener(queues = "myQueue")
public void processOrder(Order order, @Header("order_type") String orderType) {
...
}
}
以下列表显示了可与侦听器端点中的参数匹配的参数:
-
The raw
org.springframework.amqp.core.Message
. -
来自原始
Message
的MessageProperties
。 -
com.rabbitmq.client.Channel
,消息在其上接收到。 -
从传入的 AMQP 消息转换的
org.springframework.messaging.Message
。 -
带有
@Header
注解的方法参数,用于提取特定的标头值,包括标准 AMQP 标头。 -
带有
@Headers
注解的参数,还必须可赋值给java.util.Map
以访问所有标头。 -
The converted payload
未带注解且不是受支持类型之一(即 Message
、MessageProperties
、Message<?>
和 Channel
)的元素与有效负载匹配。你可以通过使用 @Payload
为参数添加注解,使其显式。你还可以通过添加额外的 @Valid
开启验证。
注入 Spring 的消息抽象的功能非常有用,可以从 transport 特定的消息中存储的所有信息中受益,而无需依赖 transport 特定的 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;
}
}