【Quartz】Quartz存储与持久化-基于Spring的配置

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

在上文【Quartz】Quartz存储与持久化-基于quartz.properties的配置,是通过配置quartz.properties文件的方式来实现持久化的。本文将通过Spring配置的方式来实现存储与持久化。

1、同上文一样,要先创建相关的数据表,并新建一个JAVA工程,并导入相关的包,整个工程目录 如下:

2、创建Job类

package com.mucfc;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job{
	private static final Logger logger = Logger.getLogger(MyJob.class);
	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		System.out.println("Hello quzrtz  "+
				new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));

	}

}

3、创建一个调度类

package com.mucfc;
import java.text.ParseException;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.quartz.CronScheduleBuilder;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class QuartzTest {
	@Autowired
	private Scheduler scheduler;
	private static String JOB_GROUP_NAME = "ddlib";
	private static String TRIGGER_GROUP_NAME = "ddlibTrigger";
	/**
	 * 开始一个simpleSchedule()调度
	 */
	public void startSchedule() {
		try {
			// 1、创建一个JobDetail实例,指定Quartz
			JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
			// 任务执行类
					.withIdentity("job1_1", "jGroup1")
					// 任务名,任务组
					.build();
			// 2、创建Trigger
			SimpleScheduleBuilder builder = SimpleScheduleBuilder
					.simpleSchedule()
					// 设置执行次数
				    .repeatSecondlyForTotalCount(10);
			Trigger trigger = TriggerBuilder.newTrigger()
					.withIdentity("trigger1_1", "tGroup1").startNow()
					.withSchedule(builder).build();
			// 3、创建Scheduler
			scheduler.start();
			// 4、调度执行
			scheduler.scheduleJob(jobDetail, trigger);
			try {
				Thread.sleep(60000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			scheduler.shutdown();

		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 从数据库中找到已经存在的job,并重新开户调度
	 */
	public  void resumeJob() {
		try {
			// ①获取调度器中所有的触发器组
			List<String> triggerGroups = scheduler.getTriggerGroupNames();
			// ②重新恢复在tgroup1组中,名为trigger1_1触发器的运行
			for (int i = 0; i < triggerGroups.size(); i++) {
				List<String> triggers = scheduler.getTriggerGroupNames();
				for (int j = 0; j < triggers.size(); j++) {
					Trigger tg = scheduler.getTrigger(new TriggerKey(triggers
							.get(j), triggerGroups.get(i)));
					// ②-1:根据名称判断
					if (tg instanceof SimpleTrigger
							&& tg.getDescription().equals("tgroup1.trigger1_1")) {
						// ②-1:恢复运行
						scheduler.resumeJob(new JobKey(triggers.get(j),
								triggerGroups.get(i)));
					}
				}

			}
			scheduler.start();
		} catch (Exception e) {
			e.printStackTrace();

		}
	}
}

4、beans.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:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.0.xsd">
    	 <!-- 自动扫描注解的bean -->
	<context:component-scan base-package="com.mucfc"/>

    <context:property-placeholder location="classpath:jdbc.properties" />
	<bean id="quartzDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
		<!-- <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}"/> --> 

	   <property name="driverClassName" value="${quartz.driverClassName}"/>
        <property name="url" value="${quartz.url}"/>
        <property name="username" value="${quartz.username}"/>
        <property name="password" value="${quartz.password}"/>
	</bean>

	<!-- quartz持久化存储  -->
	<bean name="quartzScheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="dataSource">
			<ref bean="quartzDataSource" />
		</property>
		<property name="applicationContextSchedulerContextKey" value="applicationContext" />
        <property name="quartzProperties">
        <props>
         <prop key="org.quartz.scheduler.instanceName">CRMscheduler</prop>
            <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
            <!-- 线程池配置 -->
            <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
            <prop key="org.quartz.threadPool.threadCount">20</prop>
            <prop key="org.quartz.threadPool.threadPriority">5</prop>
            <prop key="org.quartz.jobStore.misfireThreshold">120000</prop>
            <!-- JobStore 配置 -->
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
            <!-- 集群配置 -->
            <prop key="org.quartz.jobStore.isClustered">true</prop>
            <prop key="org.quartz.jobStore.clusterCheckinInterval">15000</prop>
            <prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">1</prop>
               <!-- 数据表设置 -->
            <prop key="org.quartz.jobStore.tablePrefix">qrtz_</prop>
            <prop key="org.quartz.jobStore.dataSource">qzDS</prop>
        </props>
        </property>
	</bean>
</beans>

其中数据源jdbc.properties:

############quartz db########################
quartz.driverClassName=com.mysql.jdbc.Driver
quartz.url=jdbc:mysql://127.0.0.1:3306/quartz?useUnicode=true
quartz.username=root
[email protected]
quartz.minPoolSize=7
quartz.initialPoolSize=12

5、测试类

package com.mucfc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
	public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
	 QuartzTest quartzTest=context.getBean("quartzTest",QuartzTest.class);
	         quartzTest.startSchedule();
             //quartzTest.resumeJob();

	}

}

输出结果:

查看数据表

停止程序,语句改成:

 //quartzTest.startSchedule();
quartzTest.resumeJob();

然后就可以发现任务接着运行了,运行完成完之后自动从数据表中删除:

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

时间: 2024-10-13 19:53:59

【Quartz】Quartz存储与持久化-基于Spring的配置的相关文章

【Quartz】Quartz存储与持久化-基于quartz.properties的配置

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.   Quartz存储与持久化 Quartz提供两种基本作业存储类型.第一种类型叫做RAMJobStore,第二种类型叫做JDBC作业存储.在默认情况下Quartz将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能,因为内存中数据访问最快.不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失. 比如我们希望安排一个执行100次的任务,如果执行到50次时系

简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)

