package com.nurkiewicz.asyncretry.backoff;
import com.nurkiewicz.asyncretry.RetryContext;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Supplier;
/**
* @author Tomasz Nurkiewicz
* @since 7/16/13, 7:30 PM
*/
abstract public class RandomBackoff extends BackoffWrapper {
private final Supplier<Random> randomSource;
protected RandomBackoff(Backoff target) {
this(target, ThreadLocalRandom::current);
}
protected RandomBackoff(Backoff target, Random randomSource) {
this(target, () -> randomSource);
}
private RandomBackoff(Backoff target, Supplier<Random> randomSource) {
super(target);
this.randomSource = randomSource;
}
@Override
public long delayMillis(RetryContext context) {
final long initialDelay = target.delayMillis(context);
final long randomDelay = addRandomJitter(initialDelay);
return Math.max(randomDelay, 0);
}
abstract long addRandomJitter(long initialDelay);
protected Random random() {
return randomSource.get();
}
}