`

spring3.1和quatz2实现数据库持久化和动态加载

阅读更多
在这里用的版本是spring3.1.1和quartz2.1.1。
首先 要先在项目中导入相关的jar包,可以到官网上去下载,
spring:http://www.springsource.org/
quartz:http://www.quartz-scheduler.org/

其次 ,因为需要把quartz的数据保存到数据库,所以要建立相关的数据库
这个可以从下载到的quartz包里面找到对应的sql脚本,目前可以支持mysql,DB2,oracle等主流的数据库,自己可以根据项目需要选择合适的脚本运行。

mysql,就在数据中建立了一个quartz的database,然后执行tables_mysql_innodb.sql脚本建表。

表建立好后可以看到相关的table
+————————–+
| Tables_in_quartz         |
+————————–+
| QRTZ_BLOB_TRIGGERS       |
| QRTZ_CALENDARS           |
| QRTZ_CRON_TRIGGERS       |
| QRTZ_FIRED_TRIGGERS      |
| QRTZ_JOB_DETAILS         |
| QRTZ_LOCKS               |
| QRTZ_PAUSED_TRIGGER_GRPS |
| QRTZ_SCHEDULER_STATE     |
| QRTZ_SIMPLE_TRIGGERS     |
| QRTZ_SIMPROP_TRIGGERS    |
| QRTZ_TRIGGERS            |
+————————–+

然后 ,需要在项目中加上对应的配置。
首先是quartz的配置
quartz.properties

org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.misfireThreshold = 60000

#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
#org.quartz.jobStore.useProperties = true
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.maxMisfiresToHandleAtATime=1


其中org.quartz.jobStore.class是指明quartz的持久化用数据库来保存,

而org.quartz.jobStore.driverDelegateClass是根据选择的数据库类型不同而不同,我这里的是mysql,所以是org.quartz.impl.jdbcjobstore.StdJDBCDelegate

至于quartz.properties的其他详细说明可以看quartz.properties配置文件说明:
#============================================================================
# Configure Main Scheduler Properties
#============================================================================

在集群中每个实例都必须有一个唯一的instanceId,但是应该有一个相同的instanceName

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = AUTO

#org.quartz.scheduler.skipUpdateCheck = true

#============================================================================
# Configure ThreadPool
#============================================================================

定义线程池,SimpleThreadPool这个线程池只是简单地在它的池中保持固定数量的线程,不增长也不缩小。但是它非常健壮且经过良好的测试,差不多每个Quartz用户都使用这个池。

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3   最多只能有3个线程并发
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  配置数据存储的方式#============================================================================

一个触发器被认定为“misfired”之前,调度器所能容忍的毫秒数

org.quartz.jobStore.misfireThreshold = 60000

1.所有的Quartz数据,例如Job和Trigger的细节信息被存储在内存(数据库)中。

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#org.quartz.jobStore.class = org.quartz.simpl.JDBCJobStore

2.配置事务。JobStoreTX来让Quartz帮你管理事务(这是最普遍的选择)。
如果想让Quartz同其他的事务协同工作(例如:J2EE应用服务器中的事务),那么你需要使用JobStoreCMT,这样,Quartz就会让应用服务器容器来管理事务

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT

3.DriverDelegate负责做指定数据库的所有JDBC工作.

如果数据库没有其他指定的代理,那么就试用代理StdJDBCDelegate。
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

为了指示JDBCJobStore所有的JobDataMaps中的值都是字符串,并且能以“名字-值”对的方式存储而不是以复杂对象的序列化形式存储在BLOB字段中,应设置值为”true”(这是缺省的方式)。

org.quartz.jobStore.useProperties = true
配置数据源源的名数、据库表前前缀
#org.quartz.jobStore.dataSource = myDS
#org.quartz.jobStore.tablePrefix = QRTZ_

是否集群  负载均衡和容错
#org.quartz.jobStore.isClustered = false

#============================================================================
# Configure Datasources  配置数据源
#============================================================================

#org.quartz.dataSource.myDS.driver = org.postgresql.Driver
#org.quartz.dataSource.myDS.URL = jdbc:postgresql://localhost/dev
#org.quartz.dataSource.myDS.user = jhouse
#org.quartz.dataSource.myDS.password =

如果Scheduler非常忙(比如,执行的任务数量差不多和线程池的数量相同,那么你需要正确地配置DataSource的连接数量为线程池数量+1)
#org.quartz.dataSource.myDS.maxConnections = 5

#============================================================================
# Configure Plugins
#============================================================================

org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 120
org.quartz.plugin.jobInitializer.wrapInUserTransaction =false



数据库的相关配置
jdbc.properties
############quartz db########################
quartz.driverClassName=com.mysql.jdbc.Driver
quartz.url=jdbc:mysql://127.0.0.1:3306/quartz?useUnicode=true
quartz.username=username
quartz.password=password
quartz.minPoolSize=7
quartz.initialPoolSize=12

当然quartz的数据库相关配置也可以写在spring的配置中。

spring的相关配置
加上以下内容:
<bean id=”quartzDataSource” destroy-method=”close”>
<property name=”driverClass” value=”${quartz.driverClassName}”/>
<property name=”jdbcUrl” value=”${quartz.url}”/>
<property name=”user” value=”${quartz.username}”/>
<property name=”password” value=”${quartz.password}”/>
<property name=”minPoolSize” value=”${quartz.minPoolSize}”/>
<property name=”initialPoolSize” value=”${quartz.initialPoolSize}”/>
</bean>
<context:property-placeholder location=”classpath:jdbc.properties”/>
<bean name=”quartzScheduler” class=”org.springframework.scheduling.quartz.SchedulerFactoryBean”>
<property name=”dataSource”>
<ref bean=”quartzDataSource” />
</property>
<property name=”applicationContextSchedulerContextKey”  value=”applicationContext” />
<property name=”configLocation” value=”classpath:quartz.properties”/>
</bean> 


接下来是java代码部分
首先加上一个定时任务类,继承org.quartz.Job
ParseModelJob
package com.iqbon.jcms.service.quartz;

import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.iqbon.jcms.domain.Quartz;
import com.iqbon.jcms.util.BeanFactory;

public class ParseModelJob implements Job {

private static final Logger logger = Logger.getLogger(ParseModelJob.class);

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//这里输入任务处理的内容
}

}
}

然后增加一个用于查询当前定时任务信息的类。
QuartzDAO
package com.iqbon.jcms.dao.system;

import java.util.HashMap;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import com.iqbon.jcms.domain.Quartz;
import com.iqbon.jcms.domain.mapRow.QuartzMapper;

/**
* 定时任务的DAO
* @author iqbon
*
*/
@Repository
public class QuartzDAO {
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

@Autowired
public void setDataSource(@Qualifier(“quartzDataSource”)
DataSource quartzDataSource) {//这里注明是配置文件里面的quartzDataSource数据源
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(quartzDataSource);
}

/**
* 查找所有的定时任务
* @return
*/
public List<Quartz> selectAllQuartJob() {
String sql = “select QRTZ_JOB_DETAILS.JOB_NAME,QRTZ_TRIGGERS.TRIGGER_NAME”
+ “,NEXT_FIRE_TIME,PREV_FIRE_TIME,TRIGGER_STATE,TRIGGER_TYPE,START_TIME,END_TIME”
+ “,QRTZ_JOB_DETAILS.DESCRIPTION from QRTZ_TRIGGERS inner join QRTZ_JOB_DETAILS ”
+ ” on QRTZ_TRIGGERS.JOB_NAME = QRTZ_JOB_DETAILS.JOB_NAME order by start_time”;
return namedParameterJdbcTemplate.query(sql, new HashMap<String, String>(), new QuartzMapper());
}
}

最后加上一个定时任务的服务类 QuartzService
package com.iqbon.jcms.service.quartz;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.iqbon.jcms.dao.system.QuartzDAO;
import com.iqbon.jcms.domain.Quartz;

@Service
public class QuartzService {

private static final Logger logger = Logger.getLogger(QuartzService.class);

private static Map<String, String> quartzStatus = new HashMap<String, String>(10);

@Autowired
private QuartzDAO quartzDAO;

@Autowired
private Scheduler quartzScheduler;

/**
* 查询所有定时任务信息
* @return
*/
public List<Quartz> getQuartzJobList() {
return quartzDAO.selectAllQuartJob();
}

/**
* 增加模板解析任务
* @param jobName
* @param topicIds
* @param description
* @param minutePattern
* @param hourPattern
* @throws SchedulerException
*/
public void addParseModelJob(String jobName, List<String> topicIds, String description,
String minutePattern, String hourPattern) throws SchedulerException {
//初始化JobDetail
JobDataMap dataMap = new JobDataMap();
dataMap.put(Quartz.PARSE_MODEL_TOPIC_KEY, topicIds);
dataMap.put(Quartz.JOB_LOG_KEY, new StringBuilder());
dataMap.put(Quartz.CREATE_JOB_TIME_KEY, DateFormatUtils.ISO_DATETIME_FORMAT.format(new Date()));
JobDetail jobDetail = JobBuilder.newJob(ParseModelJob.class)
.withIdentity(jobName, Scheduler.DEFAULT_GROUP).withDescription(description)
.usingJobData(dataMap).build();
//    JobDetailBean jobDetail = new JobDetailBean();
//初始化CronTrigger
String cronPattern = “0 ” + minutePattern + ” ” + hourPattern + ” * * ?”;
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobName + “_trigger”, Scheduler.DEFAULT_GROUP)
.forJob(jobDetail).withSchedule(CronScheduleBuilder.cronSchedule(cronPattern)).build();
//添加cornjob
quartzScheduler.scheduleJob(jobDetail, trigger);
}

/**
* 删除定时任务
* @param jobName
* @throws SchedulerException
*/
public void deleteJob(String jobName) throws SchedulerException {
quartzScheduler.deleteJob(new JobKey(jobName, Scheduler.DEFAULT_GROUP));
}

}

分享到:
评论
1 楼 Alors 2012-12-29  
Quartz这个类没有,报错

相关推荐

    Spring Quatz 书-Quartz.Job.Scheduling.Framework.Building

    2. **Spring与Quartz的整合**:讲解如何利用Spring的依赖注入(DI)和面向切面编程(AOP)特性,简化Quartz的配置和作业管理。通过Spring的XML配置或Java配置,可以方便地将作业和触发器绑定,实现灵活的作业调度...

    spring-quartz简单实例

    现在,Spring启动时会自动初始化Quartz Scheduler并根据配置的Trigger和JobDetail执行任务。在运行应用后,你可以看到每5分钟`SimpleJob`的`execute`方法会被调用一次,打印出"SimpleJob正在执行..."。 以上就是...

    quartz-2.2.3版本的quartz初始化sql语句

    在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息。这个过程通常涉及执行一系列SQL语句来创建必要的表结构。 Quartz的初始化SQL语句主要用于...

    idea 使用spring自带的定时器quartz 使用的c3p0 v0.95.2所包含的jar

    `c3p0`是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。`Spring`框架是Java开发中的一个核心组件,它提供了诸如依赖注入、AOP(面向切面编程)以及事务管理等功能。`Quartz`是...

    很全的quartz包

    此外,它支持JDBC Job Store,这允许任务和触发器的信息存储在数据库中,便于持久化和跨服务器的共享。2.1.6版本还优化了性能,并增强了对Java 5及更高版本的支持。 接下来是quartz-all-1.6.1.jar,这是一个早期...

    java定时任务quartz的基本实现

    默认情况下,Quartz使用RAM存储,若需持久化,需配置数据库连接。 7. **监听器(Listeners)** Quartz允许添加作业监听器和触发器监听器,以便在任务执行前后进行日志记录、统计或其他操作。 Quartz提供的灵活性...

    Quartz任务调度的实战使用分析

    - **持久化**: Quartz支持数据库持久化,这样即使应用程序重启,作业和触发器的信息也不会丢失。配置好数据源后,Quartz会自动处理。 - **并发控制**: 如果多个触发器在同一时刻触发同一个Job,你可以设置Job的并发...

    quatz配置实

    此外,Quartz还支持Job的持久化,如果配置了数据库JobStore(如`org.quartz.impl.jdbcjobstore.StdJDBCJobStore`),那么Job和Trigger信息将会存储在数据库中,即使服务器重启,任务调度也能恢复。 总结起来,...

    Springboot2.X基于可靠消息rabbitmq最终一致性分布式事务+分布式全局唯一ID生成器

     b、quatz调度未实现,这个相当简单,可以通过dubbo等rpc方式、或者httpclient方式进行远程调度,相关代码:  https://download.csdn.net/download/qq_22049773/12540998  c、其他均已实现  d、分布式全局ID...

    Quartz集群demo

    4. **数据库支持**:Quartz集群通常使用如MySQL、Oracle等关系型数据库作为持久化存储,以便各个节点能访问相同的数据。这需要正确配置`org.quartz.jobStore.class`为对应的数据库驱动,例如`org.quartz.impl....

    Quatz超详细教程(带实例)

    Quartz是一款开源的作业调度框架,它为Java应用程序提供了强大且灵活的定时任务调度功能。在本教程中,我们将深入探讨...通过学习这个超详细教程,你可以熟练地利用Quartz来构建和管理定时任务,提升应用的自动化水平。

    quartz手动测试需要的jar

    5. **commons-dbcp-1.3.jar**:Commons DBCP是Apache的一个数据库连接池实现,它管理数据库连接的创建、分配和释放。Quartz支持数据库存储任务和触发器,所以DBCP用于高效地管理数据库连接。 6. **commons-pool-...

    quatz 2.2 实例

    Quartz 2.2 是一个开源的工作调度框架,它允许开发者在 Java 应用程序中创建、调度和管理任务。这个实例将展示如何利用 Quartz...理解并掌握 Quartz 的使用,对于提升 Java 应用程序的自动化和智能化水平具有重要意义。

    JOB571.COM即插即用自助友情链接(XML版)

    XML(eXtensible Markup Language)是一种可扩展标记语言,它的主要特点是结构化和自描述性。在这款链接管理系统中,XML用于存储和传输链接信息,包括链接的URL、文字描述等。通过XML文件,系统可以轻松地解析和生成...

    Quartz 固定时间间隔计划+Calendar和Cron

    它允许开发者定义定时任务,这些任务可以在指定的时间间隔内自动执行,为系统增加了自动化和灵活性。标题中的 "固定时间间隔计划" 指的是使用 Quartz 的 SimpleTrigger 类来设置间隔时间执行任务的方式,而 ...

    基于内存的Quartz集群配置手册 [中文]

    在分布式环境中,尤其是在高可用性和负载均衡需求的场景下,Quartz可以通过集群配置实现任务的共享和均衡。本配置手册将详细介绍如何在基于内存的模式下配置Quartz集群,利用Terracotta作为分布式数据管理平台。 ...

    Pretty定时任务框架

    你在找一个完整定时任务框架而烦恼吗?这里就是你的答案。它是史上最强大的定时任务框架。...里面许多动态加载动态执行的好的方法。最大的特点是配置大部分仅仅是一个脚本而已!一个脚本可以完成所有任务!

    RiftDK2SensorLogger:记录来自DK2 HMD的传感器数据

    RiftDK2SensorLogger 用于记录来自Oculus Rift DK2 HMD的传感器数据的基本工具。 为支持我的最后一年的项目(使用Oculus Rift进行3D远程呈现)而撰写,目的是让用户感觉到用户在四处寻找时(在不同的任务中/在不同...

    solr-web.zip

    本代码主要包含SOLR基本可视化运维,如通过控制套绑定数据库和创建应用搜索实例。支持删除索引和自定义的增量更新。同时具备分词检索能力。 部署方式:1、解压后在源码中修改solr-config.properties配置文件信息,...

    OpenAuth.Core:.Net Core.Net 5快速应用开发框架、最好用的权限工作流系统。基于经典领域驱动设计的权限管理及快速开发框架,源于Martin Fowler企业级应用开发思想及最新技术组合(IdentityServer、EF core、Quartz、AutoFac、WebAPI、Swagger、Mock、NUnit、VUE、Element-ui等)。已成功在dockerjenkins中实施。核心模块包括:组织机构、角色用户、权限授权、表单设计、工作流等。它的架构精良易于扩展,是中小企业

    本项目基于.Net Core 3.1.100的跨平台版本,如果使用传统.Net Framework 4.5及最新 .Net 5 的同学请移步: 官方网站 官方文档 关于OpenAuth.Net企业版的说明: 目前OpenAuth.Core以全部开源的方式向大众开放,对于有...

Global site tag (gtag.js) - Google Analytics