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
This commit is contained in:
Artem Bilan
2022-10-13 15:17:56 -04:00
parent e1d62b5478
commit b7dd7d1379

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2019 the original author or authors.
* Copyright 2014-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,6 +33,8 @@ import org.springframework.util.xml.DomUtils;
/**
* @author Gary Russell
* @author Artem Bilan
*
* @since 4.0
*
*/
@@ -46,16 +48,20 @@ public class RetryAdviceParser extends AbstractBeanDefinitionParser {
Element backOffPolicyEle = DomUtils.getChildElementByTagName(element, "fixed-back-off");
BeanDefinitionBuilder backOffBuilder = null;
if (backOffPolicyEle != null) {
backOffBuilder = BeanDefinitionBuilder.genericBeanDefinition(FixedBackOffPolicy.class);
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "interval", "backOffPeriod");
backOffBuilder = BeanDefinitionBuilder.genericBeanDefinition(ParsedFixedBackOffPolicy.class);
IntegrationNamespaceUtils.setValueIfAttributeDefined(
backOffBuilder, backOffPolicyEle, "interval", "backOffPeriodSimple");
}
else {
backOffPolicyEle = DomUtils.getChildElementByTagName(element, "exponential-back-off");
if (backOffPolicyEle != null) {
backOffBuilder = BeanDefinitionBuilder.genericBeanDefinition(ExponentialBackOffPolicy.class);
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "initial", "initialInterval");
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "multiplier");
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "maximum", "maxInterval");
backOffBuilder = BeanDefinitionBuilder.genericBeanDefinition(ParsedExponentialBackOffPolicy.class);
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "initial",
"initialIntervalSimple");
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle,
"multiplier", "multiplierSimple");
IntegrationNamespaceUtils.setValueIfAttributeDefined(backOffBuilder, backOffPolicyEle, "maximum",
"maxIntervalSimple");
}
}
if (backOffBuilder != null) {
@@ -64,8 +70,9 @@ public class RetryAdviceParser extends AbstractBeanDefinitionParser {
}
String maxAttemptsAttr = element.getAttribute("max-attempts");
if (StringUtils.hasText(maxAttemptsAttr)) {
BeanDefinitionBuilder retryPolicyBuilder = BeanDefinitionBuilder.genericBeanDefinition(SimpleRetryPolicy.class);
IntegrationNamespaceUtils.setValueIfAttributeDefined(retryPolicyBuilder, element, "max-attempts");
BeanDefinitionBuilder retryPolicyBuilder =
BeanDefinitionBuilder.genericBeanDefinition(SimpleRetryPolicy.class)
.addConstructorArgValue(element.getAttribute("max-attempts"));
retryTemplateBuilder.addPropertyValue("retryPolicy", retryPolicyBuilder.getBeanDefinition());
customTemplate = true;
}
@@ -74,7 +81,8 @@ public class RetryAdviceParser extends AbstractBeanDefinitionParser {
}
String recoveryChannelAttr = element.getAttribute("recovery-channel");
if (StringUtils.hasText(recoveryChannelAttr)) {
BeanDefinitionBuilder emsrBuilder = BeanDefinitionBuilder.genericBeanDefinition(ErrorMessageSendingRecoverer.class);
BeanDefinitionBuilder emsrBuilder =
BeanDefinitionBuilder.genericBeanDefinition(ErrorMessageSendingRecoverer.class);
emsrBuilder.addConstructorArgReference(recoveryChannelAttr);
IntegrationNamespaceUtils.setValueIfAttributeDefined(emsrBuilder, element, "send-timeout");
builder.addPropertyValue("recoveryCallback", emsrBuilder.getBeanDefinition());
@@ -82,4 +90,33 @@ public class RetryAdviceParser extends AbstractBeanDefinitionParser {
return builder.getBeanDefinition();
}
private static final class ParsedFixedBackOffPolicy extends FixedBackOffPolicy {
ParsedFixedBackOffPolicy() {
}
public void setBackOffPeriodSimple(long backOffPeriod) {
setBackOffPeriod(backOffPeriod);
}
}
private static final class ParsedExponentialBackOffPolicy extends ExponentialBackOffPolicy {
ParsedExponentialBackOffPolicy() {
}
public void setInitialIntervalSimple(long initialInterval) {
setInitialInterval(initialInterval);
}
public void setMultiplierSimple(double multiplier) {
setMultiplier(multiplier);
}
public void setMaxIntervalSimple(long maxInterval) {
setMaxInterval(maxInterval);
}
}
}