
net.yudichev.jiotty.common.async.backoff.BackOffProvider Maven / Gradle / Ivy
package net.yudichev.jiotty.common.async.backoff;
import com.google.inject.BindingAnnotation;
import net.yudichev.jiotty.common.lang.PublicImmutablesStyle;
import net.yudichev.jiotty.common.lang.backoff.BackOff;
import net.yudichev.jiotty.common.lang.backoff.ExponentialBackOff;
import net.yudichev.jiotty.common.lang.backoff.SynchronizedBackOff;
import org.immutables.value.Value;
import javax.inject.Inject;
import javax.inject.Provider;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.time.Duration;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.lang.Math.toIntExact;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
final class BackOffProvider implements Provider {
private final BackOffConfig config;
@Inject
BackOffProvider(@Dependency BackOffConfig config) {
this.config = checkNotNull(config);
}
@Override
public BackOff get() {
return new SynchronizedBackOff(new ExponentialBackOff.Builder()
.setInitialIntervalMillis(toIntExact(config.initialInterval().toMillis()))
.setMaxIntervalMillis(toIntExact(config.maxInterval().toMillis()))
.setMultiplier(config.multiplier())
.setRandomizationFactor(config.randomizationFactor())
.setMaxElapsedTimeMillis(toIntExact(config.maxElapsedTime().toMillis()))
.build());
}
@BindingAnnotation
@Target({FIELD, PARAMETER, METHOD})
@Retention(RUNTIME)
@interface Dependency {
}
@Value.Immutable
@PublicImmutablesStyle
interface BaseBackOffConfig {
@Value.Default
default Duration maxInterval() {
return Duration.ofMillis(ExponentialBackOff.DEFAULT_MAX_INTERVAL_MILLIS);
}
@Value.Default
default Duration initialInterval() {
return Duration.ofMillis(ExponentialBackOff.DEFAULT_INITIAL_INTERVAL_MILLIS);
}
@Value.Default
default Duration maxElapsedTime() {
return Duration.ofMillis(ExponentialBackOff.DEFAULT_MAX_ELAPSED_TIME_MILLIS);
}
@Value.Default
default double multiplier() {
return ExponentialBackOff.DEFAULT_MULTIPLIER;
}
@Value.Default
default double randomizationFactor() {
return ExponentialBackOff.DEFAULT_RANDOMIZATION_FACTOR;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy