ProcessTerminationFaultInjector.java

package com.ecommerce.trade.infrastructure.messaging;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;

@Component
public class ProcessTerminationFaultInjector {

    private static final Logger log = LoggerFactory.getLogger(ProcessTerminationFaultInjector.class);

    private final ProcessTerminationFaultProperties properties;
    private final AtomicBoolean triggered = new AtomicBoolean();

    public ProcessTerminationFaultInjector(ProcessTerminationFaultProperties properties) {
        this.properties = properties;
    }

    public void terminateIfArmed(ProcessTerminationPoint point, String eventId) {
        Objects.requireNonNull(point, "point");
        if (!properties.enabled()
                || properties.point() != point
                || !Objects.equals(properties.targetEventId(), eventId)
                || !triggered.compareAndSet(false, true)) {
            return;
        }
        log.error("M3 process termination fault triggered: point={}, eventId={}, exitCode={}",
                point, eventId, properties.exitCode());
        halt(properties.exitCode());
    }

    void halt(int exitCode) {
        Runtime.getRuntime().halt(exitCode);
    }

    boolean triggered() {
        return triggered.get();
    }
}