[英]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.