使用拦截器计算Mule流的处理时间

我想计算我的mule流执行所需的执行时间,所以我使用了拦截器,这里是我的拦截器代码

class CustomLoggerInterceptor extends AbstractEnvelopeInterceptor { @Override public MuleEvent last(MuleEvent event, ProcessingTime time, long startTime, boolean exceptionWasThrown) throws MuleException { long totalTime=time.getStatistics().getTotalProcessingTime(); LOG.info("Start time for flow: "+event.getFlowConstruct().getName()+" is: "+startTime+" total execution time is: "+totalTime); return event; } //other inherited methods } 

现在的问题是,每当我执行我的mule流时,我从time.getStatistics().getTotalProcessingTime()得到的所有值time.getStatistics().getTotalProcessingTime()总是为’0’。

我使用正确的方法还是犯了一些错误?

我基本上需要一种从ProcessingTime对象中查找执行时间的方法。

任何指针赞赏

谢谢!

您可以通过以下两种方式实现: –

1)通过使用计时器拦截器 : –

  

把它放在流程的最后

2)使用自定义拦截器创建自己的计时器拦截器 : –

在流程结束时使用它: –

  

和com.customInterceptor.TimerInterceptor类: –

 import org.mule.api.MuleEvent; import org.mule.api.MuleException; import org.mule.api.interceptor.Interceptor; import org.mule.processor.AbstractInterceptingMessageProcessor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * TimerInterceptor simply times and displays the time taken to * process an event. */ public class TimerInterceptor extends AbstractInterceptingMessageProcessor implements Interceptor { /** * logger used by this class */ private static Log logger = LogFactory.getLog(TimerInterceptor.class); public MuleEvent process(MuleEvent event) throws MuleException { long startTime = System.currentTimeMillis(); MuleEvent resultEvent = processNext(event); if (logger.isInfoEnabled()) { long executionTime = System.currentTimeMillis() - startTime; logger.info("Custom Timer : "+resultEvent.getFlowConstruct().getName() + " took " + executionTime + "ms to process event [" + resultEvent.getId() + "]"); } return resultEvent; } } 

我不能建议将AbstractEnvelopeInterceptor用于两个reasins,它不是公共API的一部分,并且它们不能完全按照您的要求执行,如下所示:

 EnvelopeInterceptor is an intercepter that will fire before and after an event is received. 

您是否考虑过使用服务器通知 ?

我做了同样的测试,因为我想计算一个流程的处理时间。

这是一个例子:

 package com.testing.interceptor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mule.api.MuleEvent; import org.mule.api.MuleException; import org.mule.interceptor.AbstractEnvelopeInterceptor; import org.mule.management.stats.ProcessingTime; public class CustomInterceptor extends AbstractEnvelopeInterceptor{ private static Log logger = LogFactory.getLog(CustomInterceptor.class); @Override public MuleEvent last(MuleEvent event, ProcessingTime time, long startTime, boolean exceptionWasThrown) throws MuleException { long endTime = System.currentTimeMillis(); logger.info("Flow:"+event.getFlowConstruct().getName()+"-Procesing Time:"+(endTime-startTime)); return event; } @Override public MuleEvent before(MuleEvent event) throws MuleException { return event; } @Override public MuleEvent after(MuleEvent event) throws MuleException { return event; } } 

这就是流程:

                   

请注意,我使用“last”方法的“startTime”参数计算处理时间,并将“custom-interceptor”元素放在流的开头。

这是印刷日志:

 2015-12-10 18:21:27,493 INFO [com.testing.interceptor.TimerInterceptor] - Flow:testingFlowClient-Procesing Time:341