Spring整合Quartz案例使用RAM存储方式

spring整合quartz有两种任务存储方式,RAM存储方式和JDBC存储方式,企业开发使用的JDBC存储方式。

先从RAM存储方式开始说起 

目录

Jar包依赖

quartz-config.xml

创建jobDetail

依赖org.springframework.scheduling.quartz.JobDetailFactoryBean

依赖org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

创建触发器

创建SimpleTrigger

创建CronTrigger

定义调度器scheduler

测试


Jar包依赖

因为整合spring过程中对quartz和spring都有版本上的要求,便于管理使用maven

<!-- quartz 的jar -->
    <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>
    <!-- spring相关jar -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>3.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>

    <!-- 日志相关jar包 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency><!--   Failed to load class "org.slf4j.impl.StaticLoggerBinder". -->
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.13</version>
    </dependency>
    <!-- MySql的包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.31</version>
    </dependency>

quartz-config.xml

将quartz的创建交给spring,整合的步骤

创建jobDetail

spring中有两种方式:

依赖org.springframework.scheduling.quartz.JobDetailFactoryBean

要求任务类必须实现job接口,而且需要将durability属性配置为true,否则容器初始化时候,因为没有触发器和任务关联会报错。

工作类:

public class HelloJob  implements Job{

	public void execute(JobExecutionContext paramJobExecutionContext)
			throws JobExecutionException {
		System.out.println("触发simpleScheduler的任务.....");
	}
}
  <!-- 定义任务1-->
        <bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        	<!-- 定义job名称,group名称 -->
        	<property name="name" value="myjob1"></property>
        	<property name="group" value="group1"></property>
        	<!-- 指定job类 -->
        	<property name="jobClass" value="cn.bing.quartz.HelloJob"></property>
        	<!-- 必须设置为true,当没有活动的触发器和任务关联,调度器会自动删除任务 -->
        	<property name="durability" value="true"></property>
        	<!-- 指定spring上下文容器的key,这样在execute方法中,就能获取到上下文,从而获取到bean -->
        	<property name="applicationContextJobDataKey" value="applicationContext"></property>
        </bean>

依赖org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

不要求任务类必须实现job接口

工作类:

public class TestJob {
	public void work(){
		System.out.println("北京时间:"+new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())+"执行cron触发的任务");
	}
}
 <bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
           	<!-- 指定工作类 -->
            <property name="targetObject">
				<bean class="cn.bing.quartz.TestJob"></bean>
            </property>
            <!-- 工作类的执行方法 -->
            <property name="targetMethod">
                <value>work</value>
            </property>
        </bean>

创建触发器

创建两种常见的触发器simpleTrigger和cronTrigger,分别注册到上面两种方式生成的jobDetail

创建SimpleTrigger

  <!-- 定义触发器 -->
        <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        	<!-- 定义触发器名称 -->
        	<property name="name" value="trigger1"></property>
        	<!-- 定义所属组的名称 -->
        	<property name="group" value="group1"></property>
        	<!-- 执行间隔是5s -->
        	<property name="repeatInterval" value="5000"></property>
        	<!-- 执行次数10次 -->
        	<property name="repeatCount" value="10"></property>
        	<!-- 绑定的任务 -->
        	<property name="jobDetail" ref="jobDetail1"></property>
        </bean>

创建CronTrigger

<!-- 定义cron触发器 -->
         <!-- 2.2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 指定Trigger的名称 -->
        <property name="name" value="hw_trigger"/>
        <!-- 指定Trigger的名称 -->
        <property name="group" value="hw_trigger_group"/>
        <!-- 指定Tirgger绑定的Job -->
        <property name="jobDetail" ref="jobDetail2"/>
        <!-- 指定Cron 的表达式 ,当前是每隔1s运行一次 -->
        <property name="cronExpression" value="0/1 * * * * ?" />
    </bean>

定义调度器scheduler

将触发器注册到任务中

 <!-- 定义调度器,将触发器注册到任务中 -->
        <bean id="scheduler1" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" 
        lazy-init="false"
        >
        	<property name="triggers">
        		<list>
					<ref bean="simpleTrigger"/>
					<ref bean="cronTrigger"/>
        		</list>
        	</property>
        </bean>

测试

public class JunitTest {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	}
}

spring容器创建,就会启动quartz,触发任务执行

执行结果:

北京时间:20180802 14:55:25:  执行cron触发的任务
14:55:25.004 [scheduler1_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
14:55:25.540 [scheduler1_Worker-4] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.myjob1
14:55:25.541 [scheduler1_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
北京时间:20180802 14:55:25:   执行simpleScheduler触发的任务.....
14:55:26.001 [scheduler1_Worker-5] DEBUG org.quartz.core.JobRunShell - Calling execute on job DEFAULT.jobDetail2
北京时间:20180802 14:55:26:  执行cron触发的任务
14:55:26.003 [scheduler1_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
14:55:27.003 [scheduler1_Worker-6] DEBUG org.quartz.core.JobRunShell - Calling execute on job DEFAULT.jobDetail2
14:55:27.003 [scheduler1_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
北京时间:20180802 14:55:27:  执行cron触发的任务

参考博客:https://blog.csdn.net/u010648555/article/details/54891264

源码下载:https://download.csdn.net/download/ditto_zhou/10579402

猜你喜欢

转载自blog.csdn.net/Ditto_zhou/article/details/81358437
今日推荐