Исправление ошибки определения pointcut при определении аспекта для отслеживания отправки RabbitMQ - PullRequest
0 голосов
/ 31 мая 2019

Оперантная аппаратура для spring-rabbitmq не имеет аспекта, определенного для отслеживания org.springframework.amqp.rabbit.core.RabbitTemplate#send.Вот ссылка на код: RabbitMqSendTracingAspect.java

Я попытался реализовать его и получил некоторые серьезные ошибки при определении pointcut.

Вот мой код для того же:


@Aspect
@Configuration
public class AmqpSendTracingAspect {
    private final Tracer tracer;

    public AmqpSendTracingAspect(Tracer tracer) {
        this.tracer = tracer;
    }

    @Around(value = "execution(* org.springframework.amqp.core.AmqpTemplate.send(..)) " +
            "&& args(exchange,routingKey, message)", 
            argNames = "pjp,exchange,routingKey,message")
    public Object traceAmqpSend(ProceedingJoinPoint pjp, 
        String exchange, String routingKey, Message message) throws Throwable {

        final Object[] args = pjp.getArgs();

        System.out.println("Aspect RUnning");

        final MessageProperties messageProperties = message.getMessageProperties();

        Scope scope = AmqpTracingUtils.buildSendSpan(tracer, messageProperties);
        tracer.inject(
                scope.span().context(),
                Format.Builtin.TEXT_MAP,
                new AmqpInjectAdapter(messageProperties));

        AmqpSpanDecorator spanDecorator = new AmqpSpanDecorator();
        spanDecorator.onSend(messageProperties, exchange, routingKey, scope.span());

        args[2] = message;

        try {
            return pjp.proceed(args);
        } catch (Exception ex) {
            spanDecorator.onError(ex, scope.span());
            throw ex;
        } finally {
            scope.close();
        }
    }
}

Я получаю следующие ошибки из CglibAopProxy framework, даже когда я комментирую @EnableAspectJAutoProxy(proxyTargetClass = false)

Unable to proxy interface-implementing method [public final void org.springframework.amqp.rabbit.core.RabbitTemplate.start()] because it is marked as final: Consider using interface-based JDK proxies instead!

Unable to proxy interface-implementing method [public final void org.springframework.amqp.rabbit.core.RabbitTemplate.stop()] because it is marked as final: Consider using interface-based JDK proxies instead!

Пожалуйста, помогите мне!

1 Ответ

2 голосов
/ 31 мая 2019

Это не ошибка.код, создающий это сообщение, выглядит следующим образом:

if (implementsInterface(method, ifcs)) {
                        logger.info("Unable to proxy interface-implementing method [" + method + "] because " +
                                "it is marked as final: Consider using interface-based JDK proxies instead!");
                    }

Итак, это info, и это полностью не мешает вашему приложению работать позже.Просто указатель на то, что метод RabbitTemplate.start() не будет проксироваться, что определенно не должно быть.Итак, вы хороши до сих пор.

Я думаю, что поскольку вы используете Spring Cloud, вы не можете переопределить конфигурацию AOP с этим @EnableAspectJAutoProxy, поэтому он всегда использует CglibAopProxy.

Я бы просто проигнорировал это info.Лучше бы не делать такой уровень регистрации для каркасных категорий.

...