Annotated Endpoint Method Signature

到目前为止,我们已经向端点中注入了一个简单的 String,但它实际上可以具有一个非常灵活的方法签名。以下示例对其进行了重新编写,以使用自定义头注入 Order

@Component
public class MyService {

    @RabbitListener(queues = "myQueue")
    public void processOrder(Order order, @Header("order_type") String orderType) {
        ...
    }
}

以下列表显示了可与侦听器端点中的参数匹配的参数:

  • The raw org.springframework.amqp.core.Message.

  • 来自原始 MessageMessageProperties

  • com.rabbitmq.client.Channel,消息在其上接收到。

  • 从传入的 AMQP 消息转换的 org.springframework.messaging.Message

  • 带有 @Header 注解的方法参数,用于提取特定的标头值,包括标准 AMQP 标头。

  • 带有 @Headers 注解的参数,还必须可赋值给 java.util.Map 以访问所有标头。

  • The converted payload

未带注解且不是受支持类型之一(即 MessageMessagePropertiesMessage<?>Channel)的元素与有效负载匹配。你可以通过使用 @Payload 为参数添加注解,使其显式。你还可以通过添加额外的 @Valid 开启验证。

注入 Spring 的消息抽象的功能非常有用,可以从 transport 特定的消息中存储的所有信息中受益,而无需依赖 transport 特定的 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;
    }
}