Lift+Quartzでバッチ

Lift+ScalaでもQuartzを使えば、LiftMapperを再利用したジョブスケジューリングができます。手順をメモ。

バッチフレームワークQuartz
http://www.quartz-scheduler.org/

ここではcron形式でジョブ起動します。

■ライブラリ準備

Quartz最新は1.7.0ですが、Mavenレポジトリが1.6.3で止まってるのでとりあえずこちらを使います。

sbtのProjectファイルにこちらを定義して、sbt update

val quartz = "opensymphony" % "quartz" % "1.6.3" % "compile"
val logging = "commons-logging" % "commons-logging" % "1.1.1" % "runtime"
val jta = "javax.transaction" % "jta" % "1.1" % "runtime"
val digester = "commons-digester" % "commons-digester" % "1.8.1" % "runtime"

mvn使うなら、それぞれ<dependency>に読み替えてpom.xmlに追加する。

※TODO: jtaが次期Liftでも採用されるようなので変に干渉したりしないか、あとでチェックする。

■バッチジョブを作る

package myproj.job

import org.quartz._
import myproj.model.Product

class SimpleJob extends Job {
  def execute(context:JobExecutionContext):Unit = {
    val p = Product.findAll.first //Mapperをすぐに使える
    println( p.name )
  }
}

■Quartzの動作環境を準備

web.xmlにQuartzInitializerServletを追加。

<servlet>
  <servlet-name>QuartzInitializer</servlet-name>
  <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
  <init-param>
    <param-name>config-file</param-name>
    <param-value>quartz.properties</param-value>
  </init-param>
  <init-param>
    <param-name>shutdown-on-unload</param-name>
    <param-value>true</param-value>
  </init-param>
  <load-on-startup>2</load-on-startup>
</servlet>

src/main/resourcesに次の2ファイルを追加

■quartz.properies

org.quartz.plugin.jobInitializer.class = \
  org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileNames = jobs.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 360
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=2

その他は、Configuration Reference参照。

■jobs.xml

<?xml version='1.0' encoding='utf-8'?>
<quartz xmlns="http://www.quartz-scheduler.org/JobSchedulingData"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.quartz-scheduler.org/JobSchedulingData
  http://www.quartz-scheduler.org/xml/job_scheduling_data_1_5.xsd"
  version="1.5">
  <job>
    <job-detail>
      <name>SimpleJob</name>
      <group>Jobs</group>
      <description></description>
      <job-class>myproj.job.SimpleJob</job-class>
      </job-detail>
    <trigger>
      <cron>
        <name>Per1Sec</name>
        <group>Triggers</group>
        <job-name>SimpleJob</job-name>
        <job-group>Jobs</job-group>
        <cron-expression>* * * * * ?</cron-expression>
      </cron>
    </trigger>
  </job>
</quartz>

以上で、Servletコンテナを起動すると、毎秒Lift Mapperを使ったバッチジョブを実行します。

Unix cron+バッチプログラムだと、バッチプログラムでLiftをbootしなければならなかったり、もしくは別の機構を使ってプログラムを1から書く必要があるので、Quartz利用の方が既存リソースを再利用できてお手軽です。

但しものすごく頻繁だったり重いバッチ処理は、Webアプリに影響が出てしまうので、別機構でやった方が良いとは思います。


同じカテゴリのエントリ
1.Lift再入門 / 8.javascriptからsubmitできない / 7.Ajax Form / 6.Radio、Checkboxについて / 5.行列型の編集FORM / 4.サーバーサイドバリデーションとサーバサイド関数 / 3.ログインFORM - S.param使ったら負け / 2.Snippetメソッドとして許される型 / sbt0.12.xで依存jar抽出タスク / scala2.10+lift2.5+NetBeans7.2 / Scalaで入門関数プログラミング / reactive-webを試してみました / Lift2.2M1のテンプレート機能 / Scala Compiler Plugin / View Bound/Context Bound / ScalaZa01参加してきました / Akka Frameworkチュートリアルの次 / Akka Frameworkチュートリアルその2 / Akka Frameworkチュートリアル / LiftでJCaptcha / Url Rewrite Filter / sbt-android-plugin / Android SDK for Scala / 祝Lift2.0リリース / Liftの携帯対応まとめ / Scala2.8への移行 / Lift 2.0-scala280-SNAPSHOT/sbt0.7.1 / Scalaお絵かき環境 - Kojo / Lift+Quartzでバッチ / Scala&Liftを採用した理由 / Liftでdate_select系ヘルパーを作る / LiftでAjax / LiftのSubmitかしこい / lift-mapperのpaginateを使う / snippetをspecする / Lift Mapperを拡張する / LiftのDBをMySQLに / Liftプロジェクト環境を整える / Scala本読み比べてみました / NetBeans6.7&scala / じつはScalaはライトな言語 / Scalaバザ~ル / lift1.0所感 / specsを読む / implicit def / ScalaならNetBeansがサイコー / scala勉強会@東北がスタート / それでも俺はLiftをやるってのか / Scala&Liftセットアップ / ブログリニューアル /
コメント

コメントしてください

closed.