2017-11-29 69 views
1

私は、100レコードを持つCSVファイルを読み込み、10レコードのバッチで一度に処理しようとしていました。すべてが正常に動作しているが、すべてのレコードを処理した後、私はSpringバッチでNonTransientFlatFileExceptionが発生しました

org.springframework.batch.item.file.NonTransientFlatFileException取得しています:リソースから読み込むことができません :[クラスパスリソース [CSV /入力/ VMwareImportを.csv]]根本的な原因が org.springframework.batch.core.JobExecutionException:パーティション ハンドラが失敗したステップを返しました。以下は

私の仕事のxmlです:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:batch="http://www.springframework.org/schema/batch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/batch 
    http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 

<import resource="../config/context.xml" /> 

<bean id="report" class="com.abc.model.VMware" scope="prototype" /> 
<bean id="itemProcessor" class="com.abc.CustomItemProcessor" scope="step"> 
    <property name="threadName" value="#{stepExecutionContext[name]}" /> 
</bean> 

<batch:job id="vmImport"> 
    <batch:step id="step1"> 
     <partition step="slave" partitioner="rangePartitioner"> 
      <handler grid-size="10" task-executor="taskExecutor" /> 
     </partition> 
    </batch:step> 
</batch:job> 

<batch:step id="slave"> 
    <batch:tasklet> 
     <batch:chunk reader="cvsFileItemReader" writer="xmlItemWriter" 
      processor="itemProcessor" commit-interval="10" /> 
    </batch:tasklet> 
</batch:step> 

<bean id="rangePartitioner" class="com.abc.partition.RangePartitioner" /> 

<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" /> 



<bean id="cvsFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"> 

    <property name="resource" value="classpath:csv/input/VMwareImport.csv" /> 

    <property name="lineMapper"> 
     <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
      <property name="lineTokenizer"> 
       <bean 
        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
        <property name="names" value="SubscriptionId,TemplateName,ResourcePool,CpuCount,MemorySize,Network,DiskSize, 
                StorageCluster,DHCP,StaticIP,Subnet,Gateway,DNS1,DNS2, 
                DtapTag,FinTag,TechTag,TshirtTag,BackupTag " /> 
       </bean> 
      </property> 
      <property name="fieldSetMapper"> 
       <bean class="com.abc.VMwareFieldSetMapper" /> 

       <!-- if no data type conversion, use BeanWrapperFieldSetMapper to map 
        by name <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> 
        <property name="prototypeBeanName" value="report" /> </bean> --> 
      </property> 
     </bean> 
    </property> 

</bean> 

<!-- <bean id="cvsFileItemReader" class="com.abc.VMwareReaderFromFile" scope="step"> 
    <constructor-arg value="classpath:csv/input/VMwareImport.csv" /> 
</bean> --> 

<bean id="xmlItemWriter" class="com.abc.DummyWriter"> 
    <!-- <property name="resource" value="file:xml/outputs/report.xml" /> <property 
     name="marshaller" ref="reportMarshaller" /> <property name="rootTagName" 
     value="report" /> --> 
</bean> 

<!-- <bean id="reportMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="classesToBeBound"> <list> <value>com.abc.model.VMware</value> 
    </list> </property> </bean> --> 

完全な例外のStackTrace:

org.springframework.batch.item.file.NonTransientFlatFileException: Unable to read from resource: [class path resource [csv/input/VMwareImport.csv]] 
    at org.springframework.batch.item.file.FlatFileItemReader.readLine(FlatFileItemReader.java:220) 
    at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:173) 
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:83) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:155) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:114) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368) 
    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:108) 
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:395) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267) 
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368) 
    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:253) 
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) 
    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(FutureTask.java:262) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: java.io.IOException: Stream closed 
    at java.io.BufferedReader.ensureOpen(BufferedReader.java:115) 
    at java.io.BufferedReader.readLine(BufferedReader.java:310) 
    at java.io.BufferedReader.readLine(BufferedReader.java:382) 
    at org.springframework.batch.item.file.FlatFileItemReader.readLine(FlatFileItemReader.java:201) 
    ... 23 more 

SEVERE: Encountered an error executing the step 
org.springframework.batch.core.JobExecutionException: Partition handler returned an unsuccessful step 
    at org.springframework.batch.core.partition.support.PartitionStep.doExecute(PartitionStep.java:111) 
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) 
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:137) 
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64) 
    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:152) 
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:131) 
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) 
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301) 
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134) 
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49) 
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:127) 
    at com.fujitsu.App.main(App.java:27) 
+0

完全なスタックトレースを提供します。これは不完全な情報です。 –

+0

私は編集しました。チェックしてください。 –

+0

どこかに行が並んでいて、並行性の問題があるようです。あなたは何でパーティーしていますか? 'FlatFileItemReader'はスレッドセーフではなく、競合する可能性があります。あなたのパーティショニングに関する詳細が必要です。また、今日の時点では、XML設定を記述するのではなく、Java Configurationsを使用することをお勧めします。 –

答えて

0

あなたcvsFileItemReaderはステップがスコープする必要があります。いずれのパーティションでも最初に終了したストリームは、他のパーティションで読み続けることができないようにストリームを閉じることです。

関連する問題