JBeret JdbcItemWriter / JdbcItemReader example on EE environment
TweetPosted on Sunday Mar 01, 2015 at 12:11AM in JBatch
We need to use non transactional datasource for JdbcItemReader.
JBeret on Java SE with JDBC chunk oriented processing example
TweetPosted 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.
Tags: jbatch
動かしてみる
TweetPosted 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を使って実行中のバッチを止めたり、途中で死んだバッチを再実行したりできます。バッチの実行ごとに採番されます。リロードすると数字がインクリメントされていきます。
Tags: jbatch