JobRepository の構成
前述のように、JobRepository
は、JobExecution
や StepExecution
など、Spring Batch 内のさまざまな永続化ドメインオブジェクトの基本的な CRUD 操作に使用されます。JobLauncher
、Job
、Step
などの主要なフレームワーク機能の多くで必要とされます。
Java
XML
@EnableBatchProcessing
を使用する場合は、JobRepository
が提供されます。このセクションでは、それをカスタマイズする方法について説明します。次の例に示すように、ジョブリポジトリの構成オプションは、@EnableBatchProcessing
アノテーションの属性を通じて指定できます。
@Configuration
@EnableBatchProcessing(
dataSourceRef = "batchDataSource",
transactionManagerRef = "batchTransactionManager",
tablePrefix = "BATCH_",
maxVarCharLength = 1000,
isolationLevelForCreate = "SERIALIZABLE")
public class MyJobConfiguration {
// job definition
}
ここにリストされている構成オプションはどれも必要ありません。設定されていない場合は、前に示したデフォルトが使用されます。varchar
の最大長は、デフォルトで 2500
になります。これは、サンプルスキーマスクリプト内の長い VARCHAR
列の長さです。
バッチ名前空間は、JobRepository
実装とその協力者の実装の詳細の多くを抽象化します。ただし、次の例に示すように、使用可能な構成オプションがまだいくつかあります。
<job-repository id="jobRepository"
data-source="dataSource"
transaction-manager="transactionManager"
isolation-level-for-create="SERIALIZABLE"
table-prefix="BATCH_"
max-varchar-length="1000"/>
id
以外には、前にリストした構成オプションはどれも必要ありません。設定されていない場合は、前に示したデフォルトが使用されます。max-varchar-length
のデフォルトは 2500
で、これはサンプルスキーマスクリプトの長い VARCHAR
列の長さです。
JobRepository のトランザクション構成
名前空間または提供された FactoryBean
が使用される場合、トランザクションに関するアドバイスがリポジトリの周囲に自動的に作成されます。これは、障害後の再起動に必要な状態を含むバッチメタデータが正しく保持されるようにするためです。リポジトリメソッドがトランザクション対応でない場合、フレームワークの動作は明確に定義されていません。create*
メソッド属性の分離レベルは、ジョブの起動時に 2 つのプロセスが同時に同じジョブを起動しようとしても、1 つのみが成功するように個別に指定されます。そのメソッドのデフォルトの分離レベルは SERIALIZABLE
で、これは非常に積極的です。通常、READ_COMMITTED
も同様に機能します。READ_UNCOMMITTED
は、2 つのプロセスがこのように衝突する可能性が低い場合には問題ありません。ただし、create*
メソッドの呼び出しは非常に短いため、データベースプラットフォームがサポートしている限り、SERIALIZED
が問題を引き起こす可能性はほとんどありません。ただし、この設定をオーバーライドできます。
Java
XML
次の例は、Java で分離レベルをオーバーライドする方法を示しています。
@Configuration
@EnableBatchProcessing(isolationLevelForCreate = "ISOLATION_REPEATABLE_READ")
public class MyJobConfiguration {
// job definition
}
次の例は、XML の分離レベルをオーバーライドする方法を示しています。
<job-repository id="jobRepository"
isolation-level-for-create="REPEATABLE_READ" />
名前空間を使用しない場合は、AOP を使用してリポジトリのトランザクション動作も構成する必要があります。
Java
XML
次の例は、Java でリポジトリのトランザクション動作を構成する方法を示しています。
@Bean
public TransactionProxyFactoryBean baseProxy() {
TransactionProxyFactoryBean transactionProxyFactoryBean = new TransactionProxyFactoryBean();
Properties transactionAttributes = new Properties();
transactionAttributes.setProperty("*", "PROPAGATION_REQUIRED");
transactionProxyFactoryBean.setTransactionAttributes(transactionAttributes);
transactionProxyFactoryBean.setTarget(jobRepository());
transactionProxyFactoryBean.setTransactionManager(transactionManager());
return transactionProxyFactoryBean;
}
次の例は、XML でリポジトリのトランザクション動作を構成する方法を示しています。
<aop:config>
<aop:advisor
pointcut="execution(* org.springframework.batch.core..*Repository+.*(..))"/>
<advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
前のフラグメントをほとんど変更せずに、ほぼそのまま使用できます。また、適切な名前空間宣言を含め、spring-tx
と spring-aop
(または Spring 全体) がクラスパスにあることを確認してください。
テーブルプレフィックスの変更
JobRepository
のもう 1 つの変更可能なプロパティは、メタデータテーブルのテーブルプレフィックスです。デフォルトでは、それらはすべて BATCH_
で始まります。BATCH_JOB_EXECUTION
と BATCH_STEP_EXECUTION
は 2 つの例です。ただし、このプレフィックスを変更する理由が考えられます。スキーマ名をテーブル名の前に追加する必要がある場合、または同じスキーマ内に複数のメタデータテーブルのセットが必要な場合は、テーブルのプレフィックスを変更する必要があります。
Java
XML
次の例は、Java でテーブルプレフィックスを変更する方法を示しています。
@Configuration
@EnableBatchProcessing(tablePrefix = "SYSTEM.TEST_")
public class MyJobConfiguration {
// job definition
}
次の例は、XML でテーブルプレフィックスを変更する方法を示しています。
<job-repository id="jobRepository"
table-prefix="SYSTEM.TEST_" />
上記の変更により、メタデータテーブルへのすべてのクエリには SYSTEM.TEST_
というプレフィックスが付きます。BATCH_JOB_EXECUTION
は SYSTEM.TEST_JOB_EXECUTION
と呼ばれます。
テーブルプレフィックスのみが設定可能です。テーブル名と列名は違います。 |
リポジトリ内の非標準データベース型
サポートされているプラットフォームのリストにないデータベースプラットフォームを使用する場合、SQL バリアントが十分に近い場合は、サポートされている型のいずれかを使用できる場合があります。これを行うには、名前空間のショートカットの代わりに生の JobRepositoryFactoryBean
を使用し、それを使用してデータベースの種類を最も近いものに設定します。
Java
XML
次の例は、JobRepositoryFactoryBean
を使用してデータベース型を Java で最も近いものに設定する方法を示しています。
@Bean
public JobRepository jobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setDatabaseType("db2");
factory.setTransactionManager(transactionManager);
return factory.getObject();
}
次の例は、JobRepositoryFactoryBean
を使用してデータベース型を XML で最も一致するものに設定する方法を示しています。
<bean id="jobRepository" class="org...JobRepositoryFactoryBean">
<property name="databaseType" value="db2"/>
<property name="dataSource" ref="dataSource"/>
</bean>
データベース型が指定されていない場合、JobRepositoryFactoryBean
は DataSource
からデータベース型を自動検出しようとします。プラットフォーム間の主な違いは、主に主キーをインクリメントする戦略によって説明されるため、(Spring Framework の標準実装の 1 つを使用して) incrementerFactory
もオーバーライドする必要があることがよくあります。
それでもうまくいかない場合、または RDBMS を使用していない場合、唯一のオプションは、SimpleJobRepository
が依存するさまざまな Dao
インターフェースを実装し、通常の Spring 方法で手動で接続することです。