注解驱动的端点方法签名

到目前为止,我们一直在端点中注入一个简单的 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,以便访问所有头。

  • 转换后的有效载荷。

未注解的元素如果不是支持的类型之一(即 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;
    }
}