io.automatiko.addons.fault.tolerance.internal.AutomatikoStrategyCache Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of automatiko-fault-tolerance-addon Show documentation
Show all versions of automatiko-fault-tolerance-addon Show documentation
Fault Tolerance AddOn for Automatiko Engine
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;
}
}