对于最新的稳定版本,请使用 Spring AMQP 3.2.0spring-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 目标类代理,因为接口的实际实现handlemethod 是一种桥接方法。 在事务管理的情况下,CGLIB 的使用是通过 注释选项:@EnableTransactionManagement(proxyTargetClass = true). 在这种情况下,必须在实现中的目标方法上声明所有 Comments,如下例所示: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) {
        ...
    }

}