Я унаследовал проект Spring Integration, который включает Spring Retry. Я не уверен, что он когда-либо тестировался, и для него нет отдельных тестов. Итак, я пытаюсь применить простой сценарий.
Насмехаясь над методом RestTemplate exchange
, я хотел бы иметь возможность проверить логику повтора. Я могу получить исключение, которое я хочу вызвать, но это происходит только один раз - повторных попыток не происходит.
XML для рекомендации по повторной попытке находится здесь (retry-advice-context.xml):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="retryAdvice" class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice" >
<property name="retryTemplate">
<bean class="org.springframework.retry.support.RetryTemplate">
<property name="backOffPolicy">
<bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
<property name="initialInterval" value="${retry.initialInterval}"/>
<property name="maxInterval" value="${retry.maxInterval}"/>
<property name="multiplier" value="${retry.multiplier}"/>
</bean>
</property>
<property name="retryPolicy">
<bean class="com.reachlocal.mediapublishing.shim.integration.retry.CustomRetryPolicy">
<constructor-arg name="maxAttempts" value="${retry.maxAttempts}" />
<constructor-arg name="retryableExceptions" ref="retryableExceptions" />
</bean>
</property>
</bean>
</property>
<property name="recoveryCallback">
<bean class="org.springframework.integration.handler.advice.ErrorMessageSendingRecoverer">
<constructor-arg ref="errorChannel" />
</bean>
</property>
</bean>
<util:map id="retryableExceptions" map-class="java.util.HashMap" >
<entry key="java.net.SocketException" value="true" />
<entry key="com.examplel.ConnectionException" value="true" />
<entry key="com.example.CustomException" value="true" />
</util:map>
</beans>
Вот фрагмент файла обработки SI:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd">
<import resource="retry-advice-context.xml"/>
<int:channel id="channel1">
</int:channel>
<int:header-value-router id="commandTypeRouter" input-channel="commandChannel" <---DEFINED IN MASTER FILE
header-name="commandType" resolution-required="true">
<int:mapping value="COMMAND_1" channel="channel1"/>
</int:header-value-router>
<int:chain id="command1Chain" input-channel="channel1" output-channel="commandProcessed">
<int:header-enricher>
<int:error-channel ref="errorChannel" />
</int:header-enricher>
<int:service-activator ref="eventDataWriter" method = "addEventStart"/>
<int:service-activator ref="accountProcessor" method="processAccount">
<int:request-handler-advice-chain><ref bean="retryAdvice" /></int:request-handler-advice-chain>
</int:service-activator>
</int:chain>
</beans>
Таким образом, bean-компонент повтора, retryAdvice
, является частью различных цепочек. Цепочки - это намного больше, поэтому я хочу иметь возможность проверять логику повтора только на уровне сервиса. В коде нет аннотаций Retry (не знаю, нужны ли они).
Пара вопросов:
- Могу ли я протестировать функцию повтора на уровне сервиса или мне нужно выполнить всю цепочку?
- Что-то отсутствует (аннотации, другой XML), что требуется для механизма повтора?
Кстати, это использует SI 4.1.3.
Спасибо.
ОБНОВЛЕНИЕ 1:
Удалось запустить проект Гэри в моей среде. После этого я добавил retry-advice-context.xml
файл в основной SI xml. Я изменил карту, чтобы на ней было только RuntimeException
. Операторы журнала показали ExponentialBackoffPolicy
операторов. Я также получал RetryTemplate
отчеты журнала отладки.
Получив немного больше понимания, я перевел то, что там было, на настоящий код, с которым я работаю, и добился большего успеха. Я получаю сообщение журнала о том, что произошло мое исключение и что будет повторяться до 3 раз.
К сожалению, я получаю следующее:
17:29:26.154 DEBUG [task-scheduler-2][org.springframework.retry.support.RetryTemplate] Checking for rethrow: count=1
17:29:26.155 DEBUG [task-scheduler-2][org.springframework.retry.support.RetryTemplate] Retry failed last attempt: count=1
Таким образом, он изначально знает, что он должен повторить попытку до 3 раз. Но затем он сообщает, что сделал последнюю попытку после 1 попытки.
В рабочем коде Гэри операторы отладки будут отображать Retry: count=2
и т. Д. Для следующей попытки.
В тестовом коде Spock есть выражение sleep
в то время, когда должны выполняться повторные попытки. Я и увеличил, и сократил время без каких-либо изменений.
Собираюсь продолжить отладку с помощью кода повтора, чтобы понять, почему он останавливается при 1-й попытке.