`

Quartz+Spring 自定义作业调度(作业在DB中配置) (转)

 
阅读更多
Quartz+Spring 自定义作业调度(作业在DB中配置)
Quartz版本为1.8.3
Spring版本为2.5

自定义作业表 QRTZ_JOB。
其中定义 作业标识、作业名称、类名、触发器名称、触发器脚本等。
下面看看在Spring中如何配置Quartz。
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                        http://www.springframework.org/schema/aop
                        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
                        http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd"
           default-lazy-init="false">
   
    <context:component-scan base-package="com.jn" />
   
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
           <tx:method name="insert*" propagation="REQUIRED"/>
           <tx:method name="del*" propagation="REQUIRED"/>
           <tx:method name="update*" propagation="REQUIRED"/>
           <tx:method name="*" read-only="true"/>
       </tx:attributes>
    </tx:advice>

    <aop:config>
       <aop:pointcut id="allManagerMethod" expression="execution(* com.jn.*.*(..))"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
    </aop:config>
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="proxoolDataSource" />
    </bean>
        <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>     
                <value>classpath:jdbc.properties</value>
            </list>     
        </property>     
    </bean>
    <bean id="proxoolDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${dburl}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
    </bean>
   
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="dataSource">
            <ref local="proxoolDataSource"/>
        </property>
        <property name="configLocation">
            <value>classpath:sql-map-config.xml</value>
        </property>
    </bean>
   
    <bean name="quartzScheduler" lazy-init="true" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="dataSource" ref ="proxoolDataSource" />
        <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
        <property name="configLocation" value="classpath:quartz.properties"/>
    </bean>
</beans>
Main.java
package com.jn.common;

import com.jn.qrtz.job.JobManager;
import com.jn.spring.BeanFactory;

/** *//**
* 启动类
* @author l
*/
public class Main {
    /** *//**
     * 启动函数
     * @param args
     */
    public static void main(String[] args) {
        try {
            JobManager mgr = (JobManager)BeanFactory.factory().getBean("jobManager");
            mgr.init();
            mgr.dispatch();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JobManager.java
package com.jn.qrtz.job;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.jn.persistence.QrtzDaoImpl;
import com.jn.qrtz.JobConfig;
import com.jn.qrtz.service.SchedulerServiceImpl;

/** *//**
* 作业管理类
*
* @author l
*/
@Component("jobManager")
@Scope("singleton")
public class JobManager {
    private Logger               log     = Logger.getLogger(JobManager.class);

    @Autowired(required = true)
    private QrtzDaoImpl          qrtzDao;

    @Autowired(required = true)
    private SchedulerServiceImpl schedulerService;

    /** *//** 作业列表 */
    private List<JobConfig>      allJobs = new ArrayList<JobConfig>();

    /** *//**
     * 初始化作业列表
     */
    public synchronized void init() {
        try {
            allJobs = qrtzDao.queryAllJobs();
            log.info("作业初始化完成。");
        }
        catch (SQLException e) {
            log.error("初始化作业失败。" + e.getMessage());
        }
    }

    /** *//**
     * 系统启动时派发作业
     */
    public void dispatch() {
        for (JobConfig job : allJobs) {
            try {
                schedulerService.schedule(job);
            }
            catch (Exception e) {
                e.printStackTrace();
                log.error(job.toString() + "派发失败。" + e.getMessage());
            }
        }
    }

    public SchedulerServiceImpl getSchedulerService() {
        return schedulerService;
    }

    public void setSchedulerService(
        @Qualifier("schedulerService") SchedulerServiceImpl schedulerService) {
        this.schedulerService = schedulerService;
    }

    public QrtzDaoImpl getQrtzDao() {
        return qrtzDao;
    }

    public void setQrtzDao(@Qualifier("qrtzDao") QrtzDaoImpl qrtzDao) {
        this.qrtzDao = qrtzDao;
    }
}

其中QrtzDaoImpl对象是用于从QRTZ_JOB表中取得作业列表,并将作业封装为JobConfig对象。

SchedulerServiceImpl对象用于派发Job。
SchedulerServiceImpl.java
package com.jn.qrtz.service;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import com.jn.qrtz.JobConfig;
import com.jn.qrtz.job.WorkDispatcher;

/** *//**
* 作业派发、移除类
* @author l
*/
@Component("schedulerService")
public class SchedulerServiceImpl {
    @Autowired
    private Scheduler scheduler;

    /** *//**
     * 移除作业
     * @param config
     * @return
     * @throws SchedulerException
     */
    public boolean remove(JobConfig config) throws SchedulerException {
        if(config == null) {
            return false;
        }
        return removeJob(config.getJobName(), config.getJobGroup());
    }

    /** *//**
     * 派发作业
     * @param config
     * @throws Exception
     */
    public void schedule(JobConfig config) throws Exception {
        String triggerName = config.getTriggerName();
        String triggerGroup = config.getTriggerGroup();
        String cronStr = config.getTriggerScript();
       
        String jobName = config.getJobName();
        String jobGroup = config.getJobGroup();
        JobDetail jobDetail = new JobDetail(jobName, jobGroup, WorkDispatcher.class);
        jobDetail.getJobDataMap().put(JobConfig.EXEC_INFO, config.cloneInfo());
       
        schedule(triggerName, triggerGroup, cronStr, jobDetail);
    }

    /** *//**
     * 派发作业
     * @param name
     * @param group
     * @param cronStr
     * @param jobDtl
     * @throws Exception
     */
    private void schedule(String name, String group, String cronStr, JobDetail jobDtl)
        throws Exception {
        CronTrigger cronTrigger = new CronTrigger(name, group, jobDtl.getName(), jobDtl.getGroup(),
            cronStr);
        scheduler.scheduleJob(jobDtl, cronTrigger);
    }

    /** *//**
     * 移除作业
     * @param jobName
     * @param group
     * @return
     * @throws SchedulerException
     */
    private boolean removeJob(String jobName, String group) throws SchedulerException {
        scheduler.pauseJob(jobName, group);
        return scheduler.deleteJob(jobName, group);
    }
   
    @Autowired
    public void setScheduler(@Qualifier("quartzScheduler") Scheduler scheduler) {
        this.scheduler = scheduler;
    }
}
由这些代码,便可以通过Quartz框架去调度 我们定义在QRTZ_JOB表中的作业了。

由于Quartz框架本身依赖一些表,其中我们执行的作业,同样会被框架保存在那些它所依赖的表中,
如:qrtz_job_details表。
当Spring加载quartzScheduler时,Quartz框架会被自动启动并调度保存在qrtz_job_details表中的作业。
所以再次启动时,应先将 Quartz依赖的表清空。
当然这个操作也可以被集成在代码中。

还有另外一种方案可实现此的功能,便是重写org.springframework.scheduling.quartz.SchedulerFactoryBean类,
自定义类继承此类,在自定义的类中注入自己的对象,在其中取得 作业列表,
并生成Trigger对象数组,调用 org.springframework.scheduling.quartz.SchedulerFactoryBean 类的setTriggers(Trigger[]) 方法。
设置好Trigger数据。
最后再 调用Scheduler的start()方法,Quartz便可调度这些作业了。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    spring分布式任务调度

    7、自定义任务参数:支持在线配置调度任务入参,即时生效; 8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; 9、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配...

    quartz与spring集群Demo

    实例是基于MyEclipse开发的。针对Quartz与Spring做集群的Demo...实例运行依赖Oracle数据库,根据quartz框架包docs/dbTables/目录下的sql脚本文件,创建表结构,修改工程中的Spring数据源配置。 Start.java启动程序。

    基于Spring打造简单高效通用的异步任务处理系统

    l Spring封装Job调度:当任务信息都持久化在DB中之后,我们需要将这些信息读取出来执行具体的业务逻辑操作,这里我们通过ScheduledExecutorFactoryBean来实现对任务的循环调度,比如说可采取每隔5min扫描一次待处理...

    quartz-boiler:Quartz Spring集成样板代码

    Spring 调度可以非常强大,并且可以在许多情况下完成工作,但是同样,如果您计划转向 DB 作业控制、多个节点或需要微调您的作业执行,Quartz 确实有许多功能来支持它。 这是 Quartz 文档中的一个页面,描述了它的...

    spring-batch-admin-ui:Spring Batch管理员是一个最初采用spring boot 2,spring security,oauth2,Spring data jpa作为基础框架,集成了quartz提供调度能力,集成了Spring Batch提供批处理能力的管理系统。展示以及常见批处理的配置以及运行能力

    初始化数据库:找到目录:/ spring-batch-admin-backend / src / main / db,里面有两个文件,一个是数据库创建脚本,一个是表结构+数据的脚本,先执行创建库的,如果想在已经存在的库里面运行程序,可以省略这一步...

    db-scheduler:Java的持久性群集友好调度程序

    数据库调度程序 Java任务计划程序的灵感来自对集群的java.util.concurrent.ScheduledExecutorService的需求,它比Quartz更简单。 因此,也受到用户的赞赏( , ): 你的lib摇滚! 我很高兴我摆脱了Quartz,...

    单点登录源码

    Quartz | 作业调度框架 | [http://www.quartz-scheduler.org/](http://www.quartz-scheduler.org/) Ehcache | 进程内缓存框架 | [http://www.ehcache.org/](http://www.ehcache.org/) ActiveMQ | 消息队列 | ...

    SpringBoot + Mysql 博客管理系统【前端+后台】.rar

    * 任务调度:`quartz 2.3` * 持久层框架:`MyBatis 3` &lt;a href="http://baomidou.oschina.io/mybatis-plus-doc/#/" target="_blank"&gt;mybatisplus&lt;/a&gt; 2.1.4 * 数据库连接池:`Alibaba Druid 1.0.2` * 日志管理:`...

    开源中国源码

    - 运行 `java -jar FlyCms.jar --spring.profiles.active=prod &gt; FlyCms.log 2&gt;&1 &` 项目就在后台运行了 - 将项目下的 `flycms.sql` 文件导入到数据库 - 关闭服务运行 `ps -ef | grep FlyCms.jar | grep -v grep ...

    J2eeFAST企业级快速开发平台-其他

    基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis-Plus、Freemarker、Bootstrap、AdminLTE)采用经典开发模式,让初学者能够更快的入门并投入到团队开发中去。在线代码生成功能,包括核心模块如:...

    J2eeFAST企业级快速开发平台 v2.0.8

    是一个Java EE企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis-Plus、Freemarker、Bootstrap、AdminLTE)采用经典开发模式,让初学者能够更快的入门并投入到团队开发中去。...

Global site tag (gtag.js) - Google Analytics