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

代理 @RabbitListener 和泛型

如果您的服务旨在被代理(例如,在 @Transactional 的情况下),当接口包含泛型参数时,您应牢记一些注意事项。考虑以下示例:spring-doc.cadn.net.cn

interface TxService<P> {

   String handle(P payload, String header);

}

static class TxServiceImpl implements TxService<Foo> {

    @Override
    @RabbitListener(...)
    public String handle(Thing thing, String rk) {
         ...
    }

}

由于存在通用接口及其实现类,您将被迫切换到 CGLIB 目标类代理,因为该接口的实际实现类中的 handle 方法是一个桥接方法。在事务管理的情况下,通过使用注解选项可配置是否启用 CGLIB: @EnableTransactionManagement(proxyTargetClass = true)。在此情况下,所有注解都必须在实现类中的目标方法上进行声明,如下例所示:spring-doc.cadn.net.cn

static class TxServiceImpl implements TxService<Foo> {

    @Override
    @Transactional
    @RabbitListener(...)
    public String handle(@Payload Foo foo, @Header("amqp_receivedRoutingKey") String rk) {
        ...
    }

}