2009年9月29日火曜日

groovyとPostgreSQLとquartzの組み合わせでJobを作成する

1.quartzの設定
http://www.opensymphony.com/quartz/download.actionから
quartz-1.6.5.zipをダウンロードして、解凍。
quartz-all-1.6.5.jarをgroovyのlibディレクトリへコピー。
quartzのlib/coreのcommons-collections-3.2.jarをgroovyのlibディレクトリへコピー。quartzのlib/optionalのcommons-pool-1.3.jarをgroovyのlibディレクトリへコピー
quartzのlib/optionalのcommons-dbcp-1.2.2.jarをgroovyのlibディレクトリへコピー

postgresのJDBCドライバーもgroovyのlibディレクトリへコピーしておく。

PostgreSQLで以下のコマンドを実行してDB作成。
CREATE DATABASE quartz
WITH OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'Japanese, Japan'
LC_CTYPE = 'Japanese, Japan'
CONNECTION LIMIT = -1;

quartzのdocs/dbTables/tables_postgres.sqlを実行。

2.以下のように設定ファイルを作成。
myquartz.properties

org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.misfireThreshold = 60000

#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

# データソースの設定
org.quartz.dataSource.QuartzDS.driver = org.postgresql.Driver
org.quartz.dataSource.QuartzDS.URL = jdbc:postgresql://localhost:5432/quartz
org.quartz.dataSource.QuartzDS.user = postgres
org.quartz.dataSource.QuartzDS.password = postgres
org.quartz.dataSource.QuartzDS.maxConnections = 10
org.quartz.dataSource.QuartzDS.validationQuery = select 1

# JDBC JobStore設定
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.dataSource = QuartzDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.clusterCheckinInterval = 15000
org.quartz.jobStore.maxMisfiresToHandleAtATime = 20
org.quartz.jobStore.dontSetAutoCommitFalse = false
org.quartz.jobStore.selectWithLockSQL = SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE
org.quartz.jobStore.txIsolationLevelSerializable = false
org.quartz.jobStore.acquireTriggersWithinLock = false


2.以下のようにJobインターフェイスを実装するクラスを作成

import org.quartz.*

class HelloQuartzJob implements Job
{
// ジョブ実行メソッド
void execute(JobExecutionContext context)
throws JobExecutionException
{
println("Hello, Quartz!" + new Date())
}
}


3.作成したジョブクラスをJobDetailとTriggerに関連付けて実行します。

import org.quartz.*
import org.quartz.impl.*

// スケジューラ取得
sf = new StdSchedulerFactory("./myquartz.properties")
sched = sf.getScheduler()

// 次の分の0秒にスケジュール
Date runTime = TriggerUtils.getEvenMinuteDate(new Date())
JobDetail job = new JobDetail(
// ジョブ名
"job1",
// グループ名
"group1",
// ジョブクラス
HelloQuartzJob.class
)

// 指定した時間に実行するトリガー
trigger = new SimpleTrigger(
// トリガー名
"trigger1",
// グループ名
"group1",
// 実行時間
runTime
)

// ジョブをスケジュール
sched.scheduleJob(job, trigger)

// スケジューラを開始
sched.start();

try {
// ジョブ実行をするために2分待ち
Thread.sleep(120L * 1000L)
}
catch(Exception ex){}

// 終了
sched.shutdown(true)

0 件のコメント:

コメントを投稿