Skip to content

Commit b7dd7d1

Browse files
committed
Fix RetryAdviceParser for the latest spring-retry
The `FixedBackOffPolicy` and `ExponentialBackOffPolicy` have now overloaded setters for `Supplier` of value. The XML parser relies on the Java Bean specification and cannot determine the proper setter by type. Looks like it is just resolved by name and there is no guarantee which one will win * Add inner `FixedBackOffPolicy` and `ExponentialBackOffPolicy` adapters to expose `*Simple` setters for the values we get from the XML configuration
1 parent e1d62b5 commit b7dd7d1

File tree

1 file changed

+47
-10
lines changed

1 file changed

+47
-10
lines changed

spring-integration-core/src/main/java/org/springframework/integration/config/xml/RetryAdviceParser.java

+47-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2019 the original author or authors.
2+
* Copyright 2014-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -33,6 +33,8 @@
3333

3434
/**
3535
* @author Gary Russell
36+
* @author Artem Bilan
37+
*
3638
* @since 4.0
3739
*
3840
*/
@@ -46,16 +48,20 @@ protected AbstractBeanDefinition parseInternal(Element element, ParserContext pa
4648
Element backOffPolicyEle = DomUtils.getChildElementByTagName(element, "fixed-back-off");
4749
BeanDefinitionBuilder backOffBuilder = null;
4850
if (backOffPolicyEle != null) {
49-
backOffBuilder = BeanDefinitionBuilder.genericBeanDefinition(FixedBackOffPolicy.class);
50-
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "interval", "backOffPeriod");
51+
backOffBuilder = BeanDefinitionBuilder.genericBeanDefinition(ParsedFixedBackOffPolicy.class);
52+
IntegrationNamespaceUtils.setValueIfAttributeDefined(
53+
backOffBuilder, backOffPolicyEle, "interval", "backOffPeriodSimple");
5154
}
5255
else {
5356
backOffPolicyEle = DomUtils.getChildElementByTagName(element, "exponential-back-off");
5457
if (backOffPolicyEle != null) {
55-
backOffBuilder = BeanDefinitionBuilder.genericBeanDefinition(ExponentialBackOffPolicy.class);
56-
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "initial", "initialInterval");
57-
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "multiplier");
58-
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "maximum", "maxInterval");
58+
backOffBuilder = BeanDefinitionBuilder.genericBeanDefinition(ParsedExponentialBackOffPolicy.class);
59+
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "initial",
60+
"initialIntervalSimple");
61+
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle,
62+
"multiplier", "multiplierSimple");
63+
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "maximum",
64+
"maxIntervalSimple");
5965
}
6066
}
6167
if (backOffBuilder != null) {
@@ -64,8 +70,9 @@ protected AbstractBeanDefinition parseInternal(Element element, ParserContext pa
6470
}
6571
String maxAttemptsAttr = element.getAttribute("max-attempts");
6672
if (StringUtils.hasText(maxAttemptsAttr)) {
67-
BeanDefinitionBuilder retryPolicyBuilder = BeanDefinitionBuilder.genericBeanDefinition(SimpleRetryPolicy.class);
68-
IntegrationNamespaceUtils.setValueIfAttributeDefined(retryPolicyBuilder, element, "max-attempts");
73+
BeanDefinitionBuilder retryPolicyBuilder =
74+
BeanDefinitionBuilder.genericBeanDefinition(SimpleRetryPolicy.class)
75+
.addConstructorArgValue(element.getAttribute("max-attempts"));
6976
retryTemplateBuilder.addPropertyValue("retryPolicy", retryPolicyBuilder.getBeanDefinition());
7077
customTemplate = true;
7178
}
@@ -74,12 +81,42 @@ protected AbstractBeanDefinition parseInternal(Element element, ParserContext pa
7481
}
7582
String recoveryChannelAttr = element.getAttribute("recovery-channel");
7683
if (StringUtils.hasText(recoveryChannelAttr)) {
77-
BeanDefinitionBuilder emsrBuilder = BeanDefinitionBuilder.genericBeanDefinition(ErrorMessageSendingRecoverer.class);
84+
BeanDefinitionBuilder emsrBuilder =
85+
BeanDefinitionBuilder.genericBeanDefinition(ErrorMessageSendingRecoverer.class);
7886
emsrBuilder.addConstructorArgReference(recoveryChannelAttr);
7987
IntegrationNamespaceUtils.setValueIfAttributeDefined(emsrBuilder, element, "send-timeout");
8088
builder.addPropertyValue("recoveryCallback", emsrBuilder.getBeanDefinition());
8189
}
8290
return builder.getBeanDefinition();
8391
}
8492

93+
private static final class ParsedFixedBackOffPolicy extends FixedBackOffPolicy {
94+
95+
ParsedFixedBackOffPolicy() {
96+
}
97+
98+
public void setBackOffPeriodSimple(long backOffPeriod) {
99+
setBackOffPeriod(backOffPeriod);
100+
}
101+
102+
}
103+
private static final class ParsedExponentialBackOffPolicy extends ExponentialBackOffPolicy {
104+
105+
ParsedExponentialBackOffPolicy() {
106+
}
107+
108+
public void setInitialIntervalSimple(long initialInterval) {
109+
setInitialInterval(initialInterval);
110+
}
111+
112+
public void setMultiplierSimple(double multiplier) {
113+
setMultiplier(multiplier);
114+
}
115+
116+
public void setMaxIntervalSimple(long maxInterval) {
117+
setMaxInterval(maxInterval);
118+
}
119+
120+
}
121+
85122
}

0 commit comments

Comments
 (0)