package com.nurkiewicz.asyncretry.backoff; import java.util.Random; /** * @author Tomasz Nurkiewicz * @since 7/16/13, 7:49 PM */ public class ProportionalRandomBackoff extends RandomBackoff { /** * Randomly up to +/- 10% */ public static final double DEFAULT_MULTIPLIER = 0.1; private final double multiplier; public ProportionalRandomBackoff(Backoff target) { this(target, DEFAULT_MULTIPLIER); } public ProportionalRandomBackoff(Backoff target, Random random) { this(target, DEFAULT_MULTIPLIER, random); } public ProportionalRandomBackoff(Backoff target, double multiplier) { super(target); this.multiplier = multiplier; } public ProportionalRandomBackoff(Backoff target, double multiplier, Random random) { super(target, random); this.multiplier = multiplier; } @Override long addRandomJitter(long initialDelay) { final double randomMultiplier = (1 - 2 * random().nextDouble()) * multiplier; return (long) (initialDelay * (1 + randomMultiplier)); } }