1
1
/*
2
- * Copyright 2006-2023 the original author or authors.
2
+ * Copyright 2006-2024 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
22
22
import java .util .Arrays ;
23
23
import java .util .Collections ;
24
24
import java .util .List ;
25
+ import java .util .function .Predicate ;
25
26
26
27
import org .junit .jupiter .api .Test ;
27
-
28
28
import org .springframework .classify .BinaryExceptionClassifier ;
29
29
import org .springframework .retry .RetryListener ;
30
30
import org .springframework .retry .RetryPolicy ;
38
38
import org .springframework .retry .policy .CompositeRetryPolicy ;
39
39
import org .springframework .retry .policy .MapRetryContextCache ;
40
40
import org .springframework .retry .policy .MaxAttemptsRetryPolicy ;
41
+ import org .springframework .retry .policy .PredicateRetryPolicy ;
41
42
import org .springframework .retry .policy .TimeoutRetryPolicy ;
42
43
import org .springframework .retry .util .test .TestUtils ;
43
44
56
57
* @author Kim In Hoi
57
58
* @author Gary Russell
58
59
* @author Andreas Ahlenstorf
60
+ * @author Morulai Planinski
59
61
*/
60
62
public class RetryTemplateBuilderTests {
61
63
@@ -93,8 +95,9 @@ public void testBasicCustomization() {
93
95
.build ();
94
96
95
97
PolicyTuple policyTuple = PolicyTuple .extractWithAsserts (template );
96
-
97
- BinaryExceptionClassifier classifier = policyTuple .exceptionClassifierRetryPolicy .getExceptionClassifier ();
98
+ assertThat (policyTuple .exceptionClassifierRetryPolicy ).isInstanceOf (BinaryExceptionClassifierRetryPolicy .class );
99
+ BinaryExceptionClassifierRetryPolicy retryPolicy = (BinaryExceptionClassifierRetryPolicy ) policyTuple .exceptionClassifierRetryPolicy ;
100
+ BinaryExceptionClassifier classifier = retryPolicy .getExceptionClassifier ();
98
101
assertThat (classifier .classify (new FileNotFoundException ())).isTrue ();
99
102
assertThat (classifier .classify (new IllegalArgumentException ())).isTrue ();
100
103
assertThat (classifier .classify (new RuntimeException ())).isFalse ();
@@ -176,7 +179,9 @@ public void testCustomPolicy() {
176
179
}
177
180
178
181
private void assertDefaultClassifier (PolicyTuple policyTuple ) {
179
- BinaryExceptionClassifier classifier = policyTuple .exceptionClassifierRetryPolicy .getExceptionClassifier ();
182
+ assertThat (policyTuple .exceptionClassifierRetryPolicy ).isInstanceOf (BinaryExceptionClassifierRetryPolicy .class );
183
+ BinaryExceptionClassifierRetryPolicy retryPolicy = (BinaryExceptionClassifierRetryPolicy ) policyTuple .exceptionClassifierRetryPolicy ;
184
+ BinaryExceptionClassifier classifier = retryPolicy .getExceptionClassifier ();
180
185
assertThat (classifier .classify (new Exception ())).isTrue ();
181
186
assertThat (classifier .classify (new Exception (new Error ()))).isTrue ();
182
187
assertThat (classifier .classify (new Error ())).isFalse ();
@@ -203,6 +208,28 @@ public void testFailOnNotationsMix() {
203
208
.notRetryOn (Collections .<Class <? extends Throwable >>singletonList (OutOfMemoryError .class )));
204
209
}
205
210
211
+ @ Test
212
+ public void testFailOnPredicateWithOtherMix () {
213
+ assertThatIllegalArgumentException ().isThrownBy (() -> RetryTemplate .builder ()
214
+ .retryOn (Collections .<Class <? extends Throwable >>singletonList (IOException .class ))
215
+ .retryOn (classifiable -> true ));
216
+ }
217
+
218
+ @ Test
219
+ public void testRetryOnPredicate () {
220
+ Predicate <Throwable > predicate = classifiable -> classifiable instanceof IllegalAccessError ;
221
+ RetryTemplate template = RetryTemplate .builder ().maxAttempts (10 ).retryOn (predicate ).build ();
222
+
223
+ PolicyTuple policyTuple = PolicyTuple .extractWithAsserts (template );
224
+ assertThat (policyTuple .exceptionClassifierRetryPolicy ).isInstanceOf (PredicateRetryPolicy .class );
225
+ RetryPolicy retryPolicy = policyTuple .exceptionClassifierRetryPolicy ;
226
+ assertThat (retryPolicy ).isInstanceOf (PredicateRetryPolicy .class );
227
+ assertThat (policyTuple .baseRetryPolicy ).isInstanceOf (MaxAttemptsRetryPolicy .class );
228
+ assertThat (policyTuple .baseRetryPolicy .getMaxAttempts ()).isEqualTo (10 );
229
+ assertThat (getPropertyValue (template , "listeners" , RetryListener [].class )).isEmpty ();
230
+ assertThat (getPropertyValue (template , "backOffPolicy" )).isInstanceOf (NoBackOffPolicy .class );
231
+ }
232
+
206
233
/* ---------------- BackOff -------------- */
207
234
208
235
@ Test
@@ -325,7 +352,7 @@ private static class PolicyTuple {
325
352
326
353
RetryPolicy baseRetryPolicy ;
327
354
328
- BinaryExceptionClassifierRetryPolicy exceptionClassifierRetryPolicy ;
355
+ RetryPolicy exceptionClassifierRetryPolicy ;
329
356
330
357
static PolicyTuple extractWithAsserts (RetryTemplate template ) {
331
358
CompositeRetryPolicy compositeRetryPolicy = getPropertyValue (template , "retryPolicy" ,
@@ -335,8 +362,8 @@ static PolicyTuple extractWithAsserts(RetryTemplate template) {
335
362
assertThat (getPropertyValue (compositeRetryPolicy , "optimistic" , Boolean .class )).isFalse ();
336
363
337
364
for (final RetryPolicy policy : getPropertyValue (compositeRetryPolicy , "policies" , RetryPolicy [].class )) {
338
- if (policy instanceof BinaryExceptionClassifierRetryPolicy ) {
339
- res .exceptionClassifierRetryPolicy = ( BinaryExceptionClassifierRetryPolicy ) policy ;
365
+ if (policy instanceof BinaryExceptionClassifierRetryPolicy || policy instanceof PredicateRetryPolicy ) {
366
+ res .exceptionClassifierRetryPolicy = policy ;
340
367
}
341
368
else {
342
369
res .baseRetryPolicy = policy ;
0 commit comments