繁体   English   中英

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

[英]Calculating Processing time for a Mule flow by using Interceptors

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

    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

    }

现在的问题是,每当我执行m子流时,我从time.getStatistics().getTotalProcessingTime()获得的所有值始终为0。

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

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

任何指针赞赏

谢谢!

您可以通过以下两种方法来做到这一点:

1)使用计时器拦截器

<timer-interceptor />

把它放在流程的尽头

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

在流程结束时使用它:-

<custom-interceptor class="com.customInterceptor.TimerInterceptor" />

和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;

/**
 * <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;
    }
}

我不建议对两个reasins使用AbstractEnvelopeInterceptor,它不是公共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;
    }
}

这是流程:

<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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM