2016-09-06 12 views
0

我正試圖實現一個簡單的事情 - 將基於xml的分區作業轉換爲註釋。將Partitioner ExecutionContext傳遞給讀者的問題

滯留在這一部分中,

<bean id="pagingItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader" 
     scope="step"> 


     <property name="parameterValues"> 
      <map> 
       <entry key="minId" value="#{stepExecutionContext[minId]}" /> 
       <entry key="maxId" value="#{stepExecutionContext[maxId]}" /> 
      </map> 
     </property> 

    </bean> 

相應的註釋代碼是這樣,

@Bean 
    public Step masterStep(){ 
     return stepBuilderFactory.get("masterStep") 
       .partitioner(slaveStep(syncReader(null,null),writer(),processor())) 
       .partitioner("slaveStep", rangePartitioner) 
       .gridSize(10) 
       .taskExecutor(simpleAsyntaskExecutor) 
       .build(); 
    } 

    @Bean(name="slaveStep") 
    public Step slaveStep(
      ItemReader<RemittanceVO> syncReader, ItemWriter<RemittanceClaimVO> writer, 
      ItemProcessor<RemittanceVO, RemittanceClaimVO> processor) { 

     return stepBuilderFactory.get("slaveStep") 
       .<RemittanceVO, RemittanceClaimVO> chunk(Constants.SPRING_BATCH_CHUNK_SIZE) 
       .reader(syncReader) 
       .processor(processor) 
       .writer(writer) 
       .build(); 
    } 

    @Bean 
    public Partitioner rangePartitioner(){ 
     RangePartitioner rangePartitioner = new RangePartitioner(); 
     return rangePartitioner; 
    } 

@Bean 
    @StepScope 
    public ItemReader<RemittanceVO> syncReader(@Value("#{stepExecutionContext[minId]}") Long minId,@Value("#{stepExecutionContext[maxId]}") Long maxId) { 
     SynchronizedItemStreamReader<RemittanceVO> syncReader = new SynchronizedItemStreamReader<RemittanceVO>(); 
     syncReader.setDelegate(reader(minId,maxId)); 
     return syncReader; 
    } 

    @Bean 
    @StepScope 
    public ItemStreamReader<RemittanceVO> reader(Long minId,Long maxId) { 
     JdbcPagingItemReader<RemittanceVO> reader = new JdbcPagingItemReader<RemittanceVO>(); 
     reader.setDataSource(dataSource); 
     reader.setRowMapper(new RemittanceRowMapper()); 
     reader.setQueryProvider(queryProvider); 
     reader.setPageSize(Constants.SPRING_BATCH_READER_PAGE_SIZE); 
     Map<String,Object> parameterValues = new HashMap<String,Object>(); 
     if(minId !=null) parameterValues.put("minId", minId); 
     if(maxId !=null) parameterValues.put("maxId", maxId); 
     reader.setParameterValues(parameterValues); 
     return reader; 
    } 

    @Bean 
    @StepScope 
    public ItemProcessor<RemittanceVO, RemittanceClaimVO> processor() { 
     return new MatchClaimProcessor(); 
    } 

    @Bean 
    @StepScope 
    public ItemWriter<RemittanceClaimVO> writer() { 
     return new MatchedClaimWriter(); 
    } 

我得到這個錯誤與此代碼這似乎是Long依賴不滿意,

35307 [SimpleAsyncTaskExecutor-6] ERROR - 2016-09-06 12:23:48.692; org.springframework.batch.core.step.AbstractStep; Encountered an error executing step slaveStep in job runPartitionerJob 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'scopedTarget.reader' defined in class path resource [com/hmsy/bp/config/AppConfiguration.class]: Unsatisfied dependency expressed through method 'reader' parameter 0: No qualifying bean of type [java.lang.Long] found for dependency [java.lang.Long]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.Long] found for dependency [java.lang.Long]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:345) 
    at org.springframework.batch.core.scope.StepScope.get(StepScope.java:113) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:340) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:192) 
    at com.sun.proxy.$Proxy62.read(Unknown Source) 
    at org.springframework.batch.item.support.SynchronizedItemStreamReader.read(SynchronizedItemStreamReader.java:55) 
    at sun.reflect.GeneratedMethodAccessor52.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) 
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy59.read(Unknown Source) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:157) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:116) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374) 
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:110) 
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:271) 
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:81) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374) 
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) 
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257) 
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200) 
    at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:139) 
    at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:136) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at org.springframework.core.task.SimpleAsyncTaskExecutor$ConcurrencyThrottlingRunnable.run(SimpleAsyncTaskExecutor.java:268) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.Long] found for dependency [java.lang.Long]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1406) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1057) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019) 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) 
    ... 47 more 
35307 [SimpleAsyncTaskExecutor-11] ERROR - 2016-09-06 12:23:48.692; org.springframework.batch.core.step.AbstractStep; Encountered an error executing step slaveStep in job runPartitionerJob 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'scopedTarget.reader' defined in class path resource [com/hmsy/bp/config/AppConfiguration.class]: Unsatisfied dependency expressed through method 'reader' parameter 0: No qualifying bean of type [java.lang.Long] found for dependency [java.lang.Long]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.Long] found for dependency [java.lang.Long]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:345) 
    at org.springframework.batch.core.scope.StepScope.get(StepScope.java:113) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:340) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:192) 
    at com.sun.proxy.$Proxy62.read(Unknown Source) 
    at org.springframework.batch.item.support.SynchronizedItemStreamReader.read(SynchronizedItemStreamReader.java:55) 
    at sun.reflect.GeneratedMethodAccessor52.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) 
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy59.read(Unknown Source) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:157) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:116) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374) 
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:110) 
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:271) 
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:81) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374) 
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) 
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257) 
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200) 
    at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:139) 
    at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:136) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at org.springframework.core.task.SimpleAsyncTaskExecutor$ConcurrencyThrottlingRunnable.run(SimpleAsyncTaskExecutor.java:268) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.Long] found for dependency [java.lang.Long]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1406) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1057) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019) 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) 
    ... 47 more 

正如this question所做的那樣,我通過了nullmasterStepmasterStep bean已成功創建,嘗試執行masterStep時發生錯誤。

XML代碼沒有任何問題。我只顯示了部分xml。

回答

0

我能夠通過將非同步閱讀器代碼移動到同步裝飾器代碼來解決問題。不知何故,調用&將參數傳遞給來自同步閱讀器的非同步閱讀器不起作用。

@Bean 
    @StepScope 
    public ItemReader<RemittanceVO> syncReader(@Value("#{stepExecutionContext[minId]}") Long minId,@Value("#{stepExecutionContext[maxId]}") Long maxId) throws Exception{ 
     SynchronizedItemStreamReader<RemittanceVO> syncReader = new SynchronizedItemStreamReader<RemittanceVO>(); 
     Map<String,Object> parameterValues = new HashMap<String,Object>(); 
     if(minId !=null && minId.longValue() !=0) parameterValues.put("minId", minId); 
     if(maxId !=null && maxId.longValue() !=0) parameterValues.put("maxId", maxId); 
     JdbcPagingItemReader<RemittanceVO> reader = new JdbcPagingItemReader<RemittanceVO>(); 
     reader.setDataSource(dataSource); 
     reader.setRowMapper(new RemittanceRowMapper()); 
     reader.setQueryProvider(queryProvider); 
     reader.setPageSize(Constants.SPRING_BATCH_READER_PAGE_SIZE); 
     reader.setParameterValues(parameterValues); 
     reader.afterPropertiesSet(); 
     syncReader.setDelegate(reader); 
     return syncReader; 
    } 
+1

您確定要同步閱讀器嗎?這將消除多線程分區步驟的能力。 –

+0

我是批量API的新手,不瞭解大部分細節。在回答我[另一個問題]之一(http://stackoverflow.com/questions/39199182/mark-read-data-as-processing-by-a-table-column-flag-then-restore-at-the - 結束),有人建議使用它,但這不在分區環境中。 –

+0

只要你的讀者在步驟範圍內(它將必須是爲了訪問步驟執行上下文),那麼你將在每個步驟中有一個實例(因此每個線程有一個實例線程)。假設讀者沒有操縱靜態屬性,每個線程有一個實例可以保證你是「線程安全的」。在這種情況下進行同步會大大減緩你的利益而沒有任何好處。 –