|
此版本仍在开发中,目前尚不稳定。如需最新稳定版本,请使用 Spring AMQP 4.0.2! |
带注解的端点方法签名
到目前为止,我们一直在端点中注入一个简单的 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-annotated method arguments to extract a specific header value, including standard AMQP headers. -
@Headers-annotated argument that must also be assignable tojava.util.Mapfor getting access to all headers. -
转换后的负载
未使用注解的元素,且不属于支持的类型(即 Message、MessageProperties、Message<?> 和 Channel)时,将与有效载荷匹配。您可以通过使用 @Payload 注解参数来明确此行为。您还可以通过添加额外的 @Valid 来开启验证。
注入 Spring 的消息抽象能力特别有用,可充分利用传输特定消息中存储的所有信息,而无需依赖于传输特定的 API。</p><p>以下示例展示了如何实现这一点:
@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;
}
}