Jakarta EE 10 - Jakarta Batch 2.1 変更内容まとめ

blog1.mammb.com


はじめに

Jakarta EE 10 で Jakarta Batch は 2.0 から 2.1 へバージョンアップします。

Spring Batch の流れから策定された Jakarta Batch は、特定のDI技術について、中立的な立場で仕様が定義されていました。

javax.inject.Inject による依存性注入は定義されているものの、その実装については規定せず、すなわち CDI でも、他の依存性注入でも、それは実装次第という立場です。

しかし、CDI をベースとして改定されてきた Jakarta EE に合わせる形で、依存性注入には CDI を規定することで、プラットフォームとしての一貫性と、より良い統合を可能とするように方針が転換されたのが、このバージョンになります。

この方針転換で、実装レベルでは大きく影響するものがあるかも知れませんが、API としての変更はありません。

よって、Jakarta Batch 2.1 仕様の変更としては、一部のJavaDoc と仕様書(並びにTCK)の変更に限られます。

CDI による依存性注入の変更に合わせて、以下に示す変更が入っています。


JobOperator の CDI インジェクションサポート

ランタイムから取得する他、

JobOperator jobOper = BatchRuntime.getJobOperator();

CDI にてインスタンスを取得できるようになります。

@Inject
JobOperator jobOper;

アプリケーション側で、CDI エクステンションなどにより JobOperator CDI Bean を提供している場合は、そちらが優先されます。 つまり、アプリケーション側で JobOperator CDI Bean が提供されない場合に限り、コンテナが JobOperator CDI Bean を提供することになります。


@BatchProperty のメソッドインジェクションサポート

フィールドインジェクションに加え、バッチプロパティのメソッド/コンストラクタ・インジェクションが可能になりました。 このインジェクションも CDI をベースに実現されることになります。

@Inject
public void setMethod1(@BatchProperty(name="m1") String m1) {
    // ...
}

メソッド/コンストラクタ・インジェクションの場合には、(フィールドインジェクションと異なり)プロパティ名を明示する必要が有る点に注意してください。

プロパティ値は、従来通り、JSL(Job Specification Language) に定義されるものです。


@BatchProperty の プリミティブ・ラッパー型への自動変換

旧来は、バッチプロパティの値は、String 型であり、型変換を自身で行う必要がありました。

Jakarta Batch 2.1 からは、プリミティブ・ラッパー型への自動変換が行われるようになりました。 対象の型は BooleanDoubleFloatIntegerLongShort で、 valueOf() を使った型変換が自動で行われます。

以下のようにプリミティブ・ラッパ型で受けることができます。

@Inject
@BatchProperty
private Integer propertyName;


job listeners 要素のプロパティ定義がドキュメント化された

仕様書上で記載されていなかった job listeners 要素のプロパティについて明記されました。

プロパティは以下のように定義します。

 <listener ref="{name}">
  <properties>
   <property name="Property1" value="Property1-Value"/>
  </properties>
 </listener>


JPMS 用 module-info.java の追加

JPMS (Java Platform Module System) 用の module-info.java は以下の定義で追加されています。

module jakarta.batch {

    requires static jakarta.cdi;
    requires transitive static jakarta.inject;

    exports jakarta.batch.api;
    exports jakarta.batch.api.chunk;
    exports jakarta.batch.api.chunk.listener;
    exports jakarta.batch.api.listener;
    exports jakarta.batch.api.partition;
    exports jakarta.batch.operations;
    exports jakarta.batch.runtime;
    exports jakarta.batch.runtime.context;

    uses jakarta.batch.operations.JobOperator;
}