带注解的端点方法签名

到目前为止,我们一直在端点中注入简单的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 注解的方法参数,用于提取特定 header 值,包括标准 AMQP header。

  • @Headers 注解的参数,也必须可赋值给java.util.Map才能访问所有 header。

  • 转换后的有效负载

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