From 6e36093b2e7b00964e48670130708382d330a751 Mon Sep 17 00:00:00 2001 From: dsyer Date: Mon, 25 Aug 2008 14:06:57 +0000 Subject: [PATCH] OPEN - issue BATCH-777: Parametrise RetryCallback and related interfaces RetryCallback and RecoveryCallback done --- .../item/SimpleRetryExceptionHandler.java | 2 +- .../step/item/SkipLimitStepFactoryBean.java | 4 +- ...sageListenerContainerIntegrationTests.java | 8 ++-- .../batch/jms/ExternalRetryInBatchTests.java | 16 +++---- .../batch/retry/jms/ExternalRetryTests.java | 24 +++++----- .../batch/retry/jms/SynchronousTests.java | 36 +++++++-------- .../batch/item/ItemRecoverer.java | 7 +-- .../batch/item/jms/JmsItemReader.java | 4 +- .../batch/retry/RecoveryCallback.java | 4 +- .../batch/retry/RetryCallback.java | 7 +-- .../batch/retry/RetryListener.java | 6 +-- .../batch/retry/RetryOperations.java | 8 ++-- .../RetryOperationsInterceptor.java | 2 +- .../StatefulRetryOperationsInterceptor.java | 22 ++++----- .../retry/listener/RetryListenerSupport.java | 6 +-- .../batch/retry/support/RetryTemplate.java | 18 ++++---- .../batch/item/ItemRecoveryHandlerTests.java | 4 +- .../retry/StubItemKeyGeneratorRecoverer.java | 46 ------------------- ...atefulRetryOperationsInterceptorTests.java | 12 ++--- .../retry/listener/RetryListenerTests.java | 36 +++++++-------- .../FatalExceptionRetryPolicyTests.java | 14 +++--- .../policy/StatefulRetryIntegrationTests.java | 4 +- .../RetrySynchronizationManagerTests.java | 4 +- .../retry/support/RetryTemplateTests.java | 12 ++--- .../support/StatefulRecoveryRetryTests.java | 40 +++++----------- .../retry/PollableSourceRetryTests.java | 9 ++-- 26 files changed, 144 insertions(+), 211 deletions(-) delete mode 100644 spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/StubItemKeyGeneratorRecoverer.java diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleRetryExceptionHandler.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleRetryExceptionHandler.java index 55dbb84cc..465047680 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleRetryExceptionHandler.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleRetryExceptionHandler.java @@ -86,7 +86,7 @@ public class SimpleRetryExceptionHandler extends RetryListenerSupport implements * @see org.springframework.batch.retry.RetryListener#close(org.springframework.batch.retry.RetryContext, * org.springframework.batch.retry.RetryCallback, java.lang.Throwable) */ - public void close(RetryContext context, RetryCallback callback, Throwable throwable) { + public void close(RetryContext context, RetryCallback callback, Throwable throwable) { if (!retryPolicy.canRetry(context)) { getRepeatContext().setAttribute(EXHAUSTED, "true"); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBean.java index 181d81493..8a470600c 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBean.java @@ -432,7 +432,7 @@ public class SkipLimitStepFactoryBean extends SimpleStepFactoryBean */ private void retryChunk(final Chunk chunk, final StepContribution contribution) throws Exception { - RetryCallback retryCallback = new RetryCallback() { + RetryCallback retryCallback = new RetryCallback() { public Object doWithRetry(RetryContext context) throws Exception { doWrite(chunk.getItems()); // TODO: if there is an exception marked as no rollback it @@ -441,7 +441,7 @@ public class SkipLimitStepFactoryBean extends SimpleStepFactoryBean } }; - RecoveryCallback recoveryCallback = new RecoveryCallback() { + RecoveryCallback recoveryCallback = new RecoveryCallback() { public Object recover(RetryContext context) throws Exception { diff --git a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/container/jms/BatchMessageListenerContainerIntegrationTests.java b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/container/jms/BatchMessageListenerContainerIntegrationTests.java index bc94a7585..46d6403ae 100644 --- a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/container/jms/BatchMessageListenerContainerIntegrationTests.java +++ b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/container/jms/BatchMessageListenerContainerIntegrationTests.java @@ -122,14 +122,14 @@ public class BatchMessageListenerContainerIntegrationTests { container.setMessageListener(new MessageListener() { public void onMessage(final Message msg) { try { - RetryCallback callback = new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + RetryCallback callback = new RetryCallback() { + public Message doWithRetry(RetryContext context) throws Exception { count++; throw new RuntimeException("planned failure: " + msg); } }; - RecoveryCallback recoveryCallback = new RecoveryCallback() { - public Object recover(RetryContext context) { + RecoveryCallback recoveryCallback = new RecoveryCallback() { + public Message recover(RetryContext context) { recovered++; return msg; } diff --git a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/jms/ExternalRetryInBatchTests.java b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/jms/ExternalRetryInBatchTests.java index a895ae556..8ad275e53 100644 --- a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/jms/ExternalRetryInBatchTests.java +++ b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/jms/ExternalRetryInBatchTests.java @@ -82,13 +82,13 @@ public class ExternalRetryInBatchTests { jmsTemplate.convertAndSend("queue", "foo"); jmsTemplate.convertAndSend("queue", "bar"); provider = new ItemReaderRecoverer() { - public Object read() { + public String read() { String text = (String) jmsTemplate.receiveAndConvert("queue"); list.add(text); return text; } - public Object recover(Object data, Throwable cause) { + public String recover(String data, Throwable cause) { recovered.add(data); return data; } @@ -131,14 +131,14 @@ public class ExternalRetryInBatchTests { public ExitStatus doInIteration(RepeatContext context) throws Exception { - final Object item = provider.read(); + final String item = provider.read(); if (item==null) { return ExitStatus.FINISHED; } - RetryCallback callback = new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + RetryCallback callback = new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { // No need for transaction here: the whole batch will roll // back. When it comes back for recovery this code is not // executed... @@ -149,8 +149,8 @@ public class ExternalRetryInBatchTests { } }; - RecoveryCallback recoveryCallback = new RecoveryCallback() { - public Object recover(RetryContext context) { + RecoveryCallback recoveryCallback = new RecoveryCallback() { + public String recover(RetryContext context) { // aggressive commit on a recovery RepeatSynchronizationManager.setCompleteOnly(); return provider.recover(item, context.getLastThrowable()); @@ -212,7 +212,7 @@ public class ExternalRetryInBatchTests { return msgs; } - private interface ItemReaderRecoverer extends ItemReader, ItemRecoverer { + private interface ItemReaderRecoverer extends ItemReader, ItemRecoverer { } } diff --git a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/retry/jms/ExternalRetryTests.java b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/retry/jms/ExternalRetryTests.java index 78c900cb2..197a335dd 100644 --- a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/retry/jms/ExternalRetryTests.java +++ b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/retry/jms/ExternalRetryTests.java @@ -79,7 +79,7 @@ public class ExternalRetryTests { return text; } - public Object recover(Object data, Throwable cause) { + public String recover(String data, Throwable cause) { recovered.add(data); return data; } @@ -126,7 +126,7 @@ public class ExternalRetryTests { public Object doInTransaction(TransactionStatus status) { try { final Object item = provider.read(); - RetryCallback callback = new RetryCallback() { + RetryCallback callback = new RetryCallback() { public Object doWithRetry(RetryContext context) throws Exception { writer.write(Collections.singletonList(item)); return null; @@ -153,8 +153,8 @@ public class ExternalRetryTests { new TransactionTemplate(transactionManager).execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { try { - final Object item = provider.read(); - RetryCallback callback = new RetryCallback() { + final String item = provider.read(); + RetryCallback callback = new RetryCallback() { public Object doWithRetry(RetryContext context) throws Exception { writer.write(Collections.singletonList(item)); return null; @@ -186,25 +186,25 @@ public class ExternalRetryTests { assertInitialState(); - final Object item = provider.read(); - final RetryCallback callback = new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + final String item = provider.read(); + final RetryCallback callback = new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { simpleJdbcTemplate.update("INSERT into T_FOOS (id,name,foo_date) values (?,?,null)", list.size(), item); throw new RuntimeException("Rollback!"); } }; - final RecoveryCallback recoveryCallback = new RecoveryCallback() { - public Object recover(RetryContext context) { + final RecoveryCallback recoveryCallback = new RecoveryCallback() { + public String recover(RetryContext context) { return provider.recover(item, context.getLastThrowable()); } }; - Object result = "start"; + String result = "start"; for (int i = 0; i < 4; i++) { try { - result = new TransactionTemplate(transactionManager).execute(new TransactionCallback() { + result = (String) new TransactionTemplate(transactionManager).execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { try { return retryTemplate.execute(callback, recoveryCallback, new RetryState(item)); @@ -254,7 +254,7 @@ public class ExternalRetryTests { return msgs; } - private interface ItemReaderRecoverer extends ItemReader, ItemRecoverer { + private interface ItemReaderRecoverer extends ItemReader, ItemRecoverer { } diff --git a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/retry/jms/SynchronousTests.java b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/retry/jms/SynchronousTests.java index a151bc0b3..4eaae8726 100644 --- a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/retry/jms/SynchronousTests.java +++ b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/retry/jms/SynchronousTests.java @@ -124,12 +124,12 @@ public class SynchronousTests { final String text = (String) jmsTemplate.receiveAndConvert("queue"); assertNotNull(text); - retryTemplate.execute(new RetryCallback() { - public Object doWithRetry(RetryContext status) throws Exception { + retryTemplate.execute(new RetryCallback() { + public String doWithRetry(RetryContext status) throws Exception { TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_NESTED); - return transactionTemplate.execute(new TransactionCallback() { + return (String) transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { list.add(text); @@ -146,7 +146,7 @@ public class SynchronousTests { } }); - // Verify the state after stransactional processing is complete + // Verify the state after transactional processing is complete List msgs = getMessages(); @@ -174,12 +174,12 @@ public class SynchronousTests { final Object item = provider.read(); - retryTemplate.execute(new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + retryTemplate.execute(new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_NESTED); - return transactionTemplate.execute(new TransactionCallback() { + return (String) transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { list.add(item); @@ -235,12 +235,12 @@ public class SynchronousTests { final String text = (String) jmsTemplate.receiveAndConvert("queue"); try { - retryTemplate.execute(new RetryCallback() { - public Object doWithRetry(RetryContext status) throws Exception { + retryTemplate.execute(new RetryCallback() { + public String doWithRetry(RetryContext status) throws Exception { TransactionTemplate nestedTxTemplate = new TransactionTemplate(transactionManager); nestedTxTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_NESTED); - return nestedTxTemplate.execute(new TransactionCallback() { + return (String) nestedTxTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus nestedStatus) { list.add(text); @@ -290,13 +290,13 @@ public class SynchronousTests { assertInitialState(); - retryTemplate.execute(new RetryCallback() { - public Object doWithRetry(RetryContext status) throws Exception { + retryTemplate.execute(new RetryCallback() { + public String doWithRetry(RetryContext status) throws Exception { // use REQUIRES_NEW so that the retry executes in its own transaction TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW); - return transactionTemplate.execute(new TransactionCallback() { + return (String) transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { // The receive is inside the retry and the @@ -338,16 +338,16 @@ public class SynchronousTests { try { - retryTemplate.execute(new RetryCallback() { - public Object doWithRetry(RetryContext status) throws Exception { + retryTemplate.execute(new RetryCallback() { + public String doWithRetry(RetryContext status) throws Exception { // use REQUIRES_NEW so that the retry executes in its own transaction TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW); - return transactionTemplate.execute(new TransactionCallback() { + return (String) transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { - // The receieve is inside the retry and the + // The receive is inside the retry and the // transaction... final String text = (String) jmsTemplate.receiveAndConvert("queue"); list.add(text); @@ -372,7 +372,7 @@ public class SynchronousTests { // expected } - // Verify the state after stransactional processing is complete + // Verify the state after transactional processing is complete List msgs = getMessages(); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ItemRecoverer.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ItemRecoverer.java index 7844745f6..f767cc6bc 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ItemRecoverer.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ItemRecoverer.java @@ -16,12 +16,13 @@ package org.springframework.batch.item; + /** * Strategy interface for recovery action when processing of an item fails.
* * @author Dave Syer */ -public interface ItemRecoverer { +public interface ItemRecoverer { /** * Recover gracefully from an error. Clients can call this if processing of @@ -33,7 +34,7 @@ public interface ItemRecoverer { * the item that failed. * @param cause * the cause of the failure that led to this recovery. - * @return true if recovery was successful. + * @return the value to be returned to the caller */ - Object recover(Object data, Throwable cause); + T recover(S data, Throwable cause); } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/jms/JmsItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/jms/JmsItemReader.java index e7f8540b9..3e09a4075 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/jms/JmsItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/jms/JmsItemReader.java @@ -44,7 +44,7 @@ import org.springframework.util.Assert; * @author Dave Syer * */ -public class JmsItemReader implements ItemReader, ItemRecoverer, ItemKeyGenerator, +public class JmsItemReader implements ItemReader, ItemRecoverer, ItemKeyGenerator, NewItemIdentifier { protected Log logger = LogFactory.getLog(getClass()); @@ -120,7 +120,7 @@ public class JmsItemReader implements ItemReader, ItemRecoverer, ItemKeyGe * @see org.springframework.batch.item.ItemRecoverer#recover(Object, * Throwable) */ - public Object recover(Object item, Throwable cause) { + public T recover(T item, Throwable cause) { try { if (errorDestination != null) { jmsTemplate.convertAndSend(errorDestination, item); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RecoveryCallback.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RecoveryCallback.java index e944d461f..27ce5b00a 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RecoveryCallback.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RecoveryCallback.java @@ -22,7 +22,7 @@ package org.springframework.batch.retry; * * @since 1.1 */ -public interface RecoveryCallback { +public interface RecoveryCallback { /** * @param context the current retry context @@ -30,6 +30,6 @@ public interface RecoveryCallback { * failed * @throws Exception */ - Object recover(RetryContext context) throws Exception; + T recover(RetryContext context) throws Exception; } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryCallback.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryCallback.java index fa80707a7..88d863517 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryCallback.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryCallback.java @@ -21,8 +21,9 @@ package org.springframework.batch.retry; * {@link RetryOperations}. * * @author Rob Harrop + * @author Dave Syer */ -public interface RetryCallback { +public interface RetryCallback { /** * Execute an operation with retry semantics. Operations should generally be @@ -30,7 +31,7 @@ public interface RetryCallback { * semantics when an operation is retried. * @param context the current retry context. * @return the result of the successful operation. - * @throws Exception TODO + * @throws Exception if processing fails */ - Object doWithRetry(RetryContext context) throws Exception; + T doWithRetry(RetryContext context) throws Exception; } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryListener.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryListener.java index 16d6ad105..0eceaff0a 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryListener.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryListener.java @@ -38,7 +38,7 @@ public interface RetryListener { * @param callback the current {@link RetryCallback}. * @return true if the retry should proceed. */ - boolean open(RetryContext context, RetryCallback callback); + boolean open(RetryContext context, RetryCallback callback); /** * Called after the final attempt (successful or not). Allow the interceptor @@ -49,7 +49,7 @@ public interface RetryListener { * @param callback the current {@link RetryCallback}. * @param throwable the last exception that was thrown by the callback. */ - void close(RetryContext context, RetryCallback callback, Throwable throwable); + void close(RetryContext context, RetryCallback callback, Throwable throwable); /** * Called after every unsuccessful attempt at a retry. @@ -58,5 +58,5 @@ public interface RetryListener { * @param callback the current {@link RetryCallback}. * @param throwable the last exception that was thrown by the callback. */ - void onError(RetryContext context, RetryCallback callback, Throwable throwable); + void onError(RetryContext context, RetryCallback callback, Throwable throwable); } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryOperations.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryOperations.java index ab14ab7a1..3742dd914 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryOperations.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/RetryOperations.java @@ -34,7 +34,7 @@ public interface RetryOperations { * @throws Exception any {@link Exception} raised by the * {@link RetryCallback} upon unsuccessful retry. */ - Object execute(RetryCallback retryCallback) throws Exception; + T execute(RetryCallback retryCallback) throws Exception; /** * Execute the supplied {@link RetryCallback} with a fallback on exhausted @@ -46,7 +46,7 @@ public interface RetryOperations { * @throws Exception any {@link Exception} raised by the * {@link RecoveryCallback} upon unsuccessful retry. */ - Object execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback) throws Exception; + T execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback) throws Exception; /** * A simple stateful retry. Execute the supplied {@link RetryCallback} with @@ -66,7 +66,7 @@ public interface RetryOperations { * @throws ExhaustedRetryException if the last attempt for this state has * already been reached */ - Object execute(RetryCallback retryCallback, RetryState retryState) throws Exception, ExhaustedRetryException; + T execute(RetryCallback retryCallback, RetryState retryState) throws Exception, ExhaustedRetryException; /** * A stateful retry with a recovery path. Execute the supplied @@ -81,7 +81,7 @@ public interface RetryOperations { * @throws Exception any {@link Exception} raised by the * {@link RecoveryCallback} upon unsuccessful retry. */ - Object execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback, RetryState retryState) + T execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback, RetryState retryState) throws Exception; } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/interceptor/RetryOperationsInterceptor.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/interceptor/RetryOperationsInterceptor.java index 997fc3c69..5cdbd0fe7 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/interceptor/RetryOperationsInterceptor.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/interceptor/RetryOperationsInterceptor.java @@ -52,7 +52,7 @@ public class RetryOperationsInterceptor implements MethodInterceptor { public Object invoke(final MethodInvocation invocation) throws Throwable { - return this.retryOperations.execute(new RetryCallback() { + return this.retryOperations.execute(new RetryCallback() { public Object doWithRetry(RetryContext context) throws Exception { diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/interceptor/StatefulRetryOperationsInterceptor.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/interceptor/StatefulRetryOperationsInterceptor.java index 4f801150a..c8e25404e 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/interceptor/StatefulRetryOperationsInterceptor.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/interceptor/StatefulRetryOperationsInterceptor.java @@ -59,7 +59,7 @@ public class StatefulRetryOperationsInterceptor implements MethodInterceptor { private ItemKeyGenerator keyGenerator; - private ItemRecoverer recoverer; + private ItemRecoverer recoverer; private NewItemIdentifier newItemIdentifier; @@ -84,7 +84,7 @@ public class StatefulRetryOperationsInterceptor implements MethodInterceptor { * * @param recoverer the {@link ItemRecoverer} to set */ - public void setRecoverer(ItemRecoverer recoverer) { + public void setRecoverer(ItemRecoverer recoverer) { this.recoverer = recoverer; } @@ -143,7 +143,7 @@ public class StatefulRetryOperationsInterceptor implements MethodInterceptor { RetryState retryState = new RetryState(keyGenerator != null ? keyGenerator.getKey(item) : item, newItemIdentifier != null ? newItemIdentifier.isNew(item) : false ); - Object result = retryTemplate.execute(new MethodInvocationRetryCallback(invocation), new ItemRecovererCallback(item, recoverer), retryState); + Object result = retryTemplate.execute(new MethodInvocationRetryCallback(invocation), new ItemRecovererCallback(args, recoverer), retryState); logger.debug("Exiting proxied method in stateful retry with result: (" + result + ")"); @@ -155,7 +155,7 @@ public class StatefulRetryOperationsInterceptor implements MethodInterceptor { * @author Dave Syer * */ - private static final class MethodInvocationRetryCallback implements RetryCallback { + private static final class MethodInvocationRetryCallback implements RetryCallback { /** * */ @@ -188,23 +188,23 @@ public class StatefulRetryOperationsInterceptor implements MethodInterceptor { * @author Dave Syer * */ - private static final class ItemRecovererCallback implements RecoveryCallback { + private static final class ItemRecovererCallback implements RecoveryCallback { - private final Object item; + private final Object[] args; - private final ItemRecoverer recoverer; + private final ItemRecoverer recoverer; /** - * @param item the item that failed. + * @param args the item that failed. */ - private ItemRecovererCallback(Object item, ItemRecoverer recoverer) { - this.item = item; + private ItemRecovererCallback(Object[] args, ItemRecoverer recoverer) { + this.args = args; this.recoverer = recoverer; } public Object recover(RetryContext context) { if (recoverer != null) { - return recoverer.recover(item, context.getLastThrowable()); + return recoverer.recover(args, context.getLastThrowable()); } throw new ExhaustedRetryException("Retry was exhausted but there was no recovery path."); } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/listener/RetryListenerSupport.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/listener/RetryListenerSupport.java index cae0c1524..18cad8921 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/listener/RetryListenerSupport.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/listener/RetryListenerSupport.java @@ -28,13 +28,13 @@ import org.springframework.batch.retry.RetryListener; */ public class RetryListenerSupport implements RetryListener { - public void close(RetryContext context, RetryCallback callback, Throwable throwable) { + public void close(RetryContext context, RetryCallback callback, Throwable throwable) { } - public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { + public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { } - public boolean open(RetryContext context, RetryCallback callback) { + public boolean open(RetryContext context, RetryCallback callback) { return true; } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/support/RetryTemplate.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/support/RetryTemplate.java index 1ce98e5a5..c384a3a1c 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/support/RetryTemplate.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/retry/support/RetryTemplate.java @@ -135,7 +135,7 @@ public class RetryTemplate implements RetryOperations { * @throws TerminatedRetryException if the retry has been manually * terminated through the {@link RetryContext}. */ - public final Object execute(RetryCallback retryCallback) throws Exception { + public final T execute(RetryCallback retryCallback) throws Exception { return doExecute(retryCallback, null, null); } @@ -150,7 +150,7 @@ public class RetryTemplate implements RetryOperations { * @throws TerminatedRetryException if the retry has been manually * terminated through the {@link RetryContext}. */ - public final Object execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback) throws Exception { + public final T execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback) throws Exception { return doExecute(retryCallback, recoveryCallback, null); } @@ -163,7 +163,7 @@ public class RetryTemplate implements RetryOperations { * * @throws ExhaustedRetryException if the retry has been exhausted. */ - public final Object execute(RetryCallback retryCallback, RetryState retryState) throws Exception, + public final T execute(RetryCallback retryCallback, RetryState retryState) throws Exception, ExhaustedRetryException { return doExecute(retryCallback, null, retryState); } @@ -175,7 +175,7 @@ public class RetryTemplate implements RetryOperations { * @see org.springframework.batch.retry.RetryOperations#execute(RetryCallback, * RetryState) */ - public final Object execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback, RetryState retryState) + public final T execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback, RetryState retryState) throws Exception, ExhaustedRetryException { return doExecute(retryCallback, recoveryCallback, retryState); } @@ -188,7 +188,7 @@ public class RetryTemplate implements RetryOperations { * RecoveryCallback, RetryState) * @throws ExhaustedRetryException if the retry has been exhausted. */ - protected Object doExecute(RetryCallback retryCallback, RecoveryCallback recoveryCallback, RetryState state) + protected T doExecute(RetryCallback retryCallback, RecoveryCallback recoveryCallback, RetryState state) throws Exception, ExhaustedRetryException { RetryPolicy retryPolicy = this.retryPolicy; @@ -369,7 +369,7 @@ public class RetryTemplate implements RetryOperations { * @throws Exception if the callback does, and if there is no callback then * definitely the last exception from the context */ - protected Object handleRetryExhausted(RecoveryCallback recoveryCallback, RetryContext context, RetryState state) + protected T handleRetryExhausted(RecoveryCallback recoveryCallback, RetryContext context, RetryState state) throws Exception { if (state != null) { retryContextCache.remove(state.getKey()); @@ -401,7 +401,7 @@ public class RetryTemplate implements RetryOperations { return state != null; } - private boolean doOpenInterceptors(RetryCallback callback, RetryContext context) { + private boolean doOpenInterceptors(RetryCallback callback, RetryContext context) { boolean result = true; @@ -413,13 +413,13 @@ public class RetryTemplate implements RetryOperations { } - private void doCloseInterceptors(RetryCallback callback, RetryContext context, Throwable lastException) { + private void doCloseInterceptors(RetryCallback callback, RetryContext context, Throwable lastException) { for (int i = listeners.length; i-- > 0;) { listeners[i].close(context, callback, lastException); } } - private void doOnErrorInterceptors(RetryCallback callback, RetryContext context, Throwable throwable) { + private void doOnErrorInterceptors(RetryCallback callback, RetryContext context, Throwable throwable) { for (int i = listeners.length; i-- > 0;) { listeners[i].onError(context, callback, throwable); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ItemRecoveryHandlerTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ItemRecoveryHandlerTests.java index 0819f90b6..1a6e6fb99 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ItemRecoveryHandlerTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ItemRecoveryHandlerTests.java @@ -20,8 +20,8 @@ import junit.framework.TestCase; public class ItemRecoveryHandlerTests extends TestCase { - ItemRecoverer recoverer = new ItemRecoverer() { - public Object recover(Object data, Throwable cause) { + ItemRecoverer recoverer = new ItemRecoverer() { + public String recover(String data, Throwable cause) { return null; } }; diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/StubItemKeyGeneratorRecoverer.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/StubItemKeyGeneratorRecoverer.java deleted file mode 100644 index e6051e3f6..000000000 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/StubItemKeyGeneratorRecoverer.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2006-2007 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.batch.retry; - -import org.springframework.batch.item.ItemKeyGenerator; -import org.springframework.batch.item.ItemRecoverer; - -public class StubItemKeyGeneratorRecoverer implements ItemRecoverer, ItemKeyGenerator { - - /** - * Do nothing and return null. Subclassses should override to implement - * recovery behaviour. - * - * @see org.springframework.batch.item.ItemRecoverer#recover(java.lang.Object, - * Throwable) - * - * @return null. - */ - public Object recover(Object item, Throwable cause) { - return null; - } - - /** - * Return the item (assume it is its own key). - * - * @see org.springframework.batch.item.ItemKeyGenerator#getKey(java.lang.Object) - */ - public Object getKey(Object item) { - return item; - } - -} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/interceptor/StatefulRetryOperationsInterceptorTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/interceptor/StatefulRetryOperationsInterceptorTests.java index e60c9f68f..b2310ebbe 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/interceptor/StatefulRetryOperationsInterceptorTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/interceptor/StatefulRetryOperationsInterceptorTests.java @@ -170,10 +170,10 @@ public class StatefulRetryOperationsInterceptorTests extends TestCase { assertTrue("Wrong message: " + message, message.startsWith("Not enough calls")); } assertEquals(1, count); - interceptor.setRecoverer(new ItemRecoverer() { - public Object recover(Object data, Throwable cause) { + interceptor.setRecoverer(new ItemRecoverer() { + public Object recover(Object[] data, Throwable cause) { count++; - return data; + return null; } }); service.service("foo"); @@ -192,10 +192,10 @@ public class StatefulRetryOperationsInterceptorTests extends TestCase { assertTrue("Wrong message: " + message, message.startsWith("Not enough calls")); } assertEquals(1, count); - interceptor.setRecoverer(new ItemRecoverer() { - public Object recover(Object data, Throwable cause) { + interceptor.setRecoverer(new ItemRecoverer, Object[]>() { + public Collection recover(Object[] data, Throwable cause) { count++; - return Collections.singleton(data); + return Collections.singleton((String)data[0]); } }); Collection result = transformer.transform("foo"); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/listener/RetryListenerTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/listener/RetryListenerTests.java index 02f01464d..b73edf74b 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/listener/RetryListenerTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/listener/RetryListenerTests.java @@ -38,20 +38,20 @@ public class RetryListenerTests extends TestCase { public void testOpenInterceptors() throws Exception { template.setListeners(new RetryListener[] { new RetryListenerSupport() { - public boolean open(RetryContext context, RetryCallback callback) { + public boolean open(RetryContext context, RetryCallback callback) { count++; list.add("1:" + count); return true; } }, new RetryListenerSupport() { - public boolean open(RetryContext context, RetryCallback callback) { + public boolean open(RetryContext context, RetryCallback callback) { count++; list.add("2:" + count); return true; } } }); - template.execute(new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + template.execute(new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { return null; } }); @@ -62,14 +62,14 @@ public class RetryListenerTests extends TestCase { public void testOpenCanVetoRetry() throws Exception { template.registerListener(new RetryListenerSupport() { - public boolean open(RetryContext context, RetryCallback callback) { + public boolean open(RetryContext context, RetryCallback callback) { list.add("1"); return false; } }); try { - template.execute(new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + template.execute(new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { count++; return null; } @@ -86,18 +86,18 @@ public class RetryListenerTests extends TestCase { public void testCloseInterceptors() throws Exception { template.setListeners(new RetryListener[] { new RetryListenerSupport() { - public void close(RetryContext context, RetryCallback callback, Throwable t) { + public void close(RetryContext context, RetryCallback callback, Throwable t) { count++; list.add("1:" + count); } }, new RetryListenerSupport() { - public void close(RetryContext context, RetryCallback callback, Throwable t) { + public void close(RetryContext context, RetryCallback callback, Throwable t) { count++; list.add("2:" + count); } } }); - template.execute(new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + template.execute(new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { return null; } }); @@ -110,17 +110,17 @@ public class RetryListenerTests extends TestCase { public void testOnError() throws Exception { template.setRetryPolicy(new NeverRetryPolicy()); template.setListeners(new RetryListener[] { new RetryListenerSupport() { - public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { + public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { list.add("1"); } }, new RetryListenerSupport() { - public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { + public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { list.add("2"); } } }); try { - template.execute(new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + template.execute(new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { count++; throw new IllegalStateException("foo"); } @@ -140,14 +140,14 @@ public class RetryListenerTests extends TestCase { public void testCloseInterceptorsAfterRetry() throws Exception { template.registerListener(new RetryListenerSupport() { - public void close(RetryContext context, RetryCallback callback, Throwable t) { + public void close(RetryContext context, RetryCallback callback, Throwable t) { list.add("" + count); // The last attempt should have been successful: assertNull(t); } }); - template.execute(new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + template.execute(new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { if (count++ < 1) throw new RuntimeException("Retry!"); return null; diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/policy/FatalExceptionRetryPolicyTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/policy/FatalExceptionRetryPolicyTests.java index 0ce45dcff..ba0149e55 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/policy/FatalExceptionRetryPolicyTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/policy/FatalExceptionRetryPolicyTests.java @@ -44,8 +44,8 @@ public class FatalExceptionRetryPolicyTests extends TestCase { add(IllegalStateException.class); } }); - RecoveryCallback recoveryCallback = new RecoveryCallback() { - public Object recover(RetryContext context) throws Exception { + RecoveryCallback recoveryCallback = new RecoveryCallback() { + public String recover(RetryContext context) throws Exception { return "bar"; } }; @@ -77,8 +77,8 @@ public class FatalExceptionRetryPolicyTests extends TestCase { add(IllegalStateException.class); } }); - RecoveryCallback recoveryCallback = new RecoveryCallback() { - public Object recover(RetryContext context) throws Exception { + RecoveryCallbackrecoveryCallback = new RecoveryCallback() { + public String recover(RetryContext context) throws Exception { return "bar"; } }; @@ -98,15 +98,15 @@ public class FatalExceptionRetryPolicyTests extends TestCase { assertEquals("bar", result); } - private static class MockRetryCallback implements RetryCallback { + private static class MockRetryCallback implements RetryCallback { private int attempts; private Exception exceptionToThrow = new Exception(); - public Object doWithRetry(RetryContext context) throws Exception { + public String doWithRetry(RetryContext context) throws Exception { this.attempts++; - // Otherwise just barf... + // Just barf... throw this.exceptionToThrow; } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/policy/StatefulRetryIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/policy/StatefulRetryIntegrationTests.java index 3f4caf8d8..fa712c480 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/policy/StatefulRetryIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/policy/StatefulRetryIntegrationTests.java @@ -113,10 +113,10 @@ public class StatefulRetryIntegrationTests { * @author Dave Syer * */ - private final class MockRetryCallback implements RetryCallback { + private final class MockRetryCallback implements RetryCallback { int attempts = 0; - public Object doWithRetry(RetryContext context) throws Exception { + public String doWithRetry(RetryContext context) throws Exception { attempts++; if (attempts < 2) { throw new RuntimeException(); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/RetrySynchronizationManagerTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/RetrySynchronizationManagerTests.java index 5455891c7..75c721497 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/RetrySynchronizationManagerTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/RetrySynchronizationManagerTests.java @@ -21,8 +21,6 @@ import junit.framework.TestCase; import org.springframework.batch.retry.RetryCallback; import org.springframework.batch.retry.RetryContext; import org.springframework.batch.retry.context.RetryContextSupport; -import org.springframework.batch.retry.support.RetrySynchronizationManager; -import org.springframework.batch.retry.support.RetryTemplate; /** * @author Dave Syer @@ -43,7 +41,7 @@ public class RetrySynchronizationManagerTests extends TestCase { RetryContext status = RetrySynchronizationManager.getContext(); assertNull(status); - template.execute(new RetryCallback() { + template.execute(new RetryCallback() { public Object doWithRetry(RetryContext status) throws Exception { RetryContext global = RetrySynchronizationManager.getContext(); assertNotNull(status); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/RetryTemplateTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/RetryTemplateTests.java index 08c3afc55..7a8929aa4 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/RetryTemplateTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/RetryTemplateTests.java @@ -137,7 +137,7 @@ public class RetryTemplateTests extends TestCase { public void testEarlyTermination() throws Exception { try { RetryTemplate retryTemplate = new RetryTemplate(); - retryTemplate.execute(new RetryCallback() { + retryTemplate.execute(new RetryCallback() { public Object doWithRetry(RetryContext status) throws Exception { status.setExhaustedOnly(); throw new IllegalStateException("Retry this operation"); @@ -155,11 +155,11 @@ public class RetryTemplateTests extends TestCase { public void testNestedContexts() throws Exception { RetryTemplate outer = new RetryTemplate(); final RetryTemplate inner = new RetryTemplate(); - outer.execute(new RetryCallback() { + outer.execute(new RetryCallback() { public Object doWithRetry(RetryContext status) throws Exception { context = status; count++; - Object result = inner.execute(new RetryCallback() { + Object result = inner.execute(new RetryCallback() { public Object doWithRetry(RetryContext status) throws Exception { count++; assertNotNull(context); @@ -180,7 +180,7 @@ public class RetryTemplateTests extends TestCase { RetryTemplate retryTemplate = new RetryTemplate(); retryTemplate.setRetryPolicy(new NeverRetryPolicy()); try { - retryTemplate.execute(new RetryCallback() { + retryTemplate.execute(new RetryCallback() { public Object doWithRetry(RetryContext context) throws Exception { throw new Error("Realllly bad!"); } @@ -200,7 +200,7 @@ public class RetryTemplateTests extends TestCase { } }); try { - retryTemplate.execute(new RetryCallback() { + retryTemplate.execute(new RetryCallback() { public Object doWithRetry(RetryContext context) throws Exception { throw new RuntimeException("Bad!"); } @@ -212,7 +212,7 @@ public class RetryTemplateTests extends TestCase { } } - private static class MockRetryCallback implements RetryCallback { + private static class MockRetryCallback implements RetryCallback { private int attempts; diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/StatefulRecoveryRetryTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/StatefulRecoveryRetryTests.java index 61dbd8efa..a7ed38d7f 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/StatefulRecoveryRetryTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/retry/support/StatefulRecoveryRetryTests.java @@ -94,13 +94,13 @@ public class StatefulRecoveryRetryTests { retryTemplate.setRetryPolicy(new SimpleRetryPolicy(1)); final String input = "foo"; RetryState state = new RetryState(input); - RetryCallback callback = new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + RetryCallback callback = new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { throw new RuntimeException("Barf!"); } }; - RecoveryCallback recoveryCallback = new RecoveryCallback() { - public Object recover(RetryContext context) { + RecoveryCallback recoveryCallback = new RecoveryCallback() { + public String recover(RetryContext context) { count++; list.add(input); return input; @@ -128,8 +128,8 @@ public class StatefulRecoveryRetryTests { final String input = "foo"; RetryState state = new RetryState(input); - RetryCallback callback = new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + RetryCallback callback = new RetryCallback() { + public String doWithRetry(RetryContext context) throws Exception { throw new RuntimeException("Barf!"); } }; @@ -163,8 +163,8 @@ public class StatefulRecoveryRetryTests { final StringHolder item = new StringHolder("bar"); RetryState state = new RetryState(item); - RetryCallback callback = new RetryCallback() { - public Object doWithRetry(RetryContext context) throws Exception { + RetryCallback callback = new RetryCallback() { + public StringHolder doWithRetry(RetryContext context) throws Exception { // This simulates what happens if someone uses a primary key // for hashCode and equals and then relies on default key // generator @@ -195,7 +195,7 @@ public class StatefulRecoveryRetryTests { retryTemplate.setRetryPolicy(new SimpleRetryPolicy(1)); retryTemplate.setRetryContextCache(new MapRetryContextCache(1)); - RetryCallback callback = new RetryCallback() { + RetryCallback callback = new RetryCallback() { public Object doWithRetry(RetryContext context) throws Exception { count++; throw new RuntimeException("Barf!"); @@ -229,13 +229,13 @@ public class StatefulRecoveryRetryTests { final StringHolder item = new StringHolder("foo"); RetryState state = new RetryState(item); - RetryCallback callback = new RetryCallback() { + RetryCallback callback = new RetryCallback() { public Object doWithRetry(RetryContext context) throws Exception { count++; throw new RuntimeException("Barf!"); } }; - RecoveryCallback recoveryCallback = new RecoveryCallback() { + RecoveryCallback recoveryCallback = new RecoveryCallback() { public Object recover(RetryContext context) throws Exception { return null; } @@ -260,36 +260,18 @@ public class StatefulRecoveryRetryTests { private String string; - /** - * @param string - */ public StringHolder(String string) { this.string = string; } - /* - * (non-Javadoc) - * - * @see java.lang.Object#equals(java.lang.Object) - */ public boolean equals(Object obj) { return string.equals(((StringHolder) obj).string); } - /* - * (non-Javadoc) - * - * @see java.lang.Object#hashCode() - */ public int hashCode() { return string.hashCode(); } - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ public String toString() { return "String: " + string + " (hash = " + hashCode() + ")"; } diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/retry/PollableSourceRetryTests.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/retry/PollableSourceRetryTests.java index 273e63fd7..8f98974c7 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/retry/PollableSourceRetryTests.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/retry/PollableSourceRetryTests.java @@ -403,16 +403,13 @@ public class PollableSourceRetryTests { */ private StatefulRetryOperationsInterceptor getRetryOperationsInterceptor(ItemKeyGenerator itemKeyGenerator) { StatefulRetryOperationsInterceptor advice = new StatefulRetryOperationsInterceptor(); - advice.setRecoverer(new ItemRecoverer() { + advice.setRecoverer(new ItemRecoverer() { @SuppressWarnings("unchecked") - public Object recover(Object data, Throwable cause) { + public Boolean recover(Object[] data, Throwable cause) { if (data == null) { return false; } - if (data.getClass().isArray()) { - data = ((Object[]) data)[0]; - } - String payload = ((Message) data).getPayload(); + String payload = ((Message) data[0]).getPayload(); logger.debug("Recovering: " + payload); recovered.add(payload); return true;