注解端点方法签名
到目前为止,我们一直在端点中注入一个简单的 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)进行匹配。你可以通过在参数上添加 @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;
}
}