05.使用するための準備

概要

Spring Batchを使用できるようにするための準備についてみていきます。

DBの準備

SpringBatchは実行結果や、実行中の状態を保存するためにDBを使用します。

そのスキーマを作成する方法を見ていきます。

【補足】

単体テストをする場合、DBを使用するのは大変です。

テスト時に回避する方法は後で見てみることにします。

スキーマの取得とテーブル作成方法

まず、DBの種類を確認します。(Postgres、Oracleなど)

次に、SpringBatchのjarの中を検索します。

パスは、「/org/springframework/batch/core/」です。

schema-*.sql というファイルが見つかるはずです。

DBの種類名毎に違うファイル名で保存されていますので、目的のDBのファイルを開いてください。

create table文が記述されていますので、これを利用してDBにテーブルを作成してください。

【注意点】

EXIT_MESSAGEなどのカラムは2500バイト分の領域を用意しますが、不足していますので増やした方が良いかもしれません

EXIT_MESSAGEには、例外のスタックトレースを文字列にしてそのまま保存するようです。

スタックトレースはご存知のようにかなり大きな文字数になります。

しかし、DBによっては設定したバイト数を超えるとエラーになってしまうものがあります。

そうするとSpringBatchが例外文字列をDBに保存するときにエラーになって異常終了するという事態が発生します。

※回避方法をTipsに記述しましたので参考にしていただければと思います。

回避方法のTips

以上でDBの準備は終了です。

SpringBatchのSpring上の設定

概要

SpringBatchは状態をDBに保存することを先ほど記述しましたが、DBとアクセスするための設定や、

SpringBatchの基盤に関わるいくつかの設定があります。

設定はSpringのDIのXMLファイルに記述します。

Spring設定ファイルの記述例

【SpringBatch用の基盤に関わる設定の記述例】

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:p="http://www.springframework.org/schema/p"

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.1.xsd

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="jobOperator" class="org.springframework.batch.core.launch.support.SimpleJobOperator"

p:jobLauncher-ref="jobLauncher" p:jobExplorer-ref="jobExplorer"

p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />

<bean id="jobExplorer" class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean"

p:dataSource-ref="dataSource" />

<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />

<bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">

<property name="jobRegistry" ref="jobRegistry"/>

</bean>

<bean id="jobLauncher"

class="org.springframework.batch.core.launch.support.SimpleJobLauncher">

<property name="jobRepository" ref="jobRepository" />

</bean>

<bean id="jobRepository"

class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"

p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"

p:maxVarCharLength="2000"

p:isolationLevelForCreate="ISOLATION_SERIALIZABLE" />

<!-- DB設定 -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="XXX.driver" />

<property name="url" value="jdbc.XXX.url" />

<property name="username" value="XXX" />

<property name="password" value="XXX" />

</bean>

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager" lazy-init="true">

<property name="dataSource" ref="dataSource" />

</bean>

</beans>

※dataSourceと、transactionManagerは、DBの環境に合わせて記述してください。

【各beanの簡単な説明】

JobExecutionクラスの説明は、他の記事を参照ください。

参考: Spring Batchの基本概念(起動と起動オプション)

以上で、基盤に関わる設定は終了です。

SpringBatchのテストにおけるDBの設定

SpringBatchのテストをするときに、DBに接続してもよいのですが、つらいときもあります。

DBには過去の実行結果が溜まっていきますので、一度使用したジョブ名、ジョブパラメタの組み合わせは実行できません。

-nextを使用しても良いですが、これも少し問題があります。(他の基本概念の記事参照)

以下では、いくつか逃げ道を紹介します。

HSQLDBをオンメモリで使用する方法

HSQLDBは、純粋Javaで作成されたフリーのDBです。

メモリ上のみにDBを作成することができます。

ですので、実行が終了すれば溜まった実行結果がクリアされますので、再実行するときもジョブ名、ジョブパラメタを気にする必要がありません。

さらに、DataSourceInitializerクラスと組み合わせると、Springの起動時にcreate tableするということができます。

DataSourceInitializerは、DBのテストのために作成されたApacheライセンスのクラスです。

Springの設定ファイルに記述しておくだけで自動的に指定のSQLファイルを実行します。

以下で具体的に記述例を見ていきましょう。

【DataSourceInitializerクラスがある場所】

SpringBatchのサンプルソースの中に存在しますので、検索してみてください。

見つかりましたら、ファイルをプロジェクトにコピーしてください。

【Spring設定ファイルの記述例】

<!-- テスト用DBの設定(HSQL)プロパティファイルの読み込み -->

<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="location" value="classpath:/test/batch.properties" />

<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />

<property name="ignoreUnresolvablePlaceholders" value="true" />

<property name="order" value="1" />

</bean>

<!-- Initialize the datasource - remove this bean definition for production use! -->

<bean id="dataSourceInitializer" class="test.DataSourceInitializer" destroy-method="destroy">

<property name="dataSource" ref="dataSource"/>

<property name="initScripts">

<list>

<value>classpath:${batch.schema.script}</value>

</list>

</property>

<property name="destroyScripts">

<list>

<value>classpath:${batch.schema.dropscript}</value>

</list>

</property>

</bean>

【プロパティファイルの記述例 (/test/batch.properties)】

# Placeholders batch.*

# for HSQLDB:

batch.jdbc.driver=org.hsqldb.jdbcDriver

batch.jdbc.url=jdbc:hsqldb:mem:testdb;sql.enforce_strict_size=true

batch.jdbc.user=sa

batch.jdbc.password=

batch.schema=

batch.schema.script=org/springframework/batch/core/schema-hsqldb.sql

batch.schema.dropscript=org/springframework/batch/core/schema-drop-hsqldb.sql

これだけです。

これで、Spring起動時にHSQLDBにテーブルを自動作成します。

Spring終了時にdrop tableを実行しますので、JUnitなどで連続で実行する場合は注意が必要です。

タイミングによってはテーブルが削除された後にジョブが実行されてしまうかもしれません。

そのような場合は、destroyScriptsプロパティの設定を削除するか、何かうまくタイミングをとる方法を検討されると良いかと思います。

ちなみにsoracaneのJUnitテストでもこの方法を採用しています。よければ参照してみてください。

オンメモリのリポジトリを使用する方法

これは私はあまり試したことがないのですが、メモリにリポジトリを作成する方法です。

テスト用にSpringBatchが用意している方法です。

具体的にはSpringの設定ファイルに以下のようにjobRepositoryの記述を変更します。

【オンメモリのjobRepositoryの記述例】

<bean id="jobRepository"

class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"

p:transactionManager-ref="transactionManager" />

<!-- ダミー -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource" />

<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

jobRepositoryは、メモリを使用するリポジトリです。

また、dataSourceなどはダミーのクラスを指定しています。

これで動作するはずです。

【注意点】

どうもこの方法はマルチスレッドには対応していないようです。

ですので、SpringBatchで並列処理をしたい場合には向かないようです。

また、テスト用に用意されたクラスですので、本番では使用しないように注意した方が良いようなことを、javadocに記述されていました。

Created Date: 2010/01/12