月曜日, 3月 27, 2017

Quartz で定期処理: Job へ値を引き渡す方法

プログラムを一定時間ごと走らせたい場合、スケジューラーを使います。

シェルスクリプトなどで走らせる方法もありますが、異質なものを組み合わせるのは限界があります。

Java で書けるスケジューラーで、Quartz なる優れた(ちょっと癖のある)ライブラリがあります。

Quartz の使い方はネットでもあがってますが、自前の Job を走らせたいときつまづきやすいのが Job へ値を引き渡したいとき。

ネットであまり記述がなかったので書きます。

このさいコンストラクタを使って値を引き渡す方法はx(だめ)です。

ここは .usingJobData(String, String) を用います。

import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class CronTest {
public static void main(String[] args) {
try {
JobDetail job = JobBuilder.newJob(CronTestJob.class).usingJobData("cmd", "echo")
.withIdentity("trigger", "group").build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group").startNow()
.withSchedule(simpleSchedule().withIntervalInMilliseconds(1000).repeatForever()).build();
Scheduler scheduler = null;
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job, trigger);
scheduler.start();
Thread.sleep(10000);
scheduler.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
view raw CronTest.java hosted with ❤ by GitHub

受け取る側は JobExecutionContext から getJobDataMap() を使って受け取ります。

import java.io.IOException;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class CronTestJob implements Job{
String cmd="yahho";
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
try {
String cmd=(String)arg0.getJobDetail().getJobDataMap().get("cmd");
System.out.println(cmd);
} catch (Exception e) {
e.printStackTrace();
}
}
}

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...