注解端点方法签名

到目前为止,我们一直在向我们的端点注入一个简单的 String,但它实际上可以具有非常灵活的方法签名。以下示例将其重写为使用自定义标头注入 Order

@Component
public class MyService {

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

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

  • 原始的 org.springframework.amqp.core.Message

  • 来自原始 MessageMessageProperties

  • 接收消息的 com.rabbitmq.client.Channel

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

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

  • @Headers 注释的参数,该参数也必须可分配给 java.util.Map,以便访问所有标头。

  • 转换后的有效负载

不是支持类型之一(即 MessageMessagePropertiesMessage<?>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;
    }
}