此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring AMQP 3.2.6! |
带注释的端点方法签名
到目前为止,我们一直在注入一个简单的String
在我们的端点中,但它实际上可以有一个非常灵活的方法签名。
以下示例重写它以注入Order
使用自定义标头:
@Component
public class MyService {
@RabbitListener(queues = "myQueue")
public void processOrder(Order order, @Header("order_type") String orderType) {
...
}
}
以下列表显示了可用于与侦听器终结点中的参数匹配的参数:
-
原始的
org.springframework.amqp.core.Message
. -
这
MessageProperties
从原始Message
. -
这
com.rabbitmq.client.Channel
收到消息的。 -
这
org.springframework.messaging.Message
从传入的 AMQP 消息转换而来。 -
@Header
-annotated 方法参数来提取特定的标头值,包括标准 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;
}
}