10.並行処理(split)のサンプル
概要
並行処理の概要にて紹介したsplitのサンプルをもう少し見て行きます。
splitの内容自体は概要で説明していますので、ここでは軽くサンプルを見て行くことにします。
目標
まず、以下のサンプルの目標(ゴール)を示します。
ここでは、だいたいの雰囲気をつかむため、itemReaderなどのbean定義は省略します。
ゴールは以下のように処理をすることです。
①並行処理(split)で、次の2つを同時に行います。
・ファイルから必要なフィールドのみを取り出して他のファイル1に書き込みます(fileItemReader, fileItemWriter)。
・DBから必要なフィールドのみをSQLで取り出してファイル2に書き込みます(dbItemReader, fileItemWriter)。
②①で得られたファイル2つを1つのファイルに書き込みます。
2つのファイルをつながった1つファイルのように扱うItemReaderがありますので、それを利用する想定です。
MultiResourceItemReaderがそれにあたります。
使用サンプル
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:/back-context.xml"/>
<job id="splitJob" xmlns="http://www.springframework.org/schema/batch"
incrementer="jobParametersIncrementer">
<split id="split1" task-executor="taskExecutor" next="step3" >
<flow>
<step id="step1">
<tasklet>
<chunk reader="fileItemReader" writer="fileItemWriter" commit-interval="1" />
</tasklet>
</step>
</flow>
<flow>
<step id="step2">
<tasklet>
<chunk reader="dbItemReader" writer="fileItemWriter" commit-interval="1" />
</tasklet>
</step>
</flow>
</split>
<step id="step3" >
<tasklet>
<chunk reader="multiResourceItemReader" writer="fileItemWriter" commit-interval="1" />
</tasklet>
</step>
</job>
<!-- enables the functionality of JobOperator.startNextInstance(jobName) -->
<bean id="jobParametersIncrementer" class="org.springframework.batch.core.launch.support.RunIdIncrementer" />
<!-- 非同期処理タスクExecutor -->
<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
<bean id="fileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" >
・・・
</bean>
<bean id="fileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
・・・
</bean>
<bean id="dbReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
・・・
</bean>
<bean id="multiResourceItemReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
・・・
</bean>
</beans>
splitタグを使用すると、flowタグの数だけスレッドを生成し、同時に実行します。
ただし、splitタグには、TaskExecutorを設定する必要があります。
このTaskExecutorの派生クラスには、非同期用のクラスと、同期用のクラスがありますので、
もし、同期用クラスを設定してしまうとスレッドも作られませんし、同時実行もされないことに注意ください。
splitは普通のstepと同様にnext属性を持っています。
また、複数のflowの内、一つでも失敗するとsplitが失敗します。
そして、flow内には複数のstepを記述でき、step1つにつき1つのStepExecutionが作成されるため、
step毎に実行結果やどこまでcommitされたかが保存されます。
ですので、restartも問題なく、うまく行きます。
最後に
splitを使用すると並行処理が簡単に実装できます。
並行に処理する内容が同一の場合にも使用可能ですが、設定の記述が多くなるので、
その場合には次に見るpartitionの機能を使用したほうがいいと思います。
Created Date: 2010/01/12