CLIからリモートEJB経由でジョブを操作してみる
TweetPosted on Monday Feb 10, 2014 at 06:44PM in Technology
JAX-RSなどを使ってREST APIを作る方が良いのだろうと思われるが、大変なのでリモートEJB経由でやってみる。さらにコマンドラインから叩きたいので、シェルスクリプトから蹴れるように少し作り込んでみる
WildFly - リモートEJB呼び出しを使ってみる を併せて読むと多少参考になるかも
環境
- WildFly8.0.0.CR1
- Oracle JDK7u51
- OS X 10.9.1
準備
プロジェクトを作る
下の3つを作る。ソースはGitHubに置いた
- JSR352APIのSerializableなJavaBeansを含むプロジェクト(jbatchif)
- リモートEJBとバッチの実装を含むプロジェクト(jbatch)
- クライアント側プロジェクト(jbatchcli)
JSR352APIのSerializableなJavaBeansを含むプロジェクト(jbatchif)
SimpleJobInstanceImpl.java, SimpleJobExecutionImpl.java, SimpleStepExecutionImpl.java, SimpleMetricImpl.java
JobInstance, JobExecution, StepExecution, MetricインタフェースのSerializableな実装。WildFlyのJSR352実装のこれらのクラスをそのまま使うとNotSerializableExceptionが出てしまうのでしかたなく作った(org.jberet.runtime.metric.StepMetricsが非Serializableらしい)。リモートEJB側とクライアント側の両方で使うので切り出しておく。フィールドとアクセサしかないただのJavaBeans。
リモートEJBとバッチの実装を含むプロジェクト(jbatch)
MyJobOperatorImpl.java
こいつをリモートEJB経由で呼び出す。throws宣言が若干気になるけど面倒なのでそのままにしておく
TestBatchlet.java, job001.xml
動かしてみる で使ったのと同じ
クライアント側プロジェクト(jbatchcli)
Main.java
メインクラス。引数でリモートEJBのJNDI名、ジョブ名、ジョブパラメータを受け取る。細かい処理はprocessorパッケージの下のクラスにやらせる。Commons CLIとか使って作り込んだ方がいいんだろうけど、現状ではかなり適当。
config.sh
シェルスクリプトの環境依存っぽいところを外だししてある
jbatch.sh
javaコマンドをたたくところ
jndi.properties
リモートEJBのlookupに必要な設定をする。ここを適当に書き換えればWildFly以外のAPサーバでもいけるはず
logging.properties
JBossのEJB呼び出し用ライブラリがデバッグ的な文言をINFOレベルで出力してくるのでログレベル上げて出ないようにしとく
デプロイする
CLIから叩く前にjbatchプロジェクトをデプロイする
CLIから叩いてみる
ジョブ一覧を表示してみる
kyle-no-MacBook:resources kyle$ ./jbatch.sh list-job-names Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 jobNames: [job001] kyle-no-MacBook:resources kyle$
jbatchランタイムに認識されたジョブXMLの一覧的なのが出る。job001しかないので1つだけだけど。
ジョブを起動してみる
kyle-no-MacBook:resources kyle$ ./jbatch.sh start job001 Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 executionId: 63 kyle-no-MacBook:resources kyle$
普通に動いている。WildFly側にもログが出てる。こんな感じ
まだジョブXML一覧と起動のところしか作ってない。停止とか再実行とかexecutionIdから情報見るとかはそのうち作り込む。
何故かなかなかjavaプロセスが終了しないことがあるのが気になる。1分位待ってると終わるんだけど。
参考文献
Tags: jbatch