前言: shiro因为其简单.可靠.实现方便而成为现在最常用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登录注销功能使用之外,也会根据惯例在文章最后总结一下shiro的大致配置使用流程,希望本篇文章能够后能给大家一种原来shiro这么简单的错觉感觉. 注意:该篇文章的开始是建立在一个完备的spring+mybatis的开发环境中,除了shiro之外的配置基本不会涉及到.做好自己--eguid原创文章 一.依赖的jar包 本篇文章使用shiro-1.4

【Quartz】基于Spring注解方式配置Quartz

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka         在上讲[Quartz]Spring3.2.9+Quqrtz2.2.1实现定时实例中,我们使用了XML的方式来配置Quartz定时任务,虽然比用API的方式简便多了,但是Spring还支持基本注解的方式来配置.这样做不仅更加简单,而且代码量也更加少了. 新建一个Java工程,导入要用到的包,Spring3.2.Quartz2.2.1.aopalliance-1.0.jar.co

基于spring+quartz的分布式定时任务框架

http://www.cnblogs.com/aaronfeng/p/5537177.html 问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比较快,因此,开发人员花费了更多的时间去更=跟上迭代的步伐,而缺乏了对整个系统的把控 没有集群之前,公司定时任务的实现方式 在初期应用的访问量并不是那么大,一台服务器完全满足使用,应用中有很多定时任务需要执行 有了集群之后,公司定时任务实现的方式 随着用户的增加,访问量也就随之增加,一台服务器满足不了

项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化

项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化 原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 弟子规 圣人训 首孝弟 次谨信 泛爱众 而亲仁 有余力 则学文 Written In The Font 需要:WEB-INF/lib/quartz-2.2.1.jar 基本步骤: web.xml注册监听器ScheduleStartListener 监听器类sedion.jeffli.wmuitp.lis

Quartz的简单使用,基于1.X(一)【入门及CronTrigger】

 什么是Quartz Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调度作业.它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联.简单地创建一个org.quarz.Job接口的Java类,Job接口包含唯一的方法:     public void execute(JobExecutionContext context) throws JobExecutionExceptio

【Quartz】将定时任务持久化到数据库

> 参考的优秀文章 Lesson 9: Job Stores > 用数据库存储定时任务信息 之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 如果用内存记录定时任务信息,应用重新启动后,定时任务信息将会丢失.比如,用户A通过系统设置1小时后执行Z操作,设置好后的,因系统重新启动,新启动的系统将会丢失“1小时后执行Z操作”的定时任务. 如果,我们需要在系统意外(或

spring注解配置quartz

常规配置quartz可以参考我的另外一篇博文:http://www.cnblogs.com/yangzhilong/p/3349116.html spring配置文件里增加: 命令空间: http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd 配置: <task:annotation-driven/> 当然这还需要扫描注解等常规配置. ja

Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解

原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解 代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm 有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz. 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; p