带注解的端点方法签名
到目前为止,我们一直在端点中注入一个简单的 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;
}
}