1.spring 注解类的配置:
<!-- 加载定时任务 :
需要配置多线程才能不会让任务与任务之间受到影响
默认的配置的单线程 需要配置线程池
-->
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="10" />
<task:annotation-driven scheduler="scheduler" executor="executor"/>
2.实体类 :
package com.jmp.quarz;
import com.jmp.comm.Utils.JsonUtil;
import com.jmp.service.UserService;
import com.jmp.sql.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Random;
/**
* spring task的特点:
1. 默认单线程同步执行
2. 一个任务执行完上一次之后,才会执行下一次调度
3. 多任务之间按顺序执行,一个任务执行完成之后才会执行另一个任务
4. 多任务并行执行需要设置线程池
5. 全程可以通过注解配置
*/
@Component
@Slf4j
public class MySpringTaskQuarzJobs {
@Resource
UserService userService;
/**
* 定时任务方法:
* 不一样的线程进行操作的
* 注解式的任务,在时间延迟的时候,大于相间隔的时间进行操作的,也会执行完再执行下一个操作
*/
@Scheduled(cron = "0/2 * * * * ? ")
public void run(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("run obj info : ",this.hashCode());
log.info("MyQuarzJobs job");
}
/**
* 注解式的定时任务操作:
* 当发生异常时,任务在相应的间隔时间进行执行
*/
@Scheduled(cron = "0/3 * * * * ? ")
public void runError(){
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Random rand = new Random();
int num = rand.nextInt();
if (num % 3 == 0) {
num = 9 / 0;
}
log.info("runError obj info : ",this.hashCode());
log.info("runError job");
}
/**
* 可以调用相应的服务类内容
*/
@Scheduled(cron = "0/5 * * * * ? ")
public void runService(){
log.info("--------> runService method <---------------");
List<User> list = userService.getUserList();
log.info(" json data : {}", JsonUtil.toJson(list));
log.info("--------> runService code : {}",this.hashCode());
log.info("runService end");
}
}
2.Quarz配置文件的配置方式:
quarz.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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- 要调用的工作类 -->
<bean id="quartzJob" class="com.jmp.quarz.QuarzJobs"></bean>
<!-- 任务配置列表 -->
<!-- <property name="targetObject" ref="quartzJob" />--><!-- 调用的类 -->
<!--<property name="targetMethod" value="runOne" />--> <!-- 调用类中的方法 -->
<!--<property name="concurrent" value="false"/>--><!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
<bean id="jobtask1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzJob" />
<property name="targetMethod" value="runOne" />
<property name="concurrent" value="false"/>
</bean>
<bean id="jobtask2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzJob" />
<property name="targetMethod" value="runTwo" />
<property name="concurrent" value="false"/>
</bean>
<bean id="jobtask3" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzJob" />
<property name="targetMethod" value="runThree" />
<property name="concurrent" value="false"/>
</bean>
<!-- 触发器配置 时间指定 -->
<bean id="cronTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobtask1" />
<!-- cron表达式 -->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
<bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobtask2" />
<!-- cron表达式 -->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
<bean id="cronTrigger3" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobtask3" />
<!-- cron表达式 -->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger1" />
<ref bean="cronTrigger2" />
<ref bean="cronTrigger3" />
</list>
</property>
</bean>
</beans>
引入到spring配置文件中(application.xml中):
<import resource="classpath:quartz.xml"/>
实体类内容:
package com.jmp.quarz;
import com.jmp.comm.Utils.JsonUtil;
import com.jmp.service.UserService;
import com.jmp.sql.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Random;
/**
Spring Quartz 特点:【按照配置文件时间表达式:准时准点(不延时的时候)】 ---> 配置到spring application.xml上
1. 默认多线程异步执行
2. 一个任务在上一次调度未完成执行,下一次调度时间到时,会另起一个线程开始新的调度。在业务繁忙时,一个任务或许会有多个线程在执行,导致数据处理异常。
3. 单任务同步:配置属性,可以使一个任务的一次调度在未完成时,而不会开启下一次调度
4. 多个任务同时运行,任务之间没有直接的影响,多任务执行的快慢取决于CPU的性能
一个类对应不一样的job方法并可以定义为不一样的job task任务 [看配置文件内容]
*/
@Component
@Slf4j
public class QuarzJobs {
@Resource
UserService userService;
/**
* Quarz 运行方法 : No.1方法
* 执行的对象是否一致 : 执行的对象是一致的
*/
public void runOne() {
log.info("--------> runOne method : {}",this.hashCode());
log.info("runOne end");
}
/**
* Quarz 运行方法 : No.2方法
* 故这个方法没有执行到 : 可以调用相应的service类内容
*/
public void runTwo() {
log.info("--------> runTwo method <---------------");
List<User> list = userService.getUserList();
log.info(" json data : {}", JsonUtil.toJson(list));
log.info("--------> runTwo code : {}",this.hashCode());
log.info("runTwo end");
}
/**
* Quarz 运行方法 : No.3方法
* 当执行error方法时 是否会继续执行任务内容
* 发生异常的时候则继续执行相应的任务的内容
*/
public void runThree() {
log.info("--------> runThree method <---------------");
Random rand = new Random();
int num = rand.nextInt();
if (num % 3 == 0) {
num = 9 / 0;
}
log.info("--------> runThree code : {}",this.hashCode());
log.info("runThree end");
}
}