@@ -25,21 +25,85 @@ public interface BackOffDelayPolicy {
25
25
26
26
Duration delay (int recoveryAttempt );
27
27
28
+ static BackOffDelayPolicy fixedWithInitialDelay (Duration initialDelay , Duration delay ) {
29
+ return new FixedWithInitialDelayBackOffPolicy (initialDelay , delay );
30
+ }
31
+
32
+ static BackOffDelayPolicy fixedWithInitialDelay (
33
+ Duration initialDelay , Duration delay , Duration timeout ) {
34
+ return new FixedWithInitialDelayAndTimeoutBackOffPolicy (initialDelay , delay , timeout );
35
+ }
36
+
28
37
static BackOffDelayPolicy fixed (Duration delay ) {
29
- return new FixedBackOffDelayPolicy ( delay );
38
+ return new FixedWithInitialDelayBackOffPolicy ( delay , delay );
30
39
}
31
40
32
- class FixedBackOffDelayPolicy implements BackOffDelayPolicy {
41
+ final class FixedWithInitialDelayBackOffPolicy implements BackOffDelayPolicy {
33
42
43
+ private final Duration initialDelay ;
34
44
private final Duration delay ;
35
45
36
- private FixedBackOffDelayPolicy (Duration delay ) {
46
+ private FixedWithInitialDelayBackOffPolicy (Duration initialDelay , Duration delay ) {
47
+ this .initialDelay = initialDelay ;
37
48
this .delay = delay ;
38
49
}
39
50
40
51
@ Override
41
52
public Duration delay (int recoveryAttempt ) {
42
- return this .delay ;
53
+ return recoveryAttempt == 0 ? initialDelay : delay ;
54
+ }
55
+
56
+ @ Override
57
+ public String toString () {
58
+ return "FixedWithInitialDelayBackOffPolicy{"
59
+ + "initialDelay="
60
+ + initialDelay
61
+ + ", delay="
62
+ + delay
63
+ + '}' ;
64
+ }
65
+ }
66
+
67
+ final class FixedWithInitialDelayAndTimeoutBackOffPolicy implements BackOffDelayPolicy {
68
+
69
+ private final int attemptLimitBeforeTimeout ;
70
+ private final BackOffDelayPolicy delegate ;
71
+
72
+ private FixedWithInitialDelayAndTimeoutBackOffPolicy (
73
+ Duration initialDelay , Duration delay , Duration timeout ) {
74
+ this (fixedWithInitialDelay (initialDelay , delay ), timeout );
75
+ }
76
+
77
+ private FixedWithInitialDelayAndTimeoutBackOffPolicy (
78
+ BackOffDelayPolicy policy , Duration timeout ) {
79
+ if (timeout .toMillis () < policy .delay (0 ).toMillis ()) {
80
+ throw new IllegalArgumentException ("Timeout must be longer than initial delay" );
81
+ }
82
+ this .delegate = policy ;
83
+ // best effort, assume FixedWithInitialDelay-ish policy
84
+ Duration initialDelay = policy .delay (0 );
85
+ Duration delay = policy .delay (1 );
86
+ long timeoutWithInitialDelay = timeout .toMillis () - initialDelay .toMillis ();
87
+ this .attemptLimitBeforeTimeout = (int ) (timeoutWithInitialDelay / delay .toMillis ()) + 1 ;
88
+ }
89
+
90
+ @ Override
91
+ public Duration delay (int recoveryAttempt ) {
92
+ if (recoveryAttempt >= attemptLimitBeforeTimeout ) {
93
+ return TIMEOUT ;
94
+ } else {
95
+ return delegate .delay (recoveryAttempt );
96
+ }
97
+ }
98
+
99
+ @ Override
100
+ public String toString () {
101
+ return "FixedWithInitialDelayAndTimeoutBackOffPolicy{"
102
+ + "attemptLimitBeforeTimeout="
103
+ + attemptLimitBeforeTimeout
104
+ + ", delegate="
105
+ + delegate
106
+ + '}' ;
43
107
}
44
108
}
45
109
}
0 commit comments