第17章 Java バッチアプリケーション開発
JBoss EAP 7 以降、JBoss EAP では JSR-352 で定義された Java バッチアプリケーションがサポートされます。JBoss EAP の batch-jberet
サブシステムにより、バッチ設定と監視が行えるようになります。
JBoss EAP でバッチ処理を使用するようアプリケーションを設定するには、必要な依存関係を指定する必要があります。バッチ処理向けの追加の JBoss EAP 機能には、Job Specification Language (JSL) 継承とバッチプロパティーインジェクションが含まれます。
17.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>
17.2. Job Specification Language (JSL) 継承
JBoss EAP batch-jberet
サブシステムの機能を使用すると、Job Specification Language (JSL) 継承を使用してジョブ定義の共通の部分を抽象化できます。JSL 継承は JSR-352 1.0 仕様に含まれていないため、JBoss EAP batch-jberet
サブシステムは JSL Inheritance 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 や 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>
17.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 クラスにさまざまなタイプとしてインジェクトする
例: Job 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 クラスにさまざまなアレイとしてインジェクトする
例: Job 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 クラスにインジェクトする
例: Job 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 = '#';