我需要测量在Apache Camel中处理外部服务响应所需的时间。
我在网上搜索解决方案,但令人惊讶的是没有可接受的解决方案。
使用EventNotifier感觉太重了,而且框架级别的性能测量工具更多。
所以我已经制定了自己的简单解决方案,但我希望能有更好的东西,我错过了或者至少是建设性的反馈。
下面的解决方案尝试。
答案 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没有考虑异常处理?