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

io.automatiko.addons.fault.tolerance.internal.AutomatikoStrategyCache Maven / Gradle / Ivy

There is a newer version: 0.36.0
Show newest version
package io.automatiko.addons.fault.tolerance.internal;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.function.Supplier;

import jakarta.enterprise.event.Event;
import jakarta.enterprise.inject.Alternative;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

import io.automatiko.addons.fault.tolerance.CircuitClosedEvent;
import io.smallrye.faulttolerance.FaultToleranceOperationProvider;
import io.smallrye.faulttolerance.SpecCompatibility;
import io.smallrye.faulttolerance.config.FaultToleranceOperation;
import io.smallrye.faulttolerance.core.FaultToleranceStrategy;
import io.smallrye.faulttolerance.internal.InterceptionPoint;
import io.smallrye.faulttolerance.internal.StrategyCache;

@Alternative
@Singleton
public class AutomatikoStrategyCache extends StrategyCache {

    Event events;
    FaultToleranceOperationProvider operationProvider;
    Set circuitBreakers = new HashSet<>();

    @Inject
    public AutomatikoStrategyCache(Event events, FaultToleranceOperationProvider operationProvider,
            SpecCompatibility specCompatibility) {
        super(specCompatibility);
        this.events = events;
        this.operationProvider = operationProvider;
    }

    @Override
    public  FaultToleranceStrategy getStrategy(InterceptionPoint point, Supplier> producer) {

        return super.getStrategy(point,
                () -> {
                    FaultToleranceOperation operation = operationProvider.get(point.method().getDeclaringClass(),
                            point.method());
                    FaultToleranceStrategy t = producer.get();
                    if (operation.hasCircuitBreaker()) {
                        String cbName = operation.hasCircuitBreakerName()
                                ? operation.getCircuitBreakerName().value()
                                : UUID.randomUUID().toString();

                        circuitBreakers.add(cbName);

                        return new NotifyingCircuitBreaker(cbName, t, event -> events.fire(event));
                    } else if (operation.hasTimeout()) {
                        return new WrappedTimout(t);
                    } else {
                        return t;
                    }
                });

    }

    public Set circuitBreakerNames() {
        return circuitBreakers;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy