用于非阻塞IO调用的aspectj计时器

时间:2016-08-10 13:08:50

标签: java aspectj nio vert.x

我正在尝试为NIO实现时间方法执行的方面。

基本上,我需要在最初调用方法时获取时间,然后在触发回调时(回调始终是fail()或succeeded()调用 - 所以我需要将初始方法调用与适当的回调。

我有以下实现,但除非是连续调用,否则它将无效。当然不是这种情况。

任何帮助都会很棒

public aspect TimerAJ {
    private long timer = 0;
    private String methodName;
    private static Logger logger = LoggerFactory.getLogger(TimerAJ.class);

    //the call to the call back method
    pointcut timerCall1() : target(io.vertx.core.AsyncResult) && (call( * io.vertx.core.AsyncResult.failed(..)) || call( * io.vertx.core.AsyncResult.succeeded(..)));

    //the call to the method itself
    pointcut timerCall2() : execution(@Timer * *(..));

    before() : timerCall2() {
        timer = System.currentTimeMillis();
        methodName = methodSignature.getName();
    }
    after() : timerCall1() {
        logger.info(methodName + " " + String.format("%s took %d ms", thisEnclosingJoinPointStaticPart.getSourceLocation().getWithinType().getName(), (System.currentTimeMillis() - timer)));
    }
}

1 个答案:

答案 0 :(得分:0)

您需要重新考虑这种方法,因为它根本不适用于Vert.x。

您尝试执行的操作是在调用@Timer方法时开始计算,并在任何 AsyncResult返回时停止计数。

您可以做什么:使用vertx.eventBus().publish()发送开始/停止指标。使用其他Verticle来收集vertx.eventBus().consumer()的指标并显示它们。

另外,请查看Vert.x Dropwizard Metrics。如果你想要的只是实际的统计数据,他们会为你提供,没有太多的实施。