All Downloads are FREE. Search and download functionalities are using the official Maven repository.

host.anzo.commons.threading.RunnableWrapper Maven / Gradle / Ivy

package host.anzo.commons.threading;

import de.mxro.metrics.jre.Metrics;
import delight.async.properties.PropertyNode;
import host.anzo.commons.emergency.metric.Metric;
import host.anzo.commons.emergency.metric.MetricGroupType;
import host.anzo.commons.emergency.metric.MetricResult;
import host.anzo.core.config.EmergencyConfig;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;

@Slf4j
@Metric
public class RunnableWrapper implements Runnable {
    private static final PropertyNode RUNNABLE_WRAPPER_METRICS = Metrics.create();
    private static final PropertyNode RUNNABLE_WRAPPER_METRICS_VIRTUAL = Metrics.create();

	private final Runnable _r;
	private final boolean _v;
    private final String _n;

	public RunnableWrapper(final Runnable r) {
		this(r, false);
	}

	public RunnableWrapper(final Runnable r, final boolean virtual) {
        this(r, virtual, r.getClass().getSimpleName());
	}

    public RunnableWrapper(final Runnable r, final String name) {
        this(r, false, name);
    }

    public RunnableWrapper(final Runnable r, final boolean virtual, final String name) {
        _r = r;
        _v = virtual;
        _n = name != null ? name : r.getClass().getSimpleName();
    }

	@Override
	public void run() {
		if (_r != null) {
			try {
                final long start = System.nanoTime();
				_r.run();
                final long end = System.nanoTime();
                if (EmergencyConfig.ENABLE_METRICS) {
                    (_v ? RUNNABLE_WRAPPER_METRICS_VIRTUAL : RUNNABLE_WRAPPER_METRICS).record(Metrics.value(_n + "_time_ns", end - start));
                }
			} catch (final Throwable e) {
                if (EmergencyConfig.ENABLE_METRICS) {
                    (_v ? RUNNABLE_WRAPPER_METRICS_VIRTUAL : RUNNABLE_WRAPPER_METRICS).record(Metrics.happened(_n + "_error"));
                }
				log.error("Error while running RunnableWrapper:", e);
				throw new RuntimeException(e);
			}
		}
	}

    public static @NotNull MetricResult getMetric() {
        final MetricResult rw = new MetricResult();
        rw.setMetricGroupType(MetricGroupType.THREADPOOL);
        rw.setName("RunnableWrapper");
        rw.setData(RUNNABLE_WRAPPER_METRICS.render().get());
        return rw;
    }

    public static MetricResult getMetricVirtual() {
        final MetricResult rwv = new MetricResult();
        rwv.setMetricGroupType(MetricGroupType.THREADPOOL);
        rwv.setName("RunnableWrapperVirtual");
        rwv.setData(RUNNABLE_WRAPPER_METRICS_VIRTUAL.render().get());
        return rwv;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy