此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring AMQP 3.2.0spring-doc.cadn.net.cn

带注释的端点方法签名

到目前为止,我们一直在注入一个简单的String但是它实际上可以有一个非常灵活的方法签名。 以下示例重写它以注入Order使用自定义标头:spring-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

不是受支持类型之一的非带注释的元素(即Message,MessageProperties,Message<?>Channel) 与负载匹配。 您可以通过使用@Payload. 您还可以通过添加额外的@Valid.spring-doc.cadn.net.cn

注入 Spring 的消息抽象的能力特别有用,它可以从存储在特定于传输的消息中的所有信息中受益,而无需依赖特定于传输的 API。 以下示例显示了如何执行此作: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;
    }
}