Kohei Nozaki's blog 

JBeret on Java SE with JDBC chunk oriented processing example


Posted on Saturday Feb 28, 2015 at 09:58PM in JBatch


I pushed an example to https://github.com/lbtc-xxx/jberet-se-example . but it looks like not comfortable due to lack of automatic injection mechanism or transaction management that available in EE environment. I guess some better approach might be exists but I don’t know yet. if you know any better way please let me know.


動かしてみる


Posted on Tuesday Jan 21, 2014 at 06:40AM in JBatch


jbatch(JSR352)とはJavaEE7から入ったバッチフレームワークの規格です。WildFly8ではGlassFish4とは別の実装が使われています。すごく簡単なのをWildFly8で動かしてみます。

環境

  • WildFly 8.0.0CR1
  • Eclipse等々はここで設定した状態

CDIの設定をする

プロジェクトの設定を開いてProject Facetsを選びCDIにチェックを入れてOKを押します。

ジョブXMLファイルを作る

ジョブを起動すると、まずこのXMLファイルがロードされます。JSR352ではアプリ開発者はこのXMLファイルとartifactと呼ばれるクラス群を作る必要があります。まずXMLファイルが読まれ、ここに書かれた通りにartifactが呼び出されます。

作る場所はこのへん.画像では/src/main/javaの下になっていますが,XMLファイル等のJavaソース以外のものは/src/main/resourcesに置くのが望ましいです.war内の位置で言うとclasses/META-INFの下になります。このファイルの名前がバッチの名前になります。

内容はとりあえずこんな感じ。
<?xml version="1.0" encoding="UTF-8"?>
<job id="job001" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
	<step id="step001">
		<batchlet ref="testBatchlet"/>
	</step>
</job>

Batchletを作る

Batchletは簡単な処理を書くときに使います。バルク処理とかをやるときは、ここで紹介するBatchletではなく、chunk方式と呼ばれるartifactを使ったほうがよいです。作るクラス1つだけで簡単なのでここではBatchletを作ります。XMLファイルとartifactはCDIの名前でひも付けるので、作る場所はどこでも良いです。

package com.example;

import javax.batch.api.AbstractBatchlet;
import javax.inject.Named;

@Named
public class TestBatchlet extends AbstractBatchlet{

	@Override
	public String process() throws Exception {
		System.out.println("Hello JSR352");
		return "SUCCESS";
	}
}

Servletを作る

バッチを動かす際の起点にします。ブラウザでServletにGETを飛ばすとバッチが動き出す感じです。定時実行とかスケジュール実行がしたければEJBタイマでやることもできます。

package com.example;

import java.io.IOException;
import java.util.Properties;

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;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		long executionId = BatchRuntime.getJobOperator().start("job001", new Properties());
		response.getWriter().write("execution id: " + executionId);
	}
}

動かしてみる

デプロイしたらブラウザでアクセスしてみましょう

動いているようです。それっぽいログも出ています

ジョブを実行するとDB等にかなり詳細な履歴が残せるのですが、WildFly8のデフォルトではインメモリデータベースに格納されるだけになっているようで、後から参照する方法とかは少し調べましたが不明です。DBに残すようにする設定の方法はまた別途調べる予定。

JobOperator#start()で返るのはexecutionIdといって、このIDを使って実行中のバッチを止めたり、途中で死んだバッチを再実行したりできます。バッチの実行ごとに採番されます。リロードすると数字がインクリメントされていきます。