国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

SpringBoot與Quartz集成實現分布式定時任務集群的代碼實例

2024-07-14 08:43:40
字體:
來源:轉載
供稿:網友

Spring Boot與Quartz集成實現分布式定時任務集群

直接貼代碼

POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>test.daemon</groupId>  <artifactId>clusterquartz</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>clusterquartz</name>  <url>http://maven.apache.org</url>  <parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>1.4.1.RELEASE</version>    <relativePath />  </parent>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>    <java.version>1.8</java.version>  </properties>  <dependencies>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter</artifactId>    </dependency>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-jdbc</artifactId>    </dependency>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-logging</artifactId>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-context-support</artifactId>    </dependency>    <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>    </dependency>    <dependency>      <groupId>com.alibaba</groupId>      <artifactId>druid</artifactId>      <version>1.0.13</version>    </dependency>    <dependency>      <groupId>com.h2database</groupId>      <artifactId>h2</artifactId>    </dependency>    <dependency>      <groupId>org.quartz-scheduler</groupId>      <artifactId>quartz</artifactId>      <version>2.2.1</version>    </dependency>    <dependency>      <groupId>org.quartz-scheduler</groupId>      <artifactId>quartz-jobs</artifactId>      <version>2.2.1</version>    </dependency>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <scope>test</scope>    </dependency>  </dependencies></project>

application.yml

server: port: 80spring: datasource:  url: jdbc:mysql://localhost:3306/quartz  username: admin  password: admin  driver-class-name: com.mysql.jdbc.Driver

quartz.properties

#============================================================================# Configure JobStore# Using Spring datasource in SchedulerConfig.java# Spring uses LocalDataSourceJobStore extension of JobStoreCMT#============================================================================org.quartz.jobStore.useProperties=falseorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.isClustered = trueorg.quartz.jobStore.clusterCheckinInterval = 5000org.quartz.jobStore.misfireThreshold = 60000org.quartz.jobStore.txIsolationLevelReadCommitted = trueorg.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate#============================================================================# Configure Main Scheduler Properties# Needed to manage cluster instances#============================================================================org.quartz.scheduler.instanceName = ClusterQuartzorg.quartz.scheduler.instanceId= AUTOorg.quartz.scheduler.rmi.export = falseorg.quartz.scheduler.rmi.proxy = falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction = false#============================================================================# Configure ThreadPool# Can also be configured in spring configuration#============================================================================#org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool#org.quartz.threadPool.threadCount = 5#org.quartz.threadPool.threadPriority = 5#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

Spring配置類

package test.daemon.clusterquartz.config;import java.io.IOException;import java.util.Properties;import java.util.concurrent.Executor;import javax.sql.DataSource;import org.quartz.Scheduler;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.config.PropertiesFactoryBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.scheduling.quartz.CronTriggerFactoryBean;import org.springframework.scheduling.quartz.JobDetailFactoryBean;import org.springframework.scheduling.quartz.SchedulerFactoryBean;import test.daemon.clusterquartz.quartz.QuartzJob;@Configurationpublic class SchedulerConfig {  @Autowired  private DataSource dataSource;  @Bean  public Scheduler scheduler() throws Exception {    Scheduler scheduler = schedulerFactoryBean().getScheduler();    scheduler.start();    return scheduler;  }  @Bean  public SchedulerFactoryBean schedulerFactoryBean() throws IOException {    SchedulerFactoryBean factory = new SchedulerFactoryBean();    factory.setSchedulerName("Cluster_Scheduler");    factory.setDataSource(dataSource);    factory.setApplicationContextSchedulerContextKey("applicationContext");    factory.setTaskExecutor(schedulerThreadPool());    factory.setTriggers(trigger1().getObject());    factory.setQuartzProperties(quartzProperties());    return factory;  }  @Bean  public Properties quartzProperties() throws IOException {    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();    propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));    // 在quartz.properties中的屬性被讀取并注入后再初始化對象    propertiesFactoryBean.afterPropertiesSet();    return propertiesFactoryBean.getObject();  }  @Bean  public JobDetailFactoryBean job1() {    JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();    jobDetailFactoryBean.setJobClass(QuartzJob.class);    jobDetailFactoryBean.setDurability(true);    jobDetailFactoryBean.setRequestsRecovery(true);    return jobDetailFactoryBean;  }  @Bean  public CronTriggerFactoryBean trigger1() {    CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();    cronTriggerFactoryBean.setJobDetail(job1().getObject());    cronTriggerFactoryBean.setCronExpression("0/3 * * * * ?");    return cronTriggerFactoryBean;  }  @Bean  public Executor schedulerThreadPool() {    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();    executor.setCorePoolSize(15);    executor.setMaxPoolSize(25);    executor.setQueueCapacity(100);    return executor;  }}

Quartz job類

package test.daemon.clusterquartz.quartz;import java.util.Date;import org.quartz.DisallowConcurrentExecution;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.PersistJobDataAfterExecution;import org.springframework.scheduling.quartz.QuartzJobBean;@PersistJobDataAfterExecution@DisallowConcurrentExecutionpublic class QuartzJob extends QuartzJobBean {  @Override  protected void executeInternal(JobExecutionContext context) throws JobExecutionException {    // TODO Auto-generated method stub    System.out.println("/nQuartz job " + new Date());  }}

Spring Boot啟動類

package test.daemon.clusterquartz;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Cluster {  public static void main(String[] args) throws Exception {    SpringApplication.run(Cluster.class, args);  }}

數據庫sql

可以在Quartz的lib中找到適當的數據庫生成文件來創建jdbc job store所需要的表。這些表用于Quartz在集群環境中的調度。

一些解釋

把項目復制一份,然后改掉spring server的啟動端口,啟動多個項目,可以觀察到只有一個項目的Quartz在運行。如果當前運行Quartz的服務器掛掉,另一臺會跟進執行相同的Quartz任務。

有待思考的部分

在Quartz集群環境中,時間的同步是一個重要問題,有時間需要去看一下怎么進行時間同步來確保集群的正確性。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 岗巴县| 中阳县| 正蓝旗| 牡丹江市| 武义县| 新平| 麦盖提县| 阜宁县| 皋兰县| 宁津县| 安国市| 鲁山县| 兰考县| 巧家县| 德格县| 衡东县| 台安县| 太仆寺旗| 收藏| 呈贡县| 防城港市| 赣州市| 房产| 原阳县| 雷州市| 泽州县| 沾化县| 绵阳市| 昌江| 阜平县| 临夏市| 宁南县| 邵阳市| 黑山县| 丁青县| 普陀区| 郧西县| 汉阴县| 桃源县| 北票市| 乐安县|