使用拦截器计算 Mule 流的处理时间
Calculating Processing time for a Mule flow by using Interceptors
我想计算我的 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()
获得的所有值始终为“0”。
我使用的方法是正确的还是我犯了一些错误?
我基本上需要一种从 ProcessingTime
对象中查找执行时间的方法。
感谢任何指点
谢谢!
我不建议对两个原因使用 AbstractEnvelopeInterceptor,它不是 public API 的一部分,并且它们不完全按照您的要求进行操作,如:
EnvelopeInterceptor is an intercepter that will fire before and after an event is received.
您是否考虑过使用 server notifications?
您可以通过以下两种方式完成:-
1) 通过使用 定时器拦截器 :-
<timer-interceptor />
将其放在流程的末尾
2) 使用自定义拦截器创建您自己的定时器拦截器 :-
在流程结束时使用它:-
<custom-interceptor class="com.customInterceptor.TimerInterceptor" />
和com.customInterceptor.TimerInterceptor class :-
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;
/**
* <code>TimerInterceptor</code> 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;
}
}
我做了同样的测试,因为我想计算一个流的处理时间。
示例如下:
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;
}
}
这是流程:
<flow name="testingFlowClient">
<http:listener config-ref="HTTP_Listener_Configuration" path="/client/*" doc:name="HTTP"/>
<custom-interceptor class="com.testing.interceptor.CustomInterceptor" />
<logger message="Before Transformation" level="INFO" />
<json:json-to-object-transformer returnClass="com.testing.domain.GeneralRequest" />
<set-variable variableName="processTypeJob" value="#[payload.processTypeJob]"/>
<set-variable variableName="waitTime" value="#[payload.waitTime]"/>
<logger message="After Transformation" level="INFO" />
<json:object-to-json-transformer/>
<http:request config-ref="HTTP_Request_Configuration" path="/service/{waitTime}" method="POST"
responseTimeout="50000000">
<http:request-builder>
<http:query-param paramName="api_key"
value="abcde" />
<http:query-param paramName="processTypeJob" value="#[processTypeJob]" />
<http:query-param paramName="fields" value="averages" />
<http:uri-param paramName="waitTime" value="#[waitTime]" />
</http:request-builder>
</http:request>
</flow>
请注意,我使用 "last" 方法的 "startTime" 参数计算处理时间,并将 "custom-interceptor" 元素放在流程的开头。
这是打印的日志:
2015-12-10 18:21:27,493 INFO [com.testing.interceptor.TimerInterceptor] - Flow:testingFlowClient-Procesing Time:341
我想计算我的 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()
获得的所有值始终为“0”。
我使用的方法是正确的还是我犯了一些错误?
我基本上需要一种从 ProcessingTime
对象中查找执行时间的方法。
感谢任何指点
谢谢!
我不建议对两个原因使用 AbstractEnvelopeInterceptor,它不是 public API 的一部分,并且它们不完全按照您的要求进行操作,如:
EnvelopeInterceptor is an intercepter that will fire before and after an event is received.
您是否考虑过使用 server notifications?
您可以通过以下两种方式完成:-
1) 通过使用 定时器拦截器 :-
<timer-interceptor />
将其放在流程的末尾
2) 使用自定义拦截器创建您自己的定时器拦截器 :-
在流程结束时使用它:-
<custom-interceptor class="com.customInterceptor.TimerInterceptor" />
和com.customInterceptor.TimerInterceptor class :-
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;
/**
* <code>TimerInterceptor</code> 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;
}
}
我做了同样的测试,因为我想计算一个流的处理时间。
示例如下:
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;
}
}
这是流程:
<flow name="testingFlowClient">
<http:listener config-ref="HTTP_Listener_Configuration" path="/client/*" doc:name="HTTP"/>
<custom-interceptor class="com.testing.interceptor.CustomInterceptor" />
<logger message="Before Transformation" level="INFO" />
<json:json-to-object-transformer returnClass="com.testing.domain.GeneralRequest" />
<set-variable variableName="processTypeJob" value="#[payload.processTypeJob]"/>
<set-variable variableName="waitTime" value="#[payload.waitTime]"/>
<logger message="After Transformation" level="INFO" />
<json:object-to-json-transformer/>
<http:request config-ref="HTTP_Request_Configuration" path="/service/{waitTime}" method="POST"
responseTimeout="50000000">
<http:request-builder>
<http:query-param paramName="api_key"
value="abcde" />
<http:query-param paramName="processTypeJob" value="#[processTypeJob]" />
<http:query-param paramName="fields" value="averages" />
<http:uri-param paramName="waitTime" value="#[waitTime]" />
</http:request-builder>
</http:request>
</flow>
请注意,我使用 "last" 方法的 "startTime" 参数计算处理时间,并将 "custom-interceptor" 元素放在流程的开头。
这是打印的日志:
2015-12-10 18:21:27,493 INFO [com.testing.interceptor.TimerInterceptor] - Flow:testingFlowClient-Procesing Time:341