1

由于@Timed 注释不适用于我的基于 SOAP 的 Web 服务,因此我编写了一个 SOAP 处理程序,以便能够自己测量 Web 服务调用的持续时间。我想知道这个解决方案是否是线程安全的。

我的 SOAP 处理程序的源代码:

package nl.tent.laboratory.emp.metrics;

import javax.inject.Inject;
import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import org.eclipse.microprofile.metrics.MetricID;
import org.eclipse.microprofile.metrics.MetricRegistry;
import org.eclipse.microprofile.metrics.Timer;

/**
 * Deze klasse klokt de web service calls.
 *
 * Daar de Eclipse MicroProfile Metrics annotatie @Timed niet werkt in combinatie met de annotatie @WebService klokken we zelf.
 */
public class TimerSOAPHandler extends AbstractGenericSOAPHandler {

    @Inject
    MetricRegistry metricRegistry;

    public TimerSOAPHandler() {
        super();
    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        // Bij het inkomende bericht (request) wordt de tijdsmeting gestart.
        if (isInbound(context)) {
            startTiming(context);
        }
        // Bij het uitgaande bericht (response) wordt de tijdsmeting gestopt.
        if (isOutbound(context)) {
            stopTiming(context);
        }

        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        // Bij het inkomende bericht (request) wordt de tijdsmeting gestart.
        if (isInbound(context)) {
            startTiming(context);
        }
        // Bij het uitgaande bericht (response) wordt de tijdsmeting gestopt.
        if (isOutbound(context)) {
            stopTiming(context);
        }

        return true;
    }

    private void startTiming(SOAPMessageContext context) {
        String serviceName = ((QName) context.get(MessageContext.WSDL_SERVICE)).toString();
        String operationName = ((QName) context.get(MessageContext.WSDL_OPERATION)).getLocalPart();

        Timer timer = metricRegistry.timer(serviceName + "_" + operationName + "_timer");

        Timer.Context timerContext = timer.time(); // start
    }

    private void stopTiming(SOAPMessageContext context) {
        String serviceName = ((QName) context.get(MessageContext.WSDL_SERVICE)).toString();
        String operationName = ((QName) context.get(MessageContext.WSDL_OPERATION)).getLocalPart();

        MetricID metricID = new MetricID(serviceName + "_" + operationName + "_timer");

        Timer timer = metricRegistry.getTimers().get(metricID);

        Timer.Context timerContext = timer.time();
        timerContext.stop();
    }

}

与此同时,@Timed 注释正在工作,我更喜欢使用@Timed 注释。但是,我想知道这(@Timed)是否是线程安全的。

我使用 Eclipse MicroProfile Metrics 的 Payara 实现。

4

0 回答 0