最近工作中用到了quartz定时器,我自己写了个测试方法,或许用得上。
项目结构:
pom.xml配置
<properties>
<quartz.version>2.2.3</quartz.version>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<dependencies>
<!--quartz定时器相关依赖-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>${quartz.version}</version>
</dependency>
<!--spring相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
spring-quartz.xml配置:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.xsd">
<!--要执行任务的类-->
<bean id="lazyrefundJob" class="com.myTest.TestQuartz"></bean>
<bean id="everyQuartzClock"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<!--要执行任务的类-->
<ref bean="lazyrefundJob" />
</property>
<!--执行是类中的test()方法-->
<property name="targetMethod" value="test"></property>
<!--quartz默认为并发执行。这里将concurrent属性配置为false,不允许任务并发执行-->
<property name="concurrent" value="false"></property>
</bean>
<bean id="crontestJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="everyQuartzClock"></ref>
</property>
<!--配置触发时间-->
<property name="cronExpression">
<value>0/1 * * * * ?</value>
</property>
</bean>
<!-- 总配置 -->
<bean name="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--添加触发器-->
<property name="triggers">
<list>
<!--可以添加多个定时任务-->
<ref bean="crontestJobTrigger" />
</list>
</property>
</bean>
</beans>
编写测试类TestQuartz:
public class TestQuartz {
public void test() {
System.out.println("测试定时器--"
+new SimpleDateFormat("北京时间HH时mm分ss秒").format(new Date()));
}
}
因为我的这个测试项目并非web项目,所以我还得写一个启动Spring容器的方法。如果是web项目,在web.xml中配置好Spring相关的内容后启动Tomcat就可以让定时任务跑起来了。此处帖出我的启动方法:
AppStart:
public class AppStart {
private static Logger logger = Logger.getLogger(AppStart.class);
public static void main(String[] args) {
// ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
// new String[] { "classpath:spring-quartz.xml" });
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring-quartz.xml" );
context.start();
logger.info("服务启动成功!");
}
}
启动main方法:
-------------------------------2018.08.13分割线---------------------------------
使用Spring Boot 添加定时任务:
用Spring Boot相比上面配置一大堆xml,可谓是清爽很多了!
项目结构图:
pom.xml配置:
<dependencies>
<!--定时器相关的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
添加测试方法:
@Component
@EnableScheduling
public class TestQuartz {
@Scheduled(cron = "0/1 * * * * ?")
public void test() {
SimpleDateFormat sf = new SimpleDateFormat("北京时间HH时mm分ss秒");
System.out.println("测试定时器--"
+sf.format(new Date()));
}
}
启动SpringBootDemoApplication的main方法,让定时器跑起来!