# 示例12 - 使用RMI的远程作业调度
说明
此示例演示使用远程方法调用,Quartz调度器可以由客户端远程调度。
# SimpleJob.java源码
package org.quartz.examples.example12;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
/**
* Job的一个缺陷实现,用于单元测试
* 作者:James House
*/
public class SimpleJob implements Job {
public static final String MESSAGE = "msg";
private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);
/**
* Quartz需要一个公共的空参构造函数,以便调度器可以在需要时实例化类
*/
public SimpleJob() {
}
/**
* 当与此作业相关联的触发器触发时,由调度器调用此方法
* Throws:作业执行异常(JobExecutionException)-当执行作业时产生异常
*/
public void execute(JobExecutionContext context)
throws JobExecutionException {
//此作业简单地输出它的名称及运行时间
JobKey jobKey = context.getJobDetail().getKey();
String message = (String) context.getJobDetail().getJobDataMap().get(MESSAGE);
_log.info("SimpleJob: " + jobKey + " executing at " + new Date());
_log.info("SimpleJob: msg: " + message);
}
}
# RemoteServerExample.java源码
package org.quartz.examples.example12;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 作者:Bill Kratzer
*/
public class RemoteServerExample {
/**
* 此示例将产生大量要执行的作业
* 作者:James House, Bill Kratzer
*/
public void run() throws Exception {
Logger log = LoggerFactory.getLogger(RemoteServerExample.class);
//首先,我们必须获得对调度器的引用
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
log.info("------- Initialization Complete -----------");
log.info("------- (Not Scheduling any Jobs - relying on a remote client to schedule jobs --");
log.info("------- Starting Scheduler ----------------");
//开启调度器
sched.start();
log.info("------- Started Scheduler -----------------");
log.info("------- Waiting ten minutes... ------------");
//等待5分钟让我们的作业有机会执行
try {
Thread.sleep(600L * 1000L);
} catch (Exception e) {
//
}
//关闭调度器
log.info("------- Shutting Down ---------------------");
sched.shutdown(true);
log.info("------- Shutdown Complete -----------------");
SchedulerMetaData metaData = sched.getMetaData();
log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
}
public static void main(String[] args) throws Exception {
RemoteServerExample example = new RemoteServerExample();
example.run();
}
}
# RemoteClientExample.java源码
package org.quartz.examples.example12;
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 此示例是一个客户端程序,它将远程与调度器进行通信以调度作业。在本例中,我们需要使用JDBC作业存储。
* 客户端将远程连接到JDBC作业存储以调度作业。
* 作者:James House, Bill Kratzer
*/
public class RemoteClientExample {
public void run() throws Exception {
Logger log = LoggerFactory.getLogger(RemoteClientExample.class);
//首先,我们必须获得对调度器的引用
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
//定义作业并要求其执行
JobDetail job = newJob(SimpleJob.class)
.withIdentity("remotelyAddedJob", "default")
.build();
JobDataMap map = job.getJobDataMap();
map.put("msg", "Your remotely added job has executed!");
Trigger trigger = newTrigger()
.withIdentity("remotelyAddedTrigger", "default")
.forJob(job.getKey())
.withSchedule(cronSchedule("/5 * * ? * *"))
.build();
//安排作业
sched.scheduleJob(job, trigger);
log.info("Remote job scheduled.");
}
public static void main(String[] args) throws Exception {
RemoteClientExample example = new RemoteClientExample();
example.run();
}
}
# 控制台输出(RemoteServerExample)
[main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
[main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main
[main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.0 created.
[main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.0
[main] INFO org.quartz.examples.example12.RemoteServerExample - ------- Initialization Complete -----------
[main] INFO org.quartz.examples.example12.RemoteServerExample - ------- (Not Scheduling any Jobs - relying on a remote client to schedule jobs --
[main] INFO org.quartz.examples.example12.RemoteServerExample - ------- Starting Scheduler ----------------
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[main] INFO org.quartz.examples.example12.RemoteServerExample - ------- Started Scheduler -----------------
[main] INFO org.quartz.examples.example12.RemoteServerExample - ------- Waiting ten minutes... ------------
# 控制台输出(RemoteClientExample)
[main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
[main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main
[main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.0 created.
[main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.0
[main] INFO org.quartz.examples.example12.RemoteClientExample - Remote job scheduled.

微信公众号

QQ交流群
原创网站开发,偏差难以避免。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。