<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:integration="http://www.springframework.org/schema/integration"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

	<integration:annotation-config />

	<integration:channel id="requests" />
	<integration:channel id="replies" />

	<!--
		TODO: the initial delay is a hack - it usually prevents the poller
		from picking up data in the list before it is cleared, but one day
		100ms will not be enough... (see INT-536)
	-->
	<bean id="delayedTrigger" class="org.springframework.scheduling.support.PeriodicTrigger">
		<constructor-arg value="10"/>
		<property name="initialDelay" value="100"/>
	</bean>

	<integration:inbound-channel-adapter
		ref="testCase" method="input" channel="requests">
		<integration:poller max-messages-per-poll="1" trigger="delayedTrigger">
			<integration:advice-chain>
				<ref bean="txAdvice" />
				<ref bean="repeatAdvice" />
			</integration:advice-chain>
		</integration:poller>
	</integration:inbound-channel-adapter>
	<integration:outbound-channel-adapter
		ref="testCase" method="output" channel="replies" />

	<bean id="testCase"
		class="org.springframework.batch.integration.retry.RetryRepeatTransactionalPollingIntegrationTests" />

	<bean id="transactionManager"
		class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

	<tx:advice id="txAdvice">
		<tx:attributes>
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

	<bean id="repeatAdvice"
		class="org.springframework.batch.repeat.interceptor.RepeatOperationsInterceptor">
		<property name="repeatOperations">
			<bean class="org.springframework.batch.repeat.support.RepeatTemplate">
				<property name="completionPolicy">
					<bean
						class="org.springframework.batch.repeat.policy.SimpleCompletionPolicy">
						<property name="chunkSize" value="2" />
					</bean>
				</property>
			</bean>
		</property>
	</bean>

	<bean id="service"
		class="org.springframework.batch.integration.retry.SimpleService" />

	<bean id="recoverer"
		class="org.springframework.batch.integration.retry.SimpleRecoverer" />

	<bean id="retryAdvice"
		class="org.springframework.retry.interceptor.StatefulRetryOperationsInterceptor">
		<property name="retryOperations">
			<bean class="org.springframework.retry.support.RetryTemplate">
				<property name="retryPolicy">
					<bean class="org.springframework.retry.policy.SimpleRetryPolicy">
						<property name="maxAttempts" value="2" />
					</bean>
				</property>
			</bean>
		</property>
		<property name="recoverer" ref="recoverer" />
	</bean>

	<aop:config proxy-target-class="true">
		<aop:advisor advice-ref="retryAdvice"
			pointcut="execution(* org.springframework.batch.integration.retry.Service+.process(..))" />
	</aop:config>

</beans>