しおしお

IntelliJ IDEAのことなんかを書いてます

JBeretでジョブ定義ファイルの置き場所を変えてみる

JBeretでは、org.jberet.spi.JobXmlResolverの実装クラスを作ることで、ジョブ定義のXMLファイルの置き場所を変更できる。

JobXmlResolverの実装クラスを作る

JobXmlResolverJavadocによると、resolveJobXml以外は任意となっているので、
任意メソッドの空実装を持っているAbstractJobXmlResolverを実装するとよい。

実装としては、こんな感じになる。この実装では、環境変数から取得したディレクトリの中からジョブ定義を探して返しています。
ファイルがない場合にnullを返しているので、この場合はデフォルトの実装(META-INF/batch-jobs配下から探すやつ)が動きます。

import org.jberet.tools.*
import java.io.*
import java.nio.file.*

class FileSystemBasedJobXmlResolver : AbstractJobXmlResolver() {

  override fun resolveJobXml(jobXml: String, classLoader: ClassLoader): InputStream? {
    val dir = System.getenv("jobxml-dir")
    val jobXmlFilePath = Paths.get(dir, jobXml)
    println("jobXmlFilePath = ${jobXmlFilePath}")
    return if (Files.isReadable(jobXmlFilePath)) {
      FileInputStream(jobXmlFilePath.toFile())
    } else {した
      null
    }
  }
}

プロバイダ構成ファイルを作る

ファイル名は、org.jberet.spi.JobXmlResolverで、resources/META-INF/servicesの下においてあげます。
ファイルの中には、JobXmlResolverを実装したクラスのクラス名を設定します。

動かしてみる

動作確認するためのBatchlet

ステップ名を出力するだけの簡単な実装です。

@Named
@Dependent
class TestBatchlet @Inject constructor(
    private val stepContext: StepContext
) : AbstractBatchlet() {

  override fun process(): String {
    println("stepContext.stepName = ${stepContext.stepName}")
    return "ok"
  }
}
ジョブ定義のXML

確認用のBatchletを実行するステップを定義する

<job id="test" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
  <step id="myStep">
    <batchlet ref="testBatchlet" />
  </step>
</job>
実行してみる

IntelliJさんで、こんな感じに実行構成を定義します。環境変数には、ジョブ定義フィルをおいてあるディレクトリを指定する。

実行結果はこんな感じになります。
自分で作ったクラスが呼び出されているのがわかります。

jobXmlFilePath = /home/siosio/test.xml
stepContext.stepName = myStep