注解端点方法签名

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