目的
Java BatchアプリケーションをLibertyでためします。
Batchlet
AbstractBatchlet を ExtendsしたJob実行のクラスを用意します。
package pdprof.javabatch;
import javax.batch.api.AbstractBatchlet;
import javax.batch.api.BatchProperty;
import javax.inject.Inject;
public class PdprofBatchlet extends AbstractBatchlet {
@Inject
@BatchProperty(name="message")
String message_property;
private final String message_default = "Hello!!";
@Override
public String process() throws Exception {
String message = "The message is from default : " + message_default;
if (message_property != null) {
message = "The message is from property : " + message_property;
}
System.out.println(message);
return message;
}
@Override
public void stop() throws Exception {
System.out.println("= PdprofBatchlet stop is called");
}
}
BatchPropertyとして message を受け取ります。
Job.xml
BatchJobを定義する xml を用意します。META-INF/batch-jobs/[jobXMLname].xml で配置します。[jobXMLname] は Jobを開始するときに使う名前です。
<?xml version="1.0" encoding="UTF-8"?>
<job id="pdprof-job" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="1.0">
<step id="PdprofStep">
<batchlet ref="pdprof.javabatch.PdprofBatchlet">
<properties>
<property name="message" value="#{jobParameters['message']}" />
</properties>
</batchlet>
</step>
</job>
batchlet ref= で Batchletのクラス名が指定されます。property name は BatchProperty name と関連付けられます。XML中の jobParameters['message'] は Jobを開始するときに渡す PropertiesのKey=message です。そのValueを propertyのname で指定されたものの値とします。
JobをStartするサーブレット
以下のようなコードでJobを開始します。
package pdprof.javabatch;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;
import javax.batch.operations.JobOperator;
import javax.batch.runtime.BatchRuntime;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class PdprofStartBatchServlet
*/
@WebServlet("/startbatch")
public class PdprofStartBatchServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public PdprofStartBatchServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
JobOperator jobOperator = BatchRuntime.getJobOperator();
Properties props = new Properties();
props.put("message", "Servlet Hello!!!");
Long jobIdX = jobOperator.start("PdprofBatchlet", props);
Long jobIdY = jobOperator.start("PdprofBatchlet", null);
PrintWriter out = response.getWriter();
out.println("Job ID : " + jobIdX + " started with props");
out.println("Job ID : " + jobIdY + " started without props");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
ここで、props.put("message", "...") が jobParameters の message と関連付けられ、jobOperator.start("PdprofBatchlet") が PdprofBatchlet.xml のファイル名(拡張子除く)に関連付けられます。
これでJobに関連するクラスとXMLが用意でき、その関連付け方が分かりました。これらのファイルをWARとして用意すると実行できます。
Libertyテスト環境の自動構築
自分でWARファイルにパッケージできれば動作させられますが、環境をdockerで用意する方法です。
用意したGitレポジトリをクローンします。
git clone https://github.com/pdprof/java-batch.git
cd java-batch/java-batch-docker/
Libertyのイメージをビルドして開始します。
./setup-docker.sh
./start.sh
起動したら以下にアクセスします。
Propertiesの指定あり、なしでJobが開始されます。Jobを開始するサンプルの実行ができたので、これを元にテストしたい処理を追加します。
Job Persistence RepositoryにDBを使う
で使用しているDBやDataSourceを使うなどして構成します。
を参考にします。DefaultDataSourceを構成すると良いので、DriverやLibraryの構成はそのまま使用して以下を追加します。Db2の例です。
<dataSource id="DefaultDataSource" jdbcDriverRef="Db2Driver">
<properties.db2.jcc databaseName="PDPROF"
serverName="localhost" portNumber="50000"
user="db2inst1" password="passw0rd"/>
</dataSource>
トラブルシューティング
毎度のことですが、よくつかう dockerコマンドを書いておきます。この文書でもpodman, dockerとまとまりがないですが、Linux では dockerがpodmanを呼び出すようになっていました。
docker ps # 動作中のContainer確認
docker logs -f java-batch # ログ確認
docker restart java-batch # 再起動
docker inspect java-batch # container 確認
docker exec -it java-batch bash # Container内状況確認
まとめ
LibertyでJava Batchアプリケーションをテストしました。
