Fix cycle in StepScope

This commit is contained in:
dsyer
2008-12-07 19:32:27 +00:00
parent 5d62e4d436
commit e4f8f61694
26 changed files with 76 additions and 38 deletions

View File

@@ -17,6 +17,8 @@ package org.springframework.batch.core.scope;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
import org.springframework.batch.core.scope.util.PlaceholderProxyFactoryBean;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeansException;

View File

@@ -1,4 +1,4 @@
package org.springframework.batch.core.scope;
package org.springframework.batch.core.scope.context;
import org.springframework.core.AttributeAccessorSupport;

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.core.scope;
package org.springframework.batch.core.scope.context;
import java.util.ArrayList;
import java.util.Collections;
@@ -28,6 +28,7 @@ import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.scope.StepScope;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.context.SynchronizedAttributeAccessor;
import org.springframework.util.Assert;

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.core.scope;
package org.springframework.batch.core.scope.context;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

View File

@@ -1,4 +1,4 @@
package org.springframework.batch.core.scope;
package org.springframework.batch.core.scope.context;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.core.scope;
package org.springframework.batch.core.scope.context;
import java.util.Stack;

View File

@@ -1,7 +1,7 @@
package org.springframework.batch.core.scope.util;
import org.springframework.batch.core.scope.StepContext;
import org.springframework.batch.core.scope.StepSynchronizationManager;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
/**
* Implementation of {@link ContextFactory} that provides the current

View File

@@ -32,7 +32,7 @@ import org.springframework.batch.core.launch.NoSuchJobException;
import org.springframework.batch.core.launch.support.ExitCodeMapper;
import org.springframework.batch.core.listener.CompositeStepExecutionListener;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.scope.StepSynchronizationManager;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;

View File

@@ -25,8 +25,8 @@ import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.scope.StepContext;
import org.springframework.batch.core.scope.StepContextRepeatCallback;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepContextRepeatCallback;
import org.springframework.batch.core.step.AbstractStep;
import org.springframework.batch.core.step.StepInterruptionPolicy;
import org.springframework.batch.core.step.ThreadStepInterruptionPolicy;

View File

@@ -15,6 +15,8 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;

View File

@@ -12,6 +12,7 @@ import org.junit.runner.RunWith;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

View File

@@ -8,6 +8,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;

View File

@@ -30,6 +30,8 @@ import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.context.support.StaticApplicationContext;

View File

@@ -3,6 +3,8 @@ package org.springframework.batch.core.scope;
import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
public class TestStep implements Step {

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.core.scope;
package org.springframework.batch.core.scope.context;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -24,6 +24,9 @@ import org.junit.Test;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepContextRepeatCallback;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.RepeatStatus;

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.core.scope;
package org.springframework.batch.core.scope.context;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -30,6 +30,7 @@ import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.item.ExecutionContext;
/**

View File

@@ -1,4 +1,4 @@
package org.springframework.batch.core.scope;
package org.springframework.batch.core.scope.context;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -12,6 +12,8 @@ import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
public class StepSynchronizationManagerTests {

View File

@@ -7,8 +7,8 @@ import org.junit.After;
import org.junit.Test;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.StepContext;
import org.springframework.batch.core.scope.StepSynchronizationManager;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
public class StepContextFactoryTests {

View File

@@ -31,7 +31,7 @@ import org.junit.Test;
import org.springframework.batch.core.SkipListener;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.ChunkContext;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.skip.NeverSkipItemSkipPolicy;
import org.springframework.batch.core.step.skip.SkipPolicy;
import org.springframework.batch.core.step.skip.SkipLimitExceededException;

View File

@@ -43,7 +43,7 @@
<aop:aspectj-autoproxy />
<bean class="org.springframework.batch.core.scope.TestAdvice" />
<bean class="org.springframework.batch.core.scope.StepScopeManager" />
<bean class="org.springframework.batch.core.scope.context.StepScopeManager" />
<bean class="org.springframework.batch.core.scope.StepScope" />
</beans>

View File

@@ -38,7 +38,7 @@
</bean>
<aop:aspectj-autoproxy />
<bean class="org.springframework.batch.core.scope.StepScopeManager" />
<bean class="org.springframework.batch.core.scope.context.StepScopeManager" />
<bean class="org.springframework.batch.core.scope.StepScope" />
</beans>

View File

@@ -27,7 +27,7 @@
</bean>
<aop:aspectj-autoproxy />
<bean class="org.springframework.batch.core.scope.StepScopeManager" />
<bean class="org.springframework.batch.core.scope.context.StepScopeManager" />
<bean class="org.springframework.batch.core.scope.StepScope" />
</beans>

View File

@@ -25,7 +25,7 @@
</bean>
<aop:aspectj-autoproxy />
<bean class="org.springframework.batch.core.scope.StepScopeManager" />
<bean class="org.springframework.batch.core.scope.context.StepScopeManager" />
<bean class="org.springframework.batch.core.scope.StepScope" />
</beans>

View File

@@ -74,5 +74,10 @@ public class RetryContextSupport extends AttributeAccessorSupport implements Ret
if (throwable != null)
count++;
}
@Override
public String toString() {
return String.format("[RetryContext: count=%d, lastException=%s, exhausted=%b]", count, lastException, terminate);
}
}

View File

@@ -104,4 +104,8 @@ public class DefaultRetryState implements RetryState {
return rollbackClassifier.classify(exception);
}
@Override
public String toString() {
return String.format("[%s: key=%s, forceRefresh=%b]", getClass().getSimpleName(), key, forceRefresh);
}
}

View File

@@ -23,7 +23,6 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.retry.ExhaustedRetryException;
import org.springframework.batch.retry.RetryState;
import org.springframework.batch.retry.RecoveryCallback;
import org.springframework.batch.retry.RetryCallback;
import org.springframework.batch.retry.RetryContext;
@@ -31,6 +30,7 @@ import org.springframework.batch.retry.RetryException;
import org.springframework.batch.retry.RetryListener;
import org.springframework.batch.retry.RetryOperations;
import org.springframework.batch.retry.RetryPolicy;
import org.springframework.batch.retry.RetryState;
import org.springframework.batch.retry.TerminatedRetryException;
import org.springframework.batch.retry.backoff.BackOffContext;
import org.springframework.batch.retry.backoff.BackOffInterruptedException;
@@ -42,9 +42,10 @@ import org.springframework.batch.retry.policy.SimpleRetryPolicy;
/**
* Template class that simplifies the execution of operations with retry
* semantics. <br/> Retryable operations are encapsulated in implementations of
* the {@link RetryCallback} interface and are executed using one of the
* supplied execute methods. <br/>
* semantics. <br/>
* Retryable operations are encapsulated in implementations of the
* {@link RetryCallback} interface and are executed using one of the supplied
* execute methods. <br/>
*
* By default, an operation is retried if is throws any {@link Exception} or
* subclass of {@link Exception}. This behaviour can be changed by using the
@@ -130,7 +131,7 @@ public class RetryTemplate implements RetryOperations {
* dictates that we stop, in which case the most recent exception thrown by
* the callback will be rethrown.
*
* @see org.springframework.batch.retry.RetryOperations#execute(org.springframework.batch.retry.RetryCallback)
* @see RetryOperations#execute(RetryCallback)
*
* @throws TerminatedRetryException if the retry has been manually
* terminated by a listener.
@@ -144,8 +145,7 @@ public class RetryTemplate implements RetryOperations {
* dictates that we stop, in which case the recovery callback will be
* executed.
*
* @see org.springframework.batch.retry.RetryOperations#execute(org.springframework.batch.retry.RetryCallback,
* org.springframework.batch.retry.RecoveryCallback)
* @see RetryOperations#execute(RetryCallback, RecoveryCallback)
*
* @throws TerminatedRetryException if the retry has been manually
* terminated by a listener.
@@ -156,10 +156,10 @@ public class RetryTemplate implements RetryOperations {
/**
* Execute the callback once if the policy dictates that we can, re-throwing
* any exception encountered.
* any exception encountered so that clients can re-present the same task
* later.
*
* @see org.springframework.batch.retry.RetryOperations#execute(RetryCallback,
* RetryState)
* @see RetryOperations#execute(RetryCallback, RetryState)
*
* @throws ExhaustedRetryException if the retry has been exhausted.
*/
@@ -170,10 +170,10 @@ public class RetryTemplate implements RetryOperations {
/**
* Execute the callback once if the policy dictates that we can, re-throwing
* any exception encountered.
* any exception encountered so that clients can re-present the same task
* later.
*
* @see org.springframework.batch.retry.RetryOperations#execute(RetryCallback,
* RetryState)
* @see RetryOperations#execute(RetryCallback, RetryState)
*/
public final <T> T execute(RetryCallback<T> retryCallback, RecoveryCallback<T> recoveryCallback,
RetryState retryState) throws Exception, ExhaustedRetryException {
@@ -184,8 +184,7 @@ public class RetryTemplate implements RetryOperations {
* Execute the callback once if the policy dictates that we can, otherwise
* execute the recovery callback.
*
* @see org.springframework.batch.retry.RetryOperations#execute(RetryCallback,
* RecoveryCallback, RetryState)
* @see RetryOperations#execute(RetryCallback, RecoveryCallback, RetryState)
* @throws ExhaustedRetryException if the retry has been exhausted.
*/
protected <T> T doExecute(RetryCallback<T> retryCallback, RecoveryCallback<T> recoveryCallback, RetryState state)
@@ -221,7 +220,7 @@ public class RetryTemplate implements RetryOperations {
* external retry to allow a recovery in handleRetryExhausted
* without the callback processing (which would throw an exception).
*/
while (retryPolicy.canRetry(context) && !context.isExhaustedOnly()) {
while (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) {
try {
logger.debug("Retry: count=" + context.getRetryCount());
@@ -257,9 +256,9 @@ public class RetryTemplate implements RetryOperations {
}
/*
* A stateful policy that can retry should have rethrown the
* A stateful attempt that can retry should have rethrown the
* exception by now - i.e. we shouldn't get this far for a
* stateful policy if it can retry.
* stateful attempt if it can retry.
*/
}
@@ -281,6 +280,19 @@ public class RetryTemplate implements RetryOperations {
}
/**
* Decide whether to proceed with the ongoing retry attempt. This method is
* called before the {@link RetryCallback} is executed, but after the
* backoff and open interceptors.
*
* @param retryPolicy the policy to apply
* @param context the current retry context
* @return true if we can continue with the attempt
*/
protected boolean canRetry(RetryPolicy retryPolicy, RetryContext context) {
return retryPolicy.canRetry(context);
}
/**
* Clean up the cache if necessary and close the context provided (if the
* flag indicates that processing was successful).