SpringBoot与Quartz集成实现分布式定时任务集群的代码实例
SpringBoot与Quartz集成实现分布式定时任务集群
直接贴代码
POM
4.0.0 test.daemon clusterquartz 0.0.1-SNAPSHOT jar clusterquartz http://maven.apache.org org.springframework.boot spring-boot-starter-parent 1.4.1.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-jdbc org.springframework.boot spring-boot-starter-logging org.springframework spring-context-support mysql mysql-connector-java com.alibaba druid 1.0.13 com.h2database h2 org.quartz-scheduler quartz 2.2.1 org.quartz-scheduler quartz-jobs 2.2.1 junit junit test
application.yml
server: port:80 spring: datasource: url:jdbc:mysql://localhost:3306/quartz username:admin password:admin driver-class-name:com.mysql.jdbc.Driver
quartz.properties
#============================================================================ #ConfigureJobStore #UsingSpringdatasourceinSchedulerConfig.java #SpringusesLocalDataSourceJobStoreextensionofJobStoreCMT #============================================================================ org.quartz.jobStore.useProperties=false org.quartz.jobStore.tablePrefix=QRTZ_ org.quartz.jobStore.isClustered=true org.quartz.jobStore.clusterCheckinInterval=5000 org.quartz.jobStore.misfireThreshold=60000 org.quartz.jobStore.txIsolationLevelReadCommitted=true org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate #============================================================================ #ConfigureMainSchedulerProperties #Neededtomanageclusterinstances #============================================================================ org.quartz.scheduler.instanceName=ClusterQuartz org.quartz.scheduler.instanceId=AUTO org.quartz.scheduler.rmi.export=false org.quartz.scheduler.rmi.proxy=false org.quartz.scheduler.wrapJobExecutionInUserTransaction=false #============================================================================ #ConfigureThreadPool #Canalsobeconfiguredinspringconfiguration #============================================================================ #org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool #org.quartz.threadPool.threadCount=5 #org.quartz.threadPool.threadPriority=5 #org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
Spring配置类
packagetest.daemon.clusterquartz.config; importjava.io.IOException; importjava.util.Properties; importjava.util.concurrent.Executor; importjavax.sql.DataSource; importorg.quartz.Scheduler; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.beans.factory.config.PropertiesFactoryBean; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.core.io.ClassPathResource; importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; importorg.springframework.scheduling.quartz.CronTriggerFactoryBean; importorg.springframework.scheduling.quartz.JobDetailFactoryBean; importorg.springframework.scheduling.quartz.SchedulerFactoryBean; importtest.daemon.clusterquartz.quartz.QuartzJob; @Configuration publicclassSchedulerConfig{ @Autowired privateDataSourcedataSource; @Bean publicSchedulerscheduler()throwsException{ Schedulerscheduler=schedulerFactoryBean().getScheduler(); scheduler.start(); returnscheduler; } @Bean publicSchedulerFactoryBeanschedulerFactoryBean()throwsIOException{ SchedulerFactoryBeanfactory=newSchedulerFactoryBean(); factory.setSchedulerName("Cluster_Scheduler"); factory.setDataSource(dataSource); factory.setApplicationContextSchedulerContextKey("applicationContext"); factory.setTaskExecutor(schedulerThreadPool()); factory.setTriggers(trigger1().getObject()); factory.setQuartzProperties(quartzProperties()); returnfactory; } @Bean publicPropertiesquartzProperties()throwsIOException{ PropertiesFactoryBeanpropertiesFactoryBean=newPropertiesFactoryBean(); propertiesFactoryBean.setLocation(newClassPathResource("/quartz.properties")); //在quartz.properties中的属性被读取并注入后再初始化对象 propertiesFactoryBean.afterPropertiesSet(); returnpropertiesFactoryBean.getObject(); } @Bean publicJobDetailFactoryBeanjob1(){ JobDetailFactoryBeanjobDetailFactoryBean=newJobDetailFactoryBean(); jobDetailFactoryBean.setJobClass(QuartzJob.class); jobDetailFactoryBean.setDurability(true); jobDetailFactoryBean.setRequestsRecovery(true); returnjobDetailFactoryBean; } @Bean publicCronTriggerFactoryBeantrigger1(){ CronTriggerFactoryBeancronTriggerFactoryBean=newCronTriggerFactoryBean(); cronTriggerFactoryBean.setJobDetail(job1().getObject()); cronTriggerFactoryBean.setCronExpression("0/3****?"); returncronTriggerFactoryBean; } @Bean publicExecutorschedulerThreadPool(){ ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor(); executor.setCorePoolSize(15); executor.setMaxPoolSize(25); executor.setQueueCapacity(100); returnexecutor; } }
Quartzjob类
packagetest.daemon.clusterquartz.quartz; importjava.util.Date; importorg.quartz.DisallowConcurrentExecution; importorg.quartz.JobExecutionContext; importorg.quartz.JobExecutionException; importorg.quartz.PersistJobDataAfterExecution; importorg.springframework.scheduling.quartz.QuartzJobBean; @PersistJobDataAfterExecution @DisallowConcurrentExecution publicclassQuartzJobextendsQuartzJobBean{ @Override protectedvoidexecuteInternal(JobExecutionContextcontext)throwsJobExecutionException{ //TODOAuto-generatedmethodstub System.out.println("\nQuartzjob"+newDate()); } }
SpringBoot启动类
packagetest.daemon.clusterquartz; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication publicclassCluster{ publicstaticvoidmain(String[]args)throwsException{ SpringApplication.run(Cluster.class,args); } }
数据库sql
可以在Quartz的lib中找到适当的数据库生成文件来创建jdbcjobstore所需要的表。这些表用于Quartz在集群环境中的调度。
一些解释
把项目复制一份,然后改掉springserver的启动端口,启动多个项目,可以观察到只有一个项目的Quartz在运行。如果当前运行Quartz的服务器挂掉,另一台会跟进执行相同的Quartz任务。
有待思考的部分
在Quartz集群环境中,时间的同步是一个重要问题,有时间需要去看一下怎么进行时间同步来确保集群的正确性。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接