博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz入门实例11-Quartz的远程方法调用
阅读量:2215 次
发布时间:2019-05-07

本文共 5085 字,大约阅读时间需要 16 分钟。

在Resource目录下添加2个properties文件

client.properties

# Properties file for use by StdSchedulerFactory# to create a Quartz Scheduler Instance.## Configure Main Scheduler Properties  ======================================org.quartz.scheduler.instanceName: Sched1org.quartz.scheduler.logger: schedLoggerorg.quartz.scheduler.skipUpdateCheck: trueorg.quartz.scheduler.rmi.proxy: trueorg.quartz.scheduler.rmi.registryHost: localhostorg.quartz.scheduler.rmi.registryPort: 1099

server.properties

#============================================================================# Configure Main Scheduler Properties  #============================================================================org.quartz.scheduler.instanceName: Sched1org.quartz.scheduler.rmi.export: trueorg.quartz.scheduler.rmi.registryHost: localhostorg.quartz.scheduler.rmi.registryPort: 1099org.quartz.scheduler.rmi.createRegistry: trueorg.quartz.scheduler.skipUpdateCheck: true#============================================================================# Configure ThreadPool  #============================================================================org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount: 10org.quartz.threadPool.threadPriority: 5#============================================================================# Configure JobStore  #============================================================================org.quartz.jobStore.misfireThreshold: 60000org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

RmiJob.java

package cn.zto.job;import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobDetail;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.JobKey;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class RmiJob implements Job {  public static final String MESSAGE = "msg";  public void execute(JobExecutionContext context) throws JobExecutionException {	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");    JobKey jobKey = context.getJobDetail().getKey();    String message = (String)context.getJobDetail().getJobDataMap().get("msg");    System.out.println(dateFormat.format(new Date()) + " : " + jobKey + " 执行 " );    System.out.println("SimpleJob: msg: " + message);  }}

RemoteServerExample.java

package cn.zto.app;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.SchedulerMetaData;import org.quartz.impl.StdSchedulerFactory;public class RemoteServerExample {	public void run() throws Exception {		System.setProperty("org.quartz.properties", "server.properties");						SchedulerFactory sf = new StdSchedulerFactory();		Scheduler sched = sf.getScheduler();		System.out.println("------- 初始化完成 -----------");		System.out.println("------- 由远程客户端来安排Job --");		System.out.println("------- 开始Scheduler ----------------");		sched.start();		System.out.println("------- Scheduler调用job结束 -----------------");		System.out.println("------- 等待10分钟... ------------");		try {			Thread.sleep(600000L);		} catch (Exception e) {		}		System.out.println("------- 关闭Scheduler ---------------------");		sched.shutdown(true);		System.out.println("------- 关闭完成 -----------------");		SchedulerMetaData metaData = sched.getMetaData();		System.out.println("Executed " + metaData.getNumberOfJobsExecuted()				+ " jobs.");	}	public static void main(String[] args) throws Exception {		RemoteServerExample example = new RemoteServerExample();		example.run();	}}

RemoteClientExample.java

package cn.zto.app;import org.quartz.CronScheduleBuilder;import org.quartz.JobBuilder;import org.quartz.JobDataMap;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import cn.zto.job.RmiJob;public class RemoteClientExample {	public void run() throws Exception {		System.setProperty("org.quartz.properties", "client.properties");		SchedulerFactory sf = new StdSchedulerFactory();		Scheduler sched = sf.getScheduler();		JobDetail job = JobBuilder.newJob(RmiJob.class)				.withIdentity("remotelyAddedJob", "default").build();		JobDataMap map = job.getJobDataMap();		map.put("msg", "向服务端添加Job!");		Trigger trigger = TriggerBuilder.newTrigger()				.withIdentity("remotelyAddedTrigger", "default")				.forJob(job.getKey())				.withSchedule(CronScheduleBuilder.cronSchedule("/5 * * ? * *"))				.build();		sched.scheduleJob(job, trigger);		System.out.println("服务端工作.");	}	public static void main(String[] args) throws Exception {		RemoteClientExample example = new RemoteClientExample();		example.run();	}}

想像一下,你需要构建一个这样的作业调度器,它要应多个客户端请求进行动态 Job 部署。在这个案例中,一个单一的、自包容的 Quartz 调度器是没法做到的,因为这些客户端程序在自己所在的地址空间或者说 JVM 中需要以一种方式与调度器交谈。
借助于 RMI,运行在一个地址空间(或JVM) 的对象可自由的调用另一 JVM 中的对象。这也扩充了 Quartz 这一工具集,使这一框架更有利。

RMI 是一种允行在一个地址空间的对象与别一地址空间的对象进行通行的机制。这两个地址空间可能存在于同一机器上或者根本就在不同的机器上。一般而言,你可以认为 RMI 是一种面向对象的远程过程调用(RPC) 机制。

附properties配置



你可能感兴趣的文章
分布式系统理论基础1: 一致性、2PC和3PC
查看>>
分布式系统理论基础2 :CAP
查看>>
分布式系统理论基础3: 时间、时钟和事件顺序
查看>>
分布式系统理论基础4:Paxos
查看>>
分布式系统理论基础5:选举、多数派和租约
查看>>
分布式系统理论基础6:Raft、Zab
查看>>
分布式系统理论进阶7:Paxos变种和优化
查看>>
分布式系统理论基础8:zookeeper分布式协调服务
查看>>
搞懂分布式技术1:分布式系统的一些基本概念
查看>>
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
查看>>
搞懂分布式技术3:初探分布式协调服务zookeeper
查看>>
搞懂分布式技术4:ZAB协议概述与选主流程详解
查看>>
搞懂分布式技术5:Zookeeper的配置与集群管理实战
查看>>
搞懂分布式技术6:Zookeeper典型应用场景及实践
查看>>
搞懂分布式技术10:LVS实现负载均衡的原理与实践
查看>>
搞懂分布式技术11:分布式session解决方案与一致性hash
查看>>
搞懂分布式技术12:分布式ID生成方案
查看>>
搞懂分布式技术13:缓存的那些事
查看>>
搞懂分布式技术14:Spring Boot使用注解集成Redis缓存
查看>>
搞懂分布式技术15:缓存更新的套路
查看>>