繁体   English   中英

如何使用Apache Camel测量经过时间

[英]How to measure elapsed time with Apache Camel

我需要测量在Apache Camel中处理外部服务响应所花费的时间。

我在网上搜索解决方案,令人惊讶的是没有一个可接受的解决方案。

使用EventNotifier会使您感到负担沉重,并且需要更多框架级别的性能衡量工具。

因此,我制定了自己的简单解决方案,但我希望能得到一些我错过的更好的东西,或者至少是建设性的反馈。

下面的解决方案尝试。

我认为骆驼默认情况下会这样做。

从骆驼2.12开始,默认情况下从骆驼2.12启用消息历史记录。 在路由过程中,骆驼捕获了如何路由Exchange,作为存储在Exchange上的org.apache.camel.MessageHistory实体。 在org.apache.camel.MessageHistory上,有关于路由ID,处理器ID,时间戳和处理器处理Exchange所用时间的信息。

只需要做的就是在“ doFinally”代码中获取MessageHistory:

List<MessageHistory> list = exchange.getProperty(Exchange.MESSAGE_HISTORY,List.class);

在那里,您可以获取每条路线的经过时间

这就是我的业务逻辑:

from(incomingUri).routeId(ROUTE_ID)
            ...
            .doTry()
                .bean(stopwatch, "start")
                .to(externalService)
            .doCatch(NoHttpResponseException.class, ProtocolException.class, IOException.class)
                .process(externalServiceExceptionProcessor(ERROR_MESSAGE_SERVICE_NOT_RESPONDING))
            .doFinally()
                .bean(stopwatch, "stop")
            .end()
            ...

Stopwatch bean实例:

StopWatchBean stopwatch = new StopWatchBean(new ExchangeConsumer<Stopwatch>() {
        @Override
        public void accept(Exchange exchange, Stopwatch stopwatch) {
            Long taken = stopwatch.elapsed(MILLISECONDS);
            exchange.setProperty(RESPONSE_TIME, constant(taken));
        }
});

和类定义:

public class StopWatchBean {

    private final Stopwatch stopwatch;
    private final ExchangeConsumer<Stopwatch> onStopFunction;

    public StopWatchBean(ExchangeConsumer<Stopwatch> onStopFunction) {
        this.stopwatch = Stopwatch.createUnstarted();
        this.onStopFunction = onStopFunction;
    }

    public void stop(Exchange exchange) {
        if (!stopwatch.isRunning()) {
            return;
        }
        stopwatch.stop();
        onStopFunction.accept(exchange, stopwatch);
    }

    public void start(Exchange unused) {
        stopwatch.start();
    }

    public void reset(Exchange unused) {
        stopwatch.reset();
    }

}

Stopwatch来自番石榴,而使用者只是一个自定义功能界面。

等待评论。

编辑:我添加了一些简单的代码,例如:

started = System.currentTimeMillis();
...
stopped = System.currentTimeMillis();

elapsed = stopped - started;

并进行了一些测量,在正常情况下看起来不错:

[xxxxxxxxxProxy    ] [stopWatchStart    ] [bean[StopWatchBean{elapsed=100, stopwatch=100.8 ms}]                          ] [         1]
[xxxxxxxxxProxy    ] [toXxxxxxxxxx      ] [https://127.0.0.1:5680/xxxxxxxxx?throwExceptionOnFailure=false&bridgeEndpoint=] [       100]
[xxxxxxxxxProxy    ] [stopWatchStop     ] [bean[StopWatchBean{elapsed=100, stopwatch=100.8 ms}]                          ] [         3]

并且在错误/异常上有所不同:

[xxxxxxxxxProxy    ] [stopWatchStart    ] [bean[StopWatchBean{elapsed=38, stopwatch=344.1 ms}]                           ] [         1]
[xxxxxxxxxProxy    ] [toXxxxxxxxxx      ] [https://127.0.0.1:5680/xxxxxxxxx?throwExceptionOnFailure=false&bridgeEndpoint=] [        37]
[xxxxxxxxxProxy    ] [stopWatchStop     ] [bean[StopWatchBean{elapsed=38, stopwatch=344.1 ms}]                           ] [         1]

我很困惑,为什么差异38和344可能是由于Camel没有考虑到异常处理?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM