私は2つのステップで構成されるSpring Batchジョブを持っています(これまでのところ)。
ジョブの最初のステップは、タスクレットで実装されます。処理が必要なコンマ区切り値 (CSV) ファイルを取得し (適切なビジネス ロジックを使用してそれらがどれであるかを判断します)、それらを「ドロップ ゾーン」ディレクトリにコピーします。
2 番目のステップは、リーダーとライターを使用して、チャンク指向の処理用に構成されます。リーダーはMultiResourceItemReader
... であり、ドロップ ゾーン ディレクトリ内のすべての CSV ファイルを検索し、それぞれを「実際の」リーダー (CSV を解析する) に委任します。
私の問題は、最初のステップが成功しても、2 番目のステップでドロップ ゾーン ディレクトリに CSV ファイルが見つからないことです。興味深いことに、すぐにバッチ ジョブを再度実行すると、2 番目のステップでファイルが検出されて処理されます。
私は推測していますが、Spring Batch は、2 番目のステップが実行されるまで待つのではなく、最初に 2 番目のステップのワイルドカード パターンを解決するようです。最初のステップで想定されるファイルがコピーされますが、2 番目のステップでそこにファイルがないとすでに判断されています。
私はSpring Batchにかなり慣れていませんが、まだ自分のやり方を学んでいます。ここで見逃している文脈や範囲で明らかなものはありますか? 私のジョブ定義の関連部分を以下に示します。ありがとう!
...
<!-- JOB DEFINITION -->
<job id="notificationJob" xmlns="http://www.springframework.org/schema/batch">
<step id="copyFilesToLocal">
<tasklet transaction-manager="jobRepositoryTransactionManager" ref="getFilesTasklet" />
<next on="COMPLETED" to="processFiles"/>
</step>
<step id="processFiles">
<tasklet transaction-manager="ecommerceTransactionManager">
<chunk reader="multiFileReader" writer="notificationEmailWriter" commit-interval="1" />
</tasklet>
</step>
</job>
<!-- FIRST STEP -->
<bean id="getFilesTasklet" class="com.mypackage.FileMovingTasklet">
<property name="localDao">
<bean class="com.mypackage.BatchLocalDao">
<property name="dataSource" ref="jobRepositoryDataSource" />
</bean>
</property>
<property name="sourceDirectory">
<bean id="sourceDirectory" class="org.springframework.core.io.FileSystemResource">
<constructor-arg value="/mnt/source-directory" />
</bean>
</property>
<property name="destinationDirectory">
<bean id="destinationDirectory" class="org.springframework.core.io.FileSystemResource">
<constructor-arg value="/home/myuser/drop-zone" />
</bean>
</property>
</bean>
<!-- SECOND STEP -->
<bean id="multiFileReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
<property name="resources" value="file://home/myuser/drop-zone/*.csv" />
<property name="delegate" ref="myFileReader" />
</bean>
...