`

springboot:quartz集群

阅读更多
pom.xml
=========================================
<dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
<!-- MySQL 连接驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector}</version>
        </dependency>
        <!-- Druid 数据连接池依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid}</version>
        </dependency>
         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
=========================================
QuartzConfig.java
=========================================
@Configuration
public class QuartzConfig {

    /**
     * 设置属性
     *
     * @return
     * @throws IOException
     */
    private Properties quartzProperties() throws IOException {

        Properties prop = new Properties();
        //Configure Main Scheduler Properties
        prop.put("org.quartz.scheduler.instanceName", "DefaultQuartzScheduler");
        prop.put("org.quartz.scheduler.wrapJobExecutionInUserTransaction", "false");
        prop.put("org.quartz.scheduler.instanceId", "AUTO");

        //Configure rmi
        prop.put("org.quartz.scheduler.rmi.export", "false");
        prop.put("org.quartz.scheduler.rmi.proxy", "false");

        //Configure ThreadPool
        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
        prop.put("org.quartz.threadPool.threadCount", "50");
        prop.put("org.quartz.threadPool.threadPriority", "5");
        prop.put("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread", "true");

        //Configure JobStore
        prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
        prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
        prop.put("org.quartz.jobStore.dataSource", "myDS");
        prop.put("org.quartz.jobStore.misfireThreshold", "60000");
        prop.put("org.quartz.jobStore.isClustered", "true");
        prop.put("org.quartz.jobStore.clusterCheckinInterval", "1000");

        //Configure datasource
        prop.put("org.quartz.dataSource.myDS.connectionProvider.class", "org.spring.springboot.config.QuartzDBConnection");
        prop.put("org.quartz.dataSource.myDS.driver", "com.mysql.jdbc.Driver");
        prop.put("org.quartz.dataSource.myDS.url", "jdbc:mysql://host:3306/movikr_quartz?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull");
        prop.put("org.quartz.dataSource.myDS.user", "");
        prop.put("org.quartz.dataSource.myDS.password", "");
        prop.put("org.quartz.dataSource.myDS.maxConnections", "10");
        prop.put("org.quartz.dataSource.myDS.validationQuery", "select 0");

        return prop;
    }

//    <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
//    <property name="corePoolSize" value="20" />
//    <property name="maxPoolSize" value="150" />
//    <property name="queueCapacity" value="500" />
//    </bean>

    @Bean(name = "schedulerFactoryBean")
    @Lazy(true)
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        // this allows to update triggers in DB when updating settings in config file:
        //用于quartz集群,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
        factory.setOverwriteExistingJobs(true);
        //用于quartz集群,加载quartz数据源
        //factory.setDataSource(dataSource);
        //QuartzScheduler 延时启动,应用启动完10秒后 QuartzScheduler 再启动
        factory.setStartupDelay(5);
        //用于quartz集群,加载quartz数据源配置
        factory.setQuartzProperties(quartzProperties());
        factory.setAutoStartup(true);
        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
        //factory.setConfigLocation(new FileSystemResource(this.getClass().getResource("/quartz.properties").getPath()));
        return factory;
    }

    @Bean(name = "schedule-service-QuartzManager", initMethod="initJobs")
    //@DependsOn("springContextHolder")
    public QuartzManager quartzManager() {
        QuartzManager quartzManager = new QuartzManager();
        return quartzManager;
    }

}

=========================================
QuartzDBConnection.java
=========================================
public class QuartzDBConnection implements ConnectionProvider {

    //JDBC驱动
    public String driver;
    //JDBC连接串
    public String url;
    //数据库用户名
    public String user;
    //数据库用户密码
    public String password;
    //数据库最大连接数
    public int maxConnections;
    //数据库SQL查询每次连接返回执行到连接池,以确保它仍然是有效的。
    public String validationQuery;

    private boolean validateOnCheckout;

    private int idleConnectionValidationSeconds;

    public String maxCachedStatementsPerConnection;

    private String discardIdleConnectionsSeconds;

    public static final int DEFAULT_DB_MAX_CONNECTIONS = 10;

    public static final int DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION = 120;

    //Druid连接池
    private DruidDataSource datasource;

    /*
    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    *
    * 接口实现
    *
    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    public Connection getConnection() throws SQLException {
        return datasource.getConnection();
    }

    public void shutdown() throws SQLException {
        datasource.close();
    }
    public void initialize() throws SQLException{
        if (this.url == null) {
            throw new SQLException("DBPool could not be created: DB URL cannot be null");
        }

        if (this.driver == null) {
            throw new SQLException("DBPool driver could not be created: DB driver class name cannot be null!");
        }

        if (this.maxConnections < 0) {
            throw new SQLException("DBPool maxConnectins could not be created: Max connections must be greater than zero!");
        }

        datasource = new DruidDataSource();
        try{
            datasource.setDriverClassName(this.driver);
        } catch (Exception e) {
            try {
                throw new SchedulerException("Problem setting driver class name on datasource: " + e.getMessage(), e);
            } catch (SchedulerException e1) {
            }
        }

        datasource.setUrl(this.url);
        datasource.setUsername(this.user);
        datasource.setPassword(this.password);
        datasource.setMaxActive(this.maxConnections);
        datasource.setMinIdle(1);
        datasource.setMaxWait(0);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(this.DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION);

        if (this.validationQuery != null) {
            datasource.setValidationQuery(this.validationQuery);
            if(!this.validateOnCheckout)
                datasource.setTestOnReturn(true);
            else
                datasource.setTestOnBorrow(true);
            datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds);
        }
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getMaxConnections() {
        return maxConnections;
    }

    public void setMaxConnections(int maxConnections) {
        this.maxConnections = maxConnections;
    }

    public String getValidationQuery() {
        return validationQuery;
    }

    public void setValidationQuery(String validationQuery) {
        this.validationQuery = validationQuery;
    }

    public boolean isValidateOnCheckout() {
        return validateOnCheckout;
    }

    public void setValidateOnCheckout(boolean validateOnCheckout) {
        this.validateOnCheckout = validateOnCheckout;
    }

    public int getIdleConnectionValidationSeconds() {
        return idleConnectionValidationSeconds;
    }

    public void setIdleConnectionValidationSeconds(int idleConnectionValidationSeconds) {
        this.idleConnectionValidationSeconds = idleConnectionValidationSeconds;
    }

    public DruidDataSource getDatasource() {
        return datasource;
    }

    public void setDatasource(DruidDataSource datasource) {
        this.datasource = datasource;
    }
}
================================================
QuartzManager.java
================================================
public class QuartzManager {

    private static final Logger LOG = LoggerFactory.getLogger(QuartzManager.class);

    @Resource(name = "schedulerFactoryBean")
    private Scheduler scheduler;

    /**
     * 初始化(spring启动 或其他)可运行的job 立即执行
     * 配置成bean 指定init-method="initJobs" 后于springContextHolder bean初始化
     */
    public void initJobs() throws SchedulerException {

        if (!scheduler.isShutdown()) {
            scheduler.start();
        }

    }
}

分享到:
评论

相关推荐

    Springboot集成quartz集群

    本文章是关于springboot集成quartz集群的步骤,LZ亲测。

    SpringBoot 整合Quartz(集群)实现定时任务调度

    SpringBoot整合Quartz实现定时任务调度是企业级应用中常见的需求,主要用于自动化执行某些周期性的任务,例如数据备份、报表生成、系统维护等。Quartz是一个功能强大的开源作业调度框架,能够灵活地定义任务和调度...

    springboot 集成 quartz 集群 加 sql 加 打jar包 及介绍全套

    springboot 集成 quartz 集群 加 sql 加 打jar包 及介绍全套 博客地址:https://blog.csdn.net/weixin_42749765/article/details/88532413

    springboot+quartz集群:通过动态配置调度dubbo接口/http接口代码实现

    在"springboot+quartz-cluster"的场景下,我们需要配置Quartz集群,确保任务在多个实例之间进行负载均衡,并且能够在节点故障时自动恢复。 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射...

    springboot 集成 quartz 集群 加 sql 等

    springboot 集成 quartz 集群 加 sql 等 文章介绍 单机加集群都有 https://blog.csdn.net/weixin_42749765/article/details/88532413

    springboot与quartz框架整合

    此外,Quartz还具备集群能力,确保在多服务器环境下任务的高可用性。 SpringBoot整合Quartz主要通过以下步骤: 1. **引入依赖**:首先,在项目中添加Quartz和SpringBoot的Starter Web依赖。在`pom.xml`或`build....

    SpringBoot整合Quartz任务定时调度

    而Quartz则是一款功能强大的作业调度库,它允许开发者定义、调度和执行任务。本篇文章将详细探讨如何在Spring Boot项目中整合Quartz实现任务定时调度。 首先,我们需要理解Spring Boot与Quartz的整合基础。Spring ...

    spring boot quartz集群实现

    一个基于springboot的quartz集群dome。 向http://localhost:9090/job/addjob注入3个参数 类名:(及时定时任务的类如:com.ybjdw.site.job.NewJob) 组名:随意 定时启动方法:如“0/3 * * * * ?”(每3秒启动一次...

    SpringBoot集成Quartz分布式定时任务

    此外,还需要配置集群策略,如`org.quartz.impl.jdbcjobstore.ClusterManager`,确保任务不被多个节点重复执行。 8. **监控与管理**: 可以使用Quartz提供的Web管理界面(如`AdminUI`)或API来查看和管理任务。...

    动态定时任务 SpringBoot quartz集群分布式。动态指定任意-demo-quartz-dynamic.zip

    SpringBoot框架结合Quartz库提供了一种高效、灵活的方式来管理这些定时任务,尤其在分布式环境中,Quartz集群能够保证任务的高可用性和容错性。本项目"动态定时任务 SpringBoot quartz集群分布式。动态指定任意-demo...

    springboot整合quartz定时任务yml文件配置方式

    在Spring Boot应用中整合Quartz定时任务是一种常见的需求,它可以帮助我们执行周期性的后台任务,如数据同步、报表生成等。Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup ...

    springboot 集成quartz

    亲测可用,springboot整合quartz。包含2个核心类QuartzConfiguration类和JobFactory类,修改数据库连接application和quartz.properties直接运行,访问http://localhost:8080/index。

    springboot-quartz 单机demo,分布式下demo

    SpringBoot与Quartz的整合是Java开发者在构建定时任务时常用的一种方式。SpringBoot以其便捷的启动和管理特性,使得快速开发变得更加简单,而Quartz则是一个强大的作业调度框架,可以实现复杂的时间触发规则和任务...

    springboot2.3集成quartz定时任务持久化数据库,支持集群

    在本文中,我们将深入探讨如何在Spring Boot 2.3版本中集成Quartz定时任务,并实现其持久化到数据库,以便支持集群环境。这个过程的关键在于配置Quartz Scheduler,设置数据库连接,以及确保任务在多节点环境中能够...

    springboot-quartz任务调度

    SpringBoot与Quartz结合使用,可以构建强大的定时任务执行系统,尤其在企业级应用中,对于数据处理、定期报告、清理任务等需求有着广泛的应用。本文将深入探讨SpringBoot集成Quartz的相关知识点,并结合前端技术如...

    springboot-quartz:springboot整合quartz

    **SpringBoot整合Quartz详解** 在Java开发领域,SpringBoot框架因其简洁的配置和快速的启动而备受青睐,而Quartz则是一款强大的任务调度库,它允许开发者灵活地定义和执行定时任务。当需要在SpringBoot应用中实现...

    spring boot + quartz集群搭建的完整步骤

    Spring Boot + Quartz 集群搭建的完整步骤 Spring Boot 是一个流行的 Java 框架,用于快速构建基于 Spring 的应用程序。Quartz 是一个流行的开源作业调度框架,可以用于实现定时任务的调度。 Spring Boot + Quartz ...

    SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    SpringBoot与Quartz集成实现分布式定时任务集群的代码实例 今天小编就为大家分享一篇关于SpringBoot与Quartz集成实现分布式定时任务集群的代码实例,分享的内容具有很好的参考价值。下面是相关的知识点: 首先,...

    java-springboot-quartz-定时任务.zip

    Java SpringBoot Quartz 定时任务是一个广泛应用于企业级开发中的技术组合,主要用于自动化执行周期性的任务。SpringBoot作为轻量级的框架,简化了Spring应用的初始搭建以及开发过程,而Quartz则是一个功能强大的...

    springboot+quartz.zip

    这个"springboot+quartz.zip"压缩包文件显然包含了关于如何在Spring Boot项目中集成和配置Quartz以实现动态定时任务的教程和代码示例。 首先,让我们详细了解一下Spring Boot和Quartz的基本概念: **Spring Boot**...

Global site tag (gtag.js) - Google Analytics