Java
JobScheduler

JobSchedulerでJava APIを利用するジョブの実装方法

More than 1 year has passed since last update.

JobSchedulerはジョブの処理内容を様々な言語で実装できます。多くはshellで記載し、簡易に実装しますが、shellだと、JobSchedulerの内部APIの呼び出しが出来ない等少し凝ったことをするには不便だったりします。
そんなケースに対して、本記事では、Javaで実装する方法を紹介します。

Javaのクラス実装

※動作確認はJobScheduler v1.11.3で実施。その他バージョンでは稼働しない可能性ありです。

以下のように
sos.spoolerパッケージ内のJob_implクラスを継承し、Javaのクラスを実装します。

SimpleJobApiExample.java
package sample.test;
import sos.spooler.*;

public class SimpleJobApiExample extends Job_impl {

    @Override
    public boolean spooler_process() throws Exception {
        spooler_log.info("Hello world!");
        return false;
    }
}

利用できるパッケージ・クラスについてはドキュメント参照。
http://www.sos-berlin.com/doc/doxygen-docs/SOSJobSchedulerModel/html/index.html

コンパイル&jarファイル作成

作成した上で、以下のようにコンパイル。

sample/test/SimpleJobApiExample.java
に対して

$ cd sample/test
$ javac -classpath .:/opt/sos-berlin.com/jobscheduler/scheduler/lib/sos/com.sos-berlin.jobscheduler.engine-1.11.3.jar SimpleJobApiExample.java

Manifest.txt作成

$ cd ../../
$ vim Manifest.txt
Manifest-Vwersion: 1.0
Main-Class: sample.test.SimpleJobApiExample
Class-Path: /opt/sos-berlin.com/jobscheduler/scheduler/lib/sos/*

jarファイル作成

$ jar cvfm SimpleJobApiExample.jar Manifest.txt sample/test/*.class

クラスパスにjarファイル配置

上記で作成したjarファイルをJobSchedulerが認識可能なクラスパスに配置する。

JobScheduler Masterが読込先として認識しているクラスパスはfactory.iniに記載されている[java]カテゴリ内の
以下の設定。

[java]
class_path              = ${SCHEDULER_HOME}/lib/pgsql/*.jar:${SCHEDULER_HOME}/lib/patches/*.jar:${SCHEDULER_HOME}/lib/user_lib/*.jar:${SCHEDULER_HOME}/lib/sos/*.jar:${SCHEDULER_HOME}/lib/3rd-party/*.jar:${SCHEDULER_HOME}/lib/jdbc/*.jar:${SCHEDULER_DATA}/config:${SCHEDULER_HOME}/lib/log/log4j/*.jar

上記デフォルトと異なる箇所に配置したければ上記設定の変更が必要。
変更の必要なければ以下に配置するのが適切。

/opt/sos-berlin.com/jobscheduler/scheduler/lib/user_lib/配下

$ cp SimpleJobApiExample.jar /opt/sos-berlin.com/jobscheduler/scheduler/lib/user_lib

JobScheduler Masterを複数台クラスタ組んでいる場合には全Masterサーバ上のクラスパスフォルダに配置する。
※なお、Agent上で実行させるJavaクラスであればJobScheduler Agentが読み込めるクラスパス設定フォルダ上に配置する必要がある。

ジョブ定義実装

上記の通りjarファイルを配置した状態で以下の通りジョブを実装する。

<job title="Simple Java API Job" order="no">
<script language="Java" java_class_path="/opt/sos-berlin.com/jobscheduler/scheduler/lib/user_lib" java_class="sample.test.SimpleJobApiExample"/>
<run_time/>
</job>

上記の設定により、sample.test.SimpleJobApiExampleクラスが呼び出され、
クラス内に実装されているspooler_process()等の処理が自動実行される。
JobScheduler Masterのデフォルトのクラスパスと異なるところに配置したい場合には、java_class_path設定を以下のように追記すれば良い。

<job title="Simple Java API Job" order="no">
<script language="Java" java_class_path="/hoge/lib/*.jar" java_class="sample.test.SimpleJobApiExample"/>
<run_time/>
</job>

ただし、上記のjava_class_pathは既存のJobScheduler Masterのclass_path設定に追加して探索するフォルダを指定する形となるので、
同一名称のものがJobScheduler Masterのclass_pathに配置されている場合はそちらが優先して読み込まれるので注意する必要がある。