博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz-集群
阅读量:4303 次
发布时间:2019-05-27

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

本文不阐述quartz与spring集成,没有任何意义,以下内容的整理,全部是我根据https://www.w3cschool.cn/quartz_doc/整理出来

新建一个普通的java工程
1.POM文件,需要引入两个依赖

org.quartz-scheduler
quartz
2.2.3
org.quartz-scheduler
quartz-jobs
2.2.3

2.去quartz官网,下载2.2.3版本的quartz(不要问为什么POM文件依赖了还下载干嘛,因为要用里面的一个sql文件)

去quartz-2.2.3\docs\dbTables文件夹下,找到自己的数据库对应的sql文件,我的是mysql,所以我需要运行tables_mysql.sql文件

3.在普通java工程的src文件夹下建一个叫做quartz.properties的文件,如果不建立这个文件,那么quartz会使用quartz-2.2.3.jar下org.quartz包下的quartz.properties的文件,但是如果使用这个默认文件,那么此篇文章就木有意义了,因为我记录的是集群的搭建,而不是单机

#==============================================================  #Configure Main Scheduler Properties  #==============================================================   集群名称,同一个集群下,所有实例的名字instanceName必须相同,只有这样,一个节点挂掉,另一个节点才能替它工作org.quartz.scheduler.instanceName = quartzScheduler实例(节点)ID,同一个集群下,每个节点ID应该都是不一样的,写AUTO,则会像UUID一样,自动生成一个,但是:【经过我自己测试发现,两个不同的节点,instanceId相同竟然也可以正常运行】org.quartz.scheduler.instanceId = AUTO#==============================================================  #Configure JobStore  我自己认为JobStore就是元数据管理,把这些元数据存到数据库中#============================================================== 使用TXJobStore,不同的JobStore针对不同的事务,具体我并没有深入,不过基本都用TXorg.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXDriver delegates 了解不同数据库系统的特定方言,StdJDBCDelegate用于完全符合JDBC的驱动程序org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate数据库表前缀,假如数据库中有多组quartz表的时候才会使用,如果只有一组,没什么用org.quartz.jobStore.tablePrefix = QRTZ_这个属性非常重要,必须为true,表示开启集群支持org.quartz.jobStore.isClustered = true检测集群中其他节点是否还活着的频率,10秒,不需要改,参考刘杰分布式理论org.quartz.jobStore.clusterCheckinInterval = 10000  此处需要注意,这个myDS,其实是在下面org.quartz.dataSource中使用的,这是自己随便写的,如果这里写org.quartz.jobStore.dataSource = aaaaa,那么下面的,比如org.quartz.dataSource.myDS.driver 也要改成org.quartz.dataSource.aaaaa.driver org.quartz.jobStore.dataSource = myDS #==============================================================  #Configure DataSource  数据源没什么要说的#============================================================== org.quartz.dataSource.myDS.driver = com.mysql.cj.jdbc.Driverorg.quartz.dataSource.myDS.URL = jdbc:mysql://127.0.0.1:3306/swttest?serverTimezone=UTC&&useSSL=falseorg.quartz.dataSource.myDS.user = rootorg.quartz.dataSource.myDS.password =org.quartz.dataSource.myDS.maxConnections = 30#==============================================================  #Configure ThreadPool  线程池,我也不了解threadPriority和threadsInheritContextClassLoaderOfInitializingThread#============================================================== org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount = 5org.quartz.threadPool.threadPriority = 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

4.现在我要实现一个业务:每隔3秒打印一次"GG",打印开始之前打印"开始打印",打完GG之后,打印"结束打印"

4.1创建一个打印类,专门用来打印"GG",它必须实现Job接口

public class QuartzJob implements Job {  	//有相对应的set方法,则能自动注入到这里,下面的TestMain类会说明	private String tutu;	    @Override      public void execute(JobExecutionContext context) throws JobExecutionException {  //    	String value1=context.getJobDetail().getJobDataMap().getString("tutu1");//      此处不解释,解释也解释不明白,直接参考上面文档即可,就是job和trigger,谁后put就取谁值//    	String value4=context.getMergedJobDataMap().getString("tutu3");                System.out.println(tutu);//因为自动注入,所以能打印出来    }	/**	 * 如果有set方法,并且创建jobdetail的时候,添加了JobDataMap,则会自动注入	 */	public void setTutu(String tutu1) {		this.tutu = tutu1;	}    }

4.2 创建一个监听器类,实现打印GG前打印"开始打印",打完GG之后,打印"结束打印"

public class MyJobListener implements JobListener{	@Override	public String getName() {		return "随便写";	}	@Override	public void jobToBeExecuted(JobExecutionContext context) {		System.out.println(context.getJobDetail().getKey().getName()+"开始");	}	@Override	public void jobExecutionVetoed(JobExecutionContext context) {		}	@Override	public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {		System.out.println(context.getJobDetail().getKey().getName()+"完成");		}}

4.3运行,此处代码其实不多,但是我自己多写了一些,仔细看还是能看懂的

public class TestMain {	 	 public static void main(String[] args) throws SchedulerException, InterruptedException {		 SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();		 Scheduler sched =schedFact.getScheduler();		 sched.getListenerManager().addJobListener(new MyJobListener());		 sched.start();		 Map
p1=new HashMap<>(); p1.put("tutu", "奶糖G1"); addJob(null,QuartzJob.class,"0/2 * * * * ?","G1",sched,p1); } public static void addJob(String startTime,Class
jobClazz,String cron,String groupName,Scheduler sched,Map
param) throws SchedulerException { Trigger trigger=createCronTrigger(null,cron,groupName); JobDetail job=createJobDetail(jobClazz,param,groupName); sched.scheduleJob(job, trigger); } public static void delJob(String groupName,Scheduler sched) throws SchedulerException { JobKey jobkey=new JobKey("myJob1", groupName); sched.deleteJob(jobkey); } public static void editJobTime(String groupName,Scheduler sched) throws SchedulerException { TriggerKey triggerKey=TriggerKey.triggerKey("myTrigger1", groupName); Trigger trigger=createCronTrigger(null,"0/1 * * * * ?",groupName); sched.rescheduleJob(triggerKey, trigger); } public static Trigger createCronTrigger(String startTime,String cron,String groupName) { TriggerBuilder
tb= TriggerBuilder.newTrigger(); tb.withIdentity("myTrigger1", groupName); if(startTime!=null) { tb.startNow();//TODO } tb.withSchedule(CronScheduleBuilder.cronSchedule(cron)); return tb.build(); } public static JobDetail createJobDetail(Class
jobClazz,Map
param,String groupName) { JobBuilder jb = JobBuilder.newJob(jobClazz); if(param!=null && !param.isEmpty()) { JobDataMap jobDataMap=new JobDataMap(param); jb.setJobData(jobDataMap); } jb.withIdentity("myJob1", groupName); return jb.build(); }}

转载地址:http://mthws.baihongyu.com/

你可能感兴趣的文章
Oauth2方式实现单点登录
查看>>
CountDownLatch源码解析加流程图详解--AQS类注释翻译
查看>>
ES相关度评分
查看>>
我们一起做一个可以商用的springboot脚手架
查看>>
idea在搭建ssm框架时mybatis整合问题 无法找到mapper
查看>>
java设计基本原则----单一职责原则
查看>>
HashMap的实现
查看>>
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>
linux安装docker
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>