Spring Batch: mise en contexte d'étape dans le processeur pour partitionné étape
Je suis élaboration d'un Ressort de Lots de traiter plusieurs fichiers d'entrée en parallèle à l'aide d'un MultiResourcePartitioner. Dans le ItemProcessor j'ai besoin d'obtenir le nombre d'enregistrements du fichier d'entrée. Je reçois le nom du fichier en cours de l'étape de contexte et de lire le nombre de lignes dans le fichier:
StepSynchronizationManager.register(stepExecution);
StepContext stepContext = StepSynchronizationManager.getContext();
StepSynchronizationManager.close();
log.trace("stepContext: " + stepContext.getStepExecution().getExecutionContext().entrySet().toString());
...
UrlResource currentFile = new UrlResource(stepContext.getStepExecution().getExecutionContext().getString("fileName"));
Tout cela semble fonctionner mais je reçois des exceptions lors de l'accès au contexte d'étape du processeur de threads:
2013-05-15 11:44:35,178 DEBUG [org.springframework.batch.core.step.tasklet.TaskletStep] <taskExecutor-3> - Rollback for RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.processor': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope
2013-05-15 11:44:35,194 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] <taskExecutor-3> - Returning JDBC Connection to DataSource
2013-05-15 11:44:35,194 DEBUG [org.springframework.batch.repeat.support.RepeatTemplate] <taskExecutor-3> - Handling exception: org.springframework.beans.factory.BeanCreationException, caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.processor': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope
2013-05-15 11:44:35,194 DEBUG [org.springframework.batch.repeat.support.RepeatTemplate] <taskExecutor-3> - Handling fatal exception explicitly (rethrowing first of 1): org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.processor': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope
2013-05-15 11:44:35,210 ERROR [org.springframework.batch.core.step.AbstractStep] <taskExecutor-3> - Encountered an error executing the step
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.processor': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:341)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:33)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:182)
at $Proxy14.process(Unknown Source)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.doProcess(SimpleChunkProcessor.java:125)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.transform(SimpleChunkProcessor.java:291)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:190)
at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:74)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:386)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:264)
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:250)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:120)
at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:118)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.IllegalStateException: No context holder available for step scope
at org.springframework.batch.core.scope.StepScope.getContext(StepScope.java:197)
at org.springframework.batch.core.scope.StepScope.get(StepScope.java:139)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:327)
... 24 more
Est-il un moyen pour récupérer les nom de fichier d'entrée du processeur d'un partitionnée travail?
Voici la config:
<batch:job id="acct">
<batch:step id="init" parent="abstractStep" next="processStep">
<batch:tasklet ref="fileDeleteTasklet" />
</batch:step>
<batch:step id="processStep">
<batch:partition step="processInput" partitioner="partitioner">
<batch:handler grid-size="2" task-executor="taskExecutor" />
</batch:partition>
</batch:step>
</batch:job>
<batch:step id="processInput">
<batch:tasklet>
<batch:chunk reader="reader" processor="processor" writer="writer" commit-interval="3">
<batch:streams>
<batch:stream ref="reader"/>
<batch:stream ref="flatFileItemWriter"/>
</batch:streams>
</batch:chunk>
</batch:tasklet>
</batch:step>
<bean id="partitioner" class="org.springframework.batch.core.partition.support.MultiResourcePartitioner" scope="step">
<property name="keyName" value="fileName"/>
<property name="resources" value="file:#{jobParameters['inputFilePattern']}"/>
</bean>
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5"/>
<property name="maxPoolSize" value="5"/>
</bean>
<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="#{stepExecutionContext[fileName]}" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
<property name="names" value="recordType,reserved,aCode,bCode,acctNumber,idType,cCode" />
<property name="columns" value="1,2,3-6,7-9,10-15,16,17-19" />
<property name="strict" value="false" />
</bean>
</property>
<property name="fieldSetMapper">
<bean class="com.example.batch.acct.AcctInputFieldSetMapper" />
</property>
</bean>
</property>
</bean>
<bean id="processor" class="com.example.batch.acct.AcctProcessor" scope="step">
<property name="soapClient" ref="soapClient" />
<property name="maxNumIds" value="${batch.soap.numberOfIds}" />
<aop:scoped-proxy />
</bean>
quelle est la version de Spring et Spring Batch utilisez-vous?
Je suis l'aide de Printemps 3.0.6 et Spring Batch 2.1.9.
Je suis l'aide de Printemps 3.0.6 et Spring Batch 2.1.9.
OriginalL'auteur iguanodon | 2013-05-15
Vous devez vous connecter pour publier un commentaire.
Répondu sur le Spring Batch forum:
OriginalL'auteur iguanodon
Dans ce cas, lorsque
stepContex
est un type deorg.springframework.batch.core.scope.context.StepContext
, comment suggère le nom de cette propriété, je reçois des exceptions:J'avais besoin d'accéder à
jobExecutionId
à l'intérieur deItemProcessor
, j'ai donc changé cette configuration:Propriété
"stepExecution"
est un typeorg.springframework.batch.core.StepExecution
OriginalL'auteur aps