Hello,
I'm trying resty functionalities of spring batch. Unfortunately I face some problems.
First I define an abstract step:
If an exception is thrown when committing (the first commit), my skip policy is called. This also works when it's processing the first entity. But, if an exception is thrown while reading the first entity, my retry policy (cfr defaultRetryPolicy) is not called. Is it a bug ?Code:<bean id="defaultRetryPolicy" class="com.bsb.sf.batch.DefaultRetryPolicy" /> <bean id="fatherStep" class="org.springframework.batch.core.step.item.FaultTolerantStepFactoryBean" abstract="true"> <property name="transactionManager" ref="transactionManager" /> <property name="jobRepository" ref="jobRepository" /> <property name="backOffPolicy"> <bean class="org.springframework.batch.retry.backoff.FixedBackOffPolicy"> <property name="backOffPeriod" value="8000" /> </bean> </property> <property name="retryableExceptionClasses"> <map> </map> </property> <property name="retryLimit" value="3" /> <property name="retryPolicy" ref="defaultRetryPolicy" /> </bean> <!--parent="defaultBatchJob"--> <job id="retryPolicyJob" xmlns="http://www.springframework.org/schema/batch"> <step id="mainStep" parent="fatherStep"> <tasklet> <chunk reader="itemReader" processor="itemProcessor" writer="itemWriter" commit-interval="2"> </chunk> </tasklet> </step> </job>
This is my console:
Best regards,Code:2010-01-11 11:08:17 [main] DataSourceInitializer [DEBUG] Executing script: schema-drop-hsqldb.sql 2010-01-11 11:08:18 [main] DataSourceInitializer [DEBUG] Executing script: batch-model-drop-h2.sql 2010-01-11 11:08:18 [main] DataSourceInitializer [DEBUG] Executing script: schema-drop-hsqldb.sql 2010-01-11 11:08:18 [main] DataSourceInitializer [DEBUG] Executing script: schema-hsqldb.sql 2010-01-11 11:08:18 [main] DataSourceInitializer [DEBUG] Executing script: batch-model-create-h2.sql 2010-01-11 11:08:19 [main] ExceptionItemReader [DEBUG] Exception class: com.bsb.sf.batch.MyRetryableException 2010-01-11 11:08:19 [main] ExceptionItemReader [DEBUG] Account reader nbrun = 0 maxrun: 2 2010-01-11 11:08:19 [main] ExceptionItemReader [DEBUG] Crash, item 1 2010-01-11 11:08:19 [main] AbstractStep [ERROR] Encountered an error executing the step org.springframework.batch.core.step.skip.NonSkippableReadException: Non-skippable exception during read at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:81) at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:106) at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:103) at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:68) at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:347) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128) at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:261) at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:76) at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:247) at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:196) at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:115) at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61) at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60) at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:144) at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124) at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:99) at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:276) at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:118) at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49) at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:112) at com.bsb.sf.incubator.batch.AbstractBatchJobLauncherTest.doLaunchJob(AbstractBatchJobLauncherTest.java:62) at com.bsb.sf.batch.DefaultRetryPolicyTest.mikeyWorld(DefaultRetryPolicyTest.java:89) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160) at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233) at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333) at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217) at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197) at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160) at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: com.bsb.sf.batch.MyRetryableException: Exception planned to be launch at item 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.bsb.sf.incubator.batch.simple.ExceptionItemReader.read(ExceptionItemReader.java:78) at com.bsb.sf.incubator.batch.simple.ExceptionItemReader.read(ExceptionItemReader.java:1) at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:90) at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:68) ... 50 more 2010-01-11 11:08:20 [Thread-22] DataSourceInitializer [DEBUG] Executing script: schema-drop-hsqldb.sql 2010-01-11 11:08:20 [Thread-22] DataSourceInitializer [DEBUG] Executing script: batch-model-drop-h2.sql
Sébastien


Reply With Quote
