您的位置:首页 > 编程语言 > Java开发

quartz2.2.1和spring4.1.4整合使用

2016-09-20 01:54 381 查看

项目结构

下面是本例子最后的项目工程结构



下面,我们来跟着步骤搭建本项目吧。

往maven的pom文件中添加我们需要的jar

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>net.itaem.wen</groupId>
<artifactId>squartz</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<springframework.version>4.1.4.RELEASE</springframework.version>
<quartz.version>2.2.1</quartz.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- Transaction dependency is required with Quartz integration -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>

<!-- Quartz framework -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>

</project>

使用定时调度任务框架配置任务

在spring集成quartz时候,有两种方法配置job

使用MethodInvokingJobDetailFactoryBean来配置

这个方法是最简单的方法
<!-- For times when you just need to invoke a method on a specific object -->
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myBean" />
<property name="targetMethod" value="printMessage" />
</bean>

使用JobDetailFactoryBean来配置

当你需要更灵活,更加高级的配置的时候,可以选择这种方法去配置
<!-- For times when you need more complex processing, passing data to the scheduled job -->
<bean name="complexJobDetail"    class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="net.itaem.wen.ScheduledJob" />
<property name="jobDataMap">
<map>
<entry key="anotherBean" value-ref="anotherBean" />
</map>
</property>
<property name="durability" value="true" />
</bean>


下面是ScheduledJob代码

package net.itaem.wen;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
* @author: Fighter168
*/
public class ScheduledJob extends QuartzJobBean{

private AnotherBean anotherBean;

@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
anotherBean.printAnotherMessage();
}

public void setAnotherBean(AnotherBean anotherBean) {
this.anotherBean = anotherBean;
}
}

配置Quartz中需要用到的Trigger

Trigger的配置也有两种类型

简单的Trigger,使用SimpleTriggerFactoryBean创建

<!-- Run the job every 2 seconds with initial delay of 1 second -->
<bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="simpleJobDetail" />
<property name="startDelay" value="1000" />
<property name="repeatInterval" value="2000" />
</bean>

使用CronTriggerFactoryBean创建Cron Trigger

这个用起来比较灵活

<!-- Run the job every 5 seconds only on Weekends -->
<bean id="cronTrigger"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="complexJobDetail" />
<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />
</bean>


配置SchedulerFactoryBean

配置SchedulerFactoryBean也就是创建和配置QuartzScheduler
<!-- Scheduler factory bean to glue together jobDetails and triggers to Configure Quartz Scheduler -->
<bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="simpleJobDetail" />
<ref bean="complexJobDetail" />
</list>
</property>

<property name="triggers">
<list>
<ref bean="simpleTrigger" />
<ref bean="cronTrigger" />
</list>
</property>
</bean>


下面是spring-scheduler.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="net.itaem.wen" />

<!-- For times when you just need to invoke a method on a specific object --> <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="myBean" /> <property name="targetMethod" value="printMessage" /> </bean>

<!-- For times when you need more complex processing, passing data to the scheduled job -->
<bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="net.itaem.wen.ScheduledJob" />
<property name="jobDataMap">
<map>
<entry key="anotherBean" value-ref="anotherBean" />
</map>
</property>
<property name="durability" value="true" />
</bean>

<!-- Run the job every 2 seconds with initial delay of 1 second -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="simpleJobDetail" />
<property name="startDelay" value="1000" />
<property name="repeatInterval" value="2000" />
</bean>

<!-- Run the job every 5 seconds only on Weekends -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="complexJobDetail" />
<property name="cronExpression" value="0/5 * * ? * *" />
</bean>

<!-- Scheduler factory bean to glue together jobDetails and triggers to Configure Quartz Scheduler --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobDetails"> <list> <ref bean="simpleJobDetail" /> <ref bean="complexJobDetail" /> </list> </property> <property name="triggers"> <list> <ref bean="simpleTrigger" /> <ref bean="cronTrigger" /> </list> </property> </bean>

</beans>


spring-mvc.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd"> 
<import resource="spring-scheduler.xml"/>

</beans>


创建简单的POJO的任务

net.itaem.wen.MyBean

package net.itaem.wen;

import org.springframework.stereotype.Component;
/**
* @author: Fighter168
*/
@Component("myBean")
public class MyBean {

public void printMessage() {
System.out.println("I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean");
}

}

net.itaem.wen.ScheduledJob

package net.itaem.wen;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
* @author: Fighter168
*/
public class ScheduledJob extends QuartzJobBean{

private AnotherBean anotherBean;

@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
anotherBean.printAnotherMessage();
}

public void setAnotherBean(AnotherBean anotherBean) {
this.anotherBean = anotherBean;
}
}

创建一个测试

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* @author: Fighter168
*/
public class AppMain {
public static void main(String args[]){
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-mvc.xml");
}
}


下面是程序运行结果:



从上面可以看出,有两个定时任务执行了,一个是两秒执行一次,一个是五秒执行一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: