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