此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring AMQP 3.2.0! |
带注释的端点方法签名
到目前为止,我们一直在注入一个简单的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
收到消息的 ON 上。 -
这
org.springframework.messaging.Message
从传入的 AMQP 消息转换而来。 -
@Header
-annotated 方法参数来提取特定的标头值,包括标准 AMQP 标头。 -
@Headers
-annotated 参数,该参数也必须可分配给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;
}
}