此版本仍在开发中,目前尚不稳定。如需最新稳定版本,请使用 Spring AMQP 4.0.2spring-doc.cadn.net.cn

带注解的端点方法签名

到目前为止,我们一直在端点中注入一个简单的 String,但其方法签名实际上可以非常灵活。以下示例将它重写为通过自定义头信息注入 Orderspring-doc.cadn.net.cn

@Component
public class MyService {

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

以下列表显示了可用于与监听器端点参数匹配的参数:spring-doc.cadn.net.cn

未使用注解的元素,且不属于支持的类型(即 MessageMessagePropertiesMessage<?>Channel)时,将与有效载荷匹配。您可以通过使用 @Payload 注解参数来明确此行为。您还可以通过添加额外的 @Valid 来开启验证。spring-doc.cadn.net.cn

注入 Spring 的消息抽象能力特别有用,可充分利用传输特定消息中存储的所有信息,而无需依赖于传输特定的 API。</p><p>以下示例展示了如何实现这一点:spring-doc.cadn.net.cn

@RabbitListener(queues = "myQueue")
public void processOrder(Message<Order> order) { ...
}

方法参数的处理由 DefaultMessageHandlerMethodFactory 提供,您可进一步自定义它以支持其他方法参数。转换和验证支持也可在该处进行自定义。spring-doc.cadn.net.cn

例如,如果我们希望在处理之前确保我们的 Order 是有效的,我们可以用 @Valid 注解负载,并配置必要的验证器,如下所示:spring-doc.cadn.net.cn

@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;
    }
}