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