バッチフレームワーク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アプリに影響が出てしまうので、別機構でやった方が良いとは思います。