第18章 Java バッチアプリケーション開発
JBoss EAP 7 以降、JBoss EAP では JSR-352 で定義された Java バッチアプリケーションがサポートされます。JBoss EAP のバッチサブシステムにより、バッチ設定と監視が行えるようになります。
JBoss EAP でバッチ処理を使用するようアプリケーションを設定するには、必要な依存関係を指定する必要があります。バッチ処理向けの追加の JBoss EAP 機能には、Job Specification Language (JSL) 継承とバッチプロパティーインジェクションが含まれます。
18.1. 必要なバッチ依存関係 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP にバッチアプリケーションをデプロイするには、バッチ処理に必要な追加の依存関係をアプリケーションの pom.xml で宣言する必要があります。必要なこれらの依存関係の例を以下に示します。ほとんどの依存関係は JBoss EAP にすでに含まれているため、スコープは provided に設定されます。
pom.xml のバッチ依存関係の例
<dependencies>
<dependency>
<groupId>org.jboss.spec.javax.batch</groupId>
<artifactId>jboss-batch-api_1.0_spec</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.annotation</groupId>
<artifactId>jboss-annotations-api_1.2_spec</artifactId>
<scope>provided</scope>
</dependency>
<!-- Include your application's other dependencies. -->
...
</dependencies>
18.2. Job Specification Language (JSL) 継承 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP batch-jberet サブシステムの機能を使用すると、Job Specification Language (JSL) 継承を使用してジョブ定義の共通の部分を抽象化できます。JSL 継承は JSR-352 1.0 仕様に含まれていないため、JBoss EAP batch-jberet サブシステムは JSL 継承 v1 ドラフトに基づいて JSL 継承を実装します。継承ルールと制限については、ドラフト版のドキュメントを参照してください。
例: 同じジョブ XML ファイル内の step および flow の継承
親要素 (step や flow など) は、直接的な実行から除外するために属性 abstract="true" でマークされます。子要素には、親要素を参照する parent 属性が含まれます。
<job id="inheritance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
<!-- abstract step and flow -->
<step id="step0" abstract="true">
<batchlet ref="batchlet0"/>
</step>
<flow id="flow0" abstract="true">
<step id="flow0.step1" parent="step0"/>
</flow>
<!-- concrete step and flow -->
<step id="step1" parent="step0" next="flow1"/>
<flow id="flow1" parent="flow0"/>
</job>
例: 別のジョブ XML ファイルからの step の継承
子要素 (step や job など) には以下の属性が含まれます。
-
jsl-name属性。親要素を含むジョブ XML ファイルの名前 (.xml拡張子なし) を指定します。 -
parent属性。jsl-nameで指定されたジョブ XML ファイルの親要素を参照します。
親要素は、直接的な実行から除外するために属性 abstract="true" でマークされます。
chunk-child.xml
<job id="chunk-child" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
<step id="chunk-child-step" parent="chunk-parent-step" jsl-name="chunk-parent">
</step>
</job>
chunk-parent.xml
<job id="chunk-parent" >
<step id="chunk-parent-step" abstract="true">
<chunk checkpoint-policy="item" skip-limit="5" retry-limit="5">
<reader ref="R1"></reader>
<processor ref="P1"></processor>
<writer ref="W1"></writer>
<checkpoint-algorithm ref="parent">
<properties>
<property name="parent" value="parent"></property>
</properties>
</checkpoint-algorithm>
<skippable-exception-classes>
<include class="java.lang.Exception"></include>
<exclude class="java.io.IOException"></exclude>
</skippable-exception-classes>
<retryable-exception-classes>
<include class="java.lang.Exception"></include>
<exclude class="java.io.IOException"></exclude>
</retryable-exception-classes>
<no-rollback-exception-classes>
<include class="java.lang.Exception"></include>
<exclude class="java.io.IOException"></exclude>
</no-rollback-exception-classes>
</chunk>
</step>
</job>
18.3. バッチプロパティーインジェクション リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP batch-jberet サブシステムの機能を使用すると、ジョブ XML ファイルで定義されたプロパティーをバッチアーティファクトクラスのフィールドにインジェクトできます。ジョブ XML ファイルで定義されたプロパティーは @Inject アノテーションと @BatchProperty アノテーションを使用してフィールドにインジェクトできます。
インジェクトフィールドは以下のいずれかの Java タイプになります。
-
java.lang.String -
java.lang.StringBuilder -
java.lang.StringBuffer 以下のいずれかのプリミティブタイプおよびラッパータイプ:
-
boolean、Boolean -
int、Integer -
double、Double -
long、Long -
char、Character -
float、Float -
short、Short -
byte、Byte
-
-
java.math.BigInteger -
java.math.BigDecimal -
java.net.URL -
java.net.URI -
java.io.File -
java.util.jar.JarFile -
java.util.Date -
java.lang.Class -
java.net.Inet4Address -
java.net.Inet6Address -
java.util.List、List<?>、List<String> -
java.util.Set、Set<?>、Set<String> -
java.util.Map、Map<?, ?>、Map<String, String>、Map<String, ?> -
java.util.logging.Logger -
java.util.regex.Pattern -
javax.management.ObjectName
以下のアレイタイプもサポートされています。
-
java.lang.String[] 以下のいずれかのプリミティブタイプおよびラッパータイプ:
-
boolean[]、Boolean[] -
int[]、Integer[] -
double[]、Double[] -
long[]、Long[] -
char[]、Character[] -
float[]、Float[] -
short[]、Short[] -
byte[]、Byte[]
-
-
java.math.BigInteger[] -
java.math.BigDecimal[] -
java.net.URL[] -
java.net.URI[] -
java.io.File[] -
java.util.jar.JarFile[] -
java.util.zip.ZipFile[] -
java.util.Date[] -
java.lang.Class[]
以下に、バッチプロパティーインジェクションの使用例をいくつか示します。
例: 数字を Batchlet クラスにさまざまなタイプとしてインジェクトする
ジョブ XML ファイル
<batchlet ref="myBatchlet">
<properties>
<property name="number" value="10"/>
</properties>
</batchlet>
アーティファクトクラス
@Named
public class MyBatchlet extends AbstractBatchlet {
@Inject
@BatchProperty
int number; // Field name is the same as batch property name.
@Inject
@BatchProperty (name = "number") // Use the name attribute to locate the batch property.
long asLong; // Inject it as a specific data type.
@Inject
@BatchProperty (name = "number")
Double asDouble;
@Inject
@BatchProperty (name = "number")
private String asString;
@Inject
@BatchProperty (name = "number")
BigInteger asBigInteger;
@Inject
@BatchProperty (name = "number")
BigDecimal asBigDecimal;
}
例: 数字シーケンスを Batchlet クラスにさまざまなアレイとしてインジェクトする
ジョブ XML ファイル
<batchlet ref="myBatchlet">
<properties>
<property name="weekDays" value="1,2,3,4,5,6,7"/>
</properties>
</batchlet>
アーティファクトクラス
@Named
public class MyBatchlet extends AbstractBatchlet {
@Inject
@BatchProperty
int[] weekDays; // Array name is the same as batch property name.
@Inject
@BatchProperty (name = "weekDays") // Use the name attribute to locate the batch property.
Integer[] asIntegers; // Inject it as a specific array type.
@Inject
@BatchProperty (name = "weekDays")
String[] asStrings;
@Inject
@BatchProperty (name = "weekDays")
byte[] asBytes;
@Inject
@BatchProperty (name = "weekDays")
BigInteger[] asBigIntegers;
@Inject
@BatchProperty (name = "weekDays")
BigDecimal[] asBigDecimals;
@Inject
@BatchProperty (name = "weekDays")
List asList;
@Inject
@BatchProperty (name = "weekDays")
List<String> asListString;
@Inject
@BatchProperty (name = "weekDays")
Set asSet;
@Inject
@BatchProperty (name = "weekDays")
Set<String> asSetString;
}
例: クラスプロパティーを Batchlet クラスにインジェクトする
ジョブ XML ファイル
<batchlet ref="myBatchlet">
<properties>
<property name="myClass" value="org.jberet.support.io.Person"/>
</properties>
</batchlet>
アーティファクトクラス
@Named
public class MyBatchlet extends AbstractBatchlet {
@Inject
@BatchProperty
private Class myClass;
}
例: プロパティーインジェクション向けにアノテートされたフィールドにデフォルト値を割り当てる
ターゲットバッチプロパティーがジョブ XML ファイルで定義されていない場合は、アーティファクト Java クラスのフィールドにデフォルト値を割り当てることができます。ターゲットプロパティーが有効な値に解決される場合は、その値がそのフィールドにインジェクトされます。解決されない場合は、値がインジェクトされず、デフォルトのフィールド値が使用されます。
アーティファクトクラス
/**
Comment character. If commentChar batch property is not specified in job XML file, use the default value '#'.
*/
@Inject
@BatchProperty
private char commentChar = '#';