2009年12月22日火曜日

Quartzプラグインで予約と取消


grails create-app quartz-app
cd quartz-app
grails install-plugin quartz
grails create-job sample
grails create-controller schedule


やりたいのは任意のタイミングで実行するジョブの予約と取消。
grails-app/jobs/SampleJob.groovy

class SampleJob {
static triggers = {
}
def execute(context) {
println "execute: $context"
}
}

空のtriggersを定義しないとデフォルトで1分ごとに設定されるので注意。

grails-app/jobs/ScheduleController.groovy

class ScheduleController {

def index = { }

def jobManagerService

// 5秒後にSampleJobを実行するように予約する。
def schedule = {
def scheduleDate = new Date()
use(org.codehaus.groovy.runtime.TimeCategory) {
scheduleDate += 5.second
}
def trigger = new org.quartz.SimpleTrigger('myTriggerName', "myTriggerGroup", scheduleDate)
try {
SampleJob.schedule(trigger) // 返却値はscheduleDate
flash.message = 'schedule success'
} catch (org.quartz.ObjectAlreadyExistsException e) {
flash.message = 'schedule failure'
}
redirect(action: index)
}

// 5秒以内なら上の予約を取り消す。
def unschedule = {
if (jobManagerService.unscheduleJob ("myTriggerGroup", 'myTriggerName')) {
flash.message = 'unschedule success'
}
else {
flash.message = 'unschedule failure'
}
redirect(action: index)
}
}

scheduleアクションでは実行前で予約済みのトリガ名を登録すると例外が発生するで連続で二回すると例外が発生する。unscheduleアクションでは、予約取消できない場合はfalseが返ってくる。

grails-app/views/schedule/index.gsp

<html>
<head>
<title>Welcome to Grails</title>
<meta name="layout" content="main" />
</head>
<body>
<g:if test="${flash.message}">
<div class="message">
${flash.message}
</div>
</g:if>
<div class="dialog" style="margin-left:20px;width:60%;">
<ul>
<li class="controller">
<g:link controller="schedule" action="schedule">schedule</g:link>
</li>
<li class="controller">
<g:link controller="schedule" action="unschedule">unschedule</g:link>
</li>
</ul>
</div>
</body>
</html>

実行すれば試せます。

grails run-app