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

时间:2015-02-23 09:14:28

标签: java apache-camel guava

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

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

使用EventNotifier感觉太重了,而且框架级别的性能测量工具更多。

所以我已经制定了自己的简单解决方案,但我希望能有更好的东西,我错过了或者至少是建设性的反馈。

下面的解决方案尝试。

2 个答案:

答案 0 :(得分:3)

我认为骆驼默认这样做。

  

自Camel 2.12起可用   默认情况下,从Camel 2.12启用消息历史记录。在路由期间,Camel会将Exchange的路由方式捕获为存储在Exchange上的org.apache.camel.MessageHistory实体。在org.apache.camel.MessageHistory上,有一些信息与处理器处理Exchange所花费的路由ID,处理器ID,时间戳和已用时间相对应。

只有你需要做的就是在你的" doFinally"中获取MessageHistory。代码:

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

在那里你可以得到每条路线的经过时间

答案 1 :(得分:0)

这是我的业务逻辑的样子:

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来自Guava,消费者只是一个自定义功能界面。

等待评论。

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

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 vs 344,可能是因为Camel没有考虑异常处理?