quartz:Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间
1、SimpleTrigger
1.1、引入jar
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
1.2、定义任务类
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloJob implements Job{
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//具体的业务逻辑
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("hello word"+format.format(new Date()));
}
}
1.3、创建JobDetail,Striiger,Schedule
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
/**
* Created by Administrator on 2017/6/23.
*/
public class HelloScheduler {
public static void main(String[] args) {
//创建 jobDetail 绑定到 job
JobDetail jobDetail= JobBuilder.newJob(HelloJob.class).withIdentity("任务名称","任务组") .build();
//创建trigger 启动任务并在3秒后执行任务 并且只执行一次
Date startTime=new Date();//任务执行时间点
startTime.setTime(startTime.getTime()+3000);
SimpleTrigger trigger= (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("SimpleTrigger name","SimpleTrigger group")
.startAt(startTime)
.build();
//创建 schedule 实例
SchedulerFactory schedulerFactory=new StdSchedulerFactory();
Scheduler scheduler= null;
try {
scheduler = schedulerFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
2、CronTrigger
定义job任务实现类,和SimpleTrigger一样。
启动任务
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* Created by Administrator on 2017/6/23.
* 表达式: 秒 分 时 日 月 周 年(可选)
*/
public class HelloCronScheduler {
public static void main(String[] args) {
//创建 jobDetail 绑定到 job
JobDetail jobDetail= JobBuilder.newJob(HelloJob.class).withIdentity("任务名称","任务组").build();
//创建trigger 每两秒执行一次jobDetail
CronTrigger trigger= TriggerBuilder.newTrigger().withIdentity("任务触发器name","触发器组name")
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
.build();
//创建 schedule 实例
SchedulerFactory schedulerFactory=new StdSchedulerFactory();
Scheduler scheduler= null;
try {
scheduler = schedulerFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
3、集成到spring
3.1、引入jar
<quartz.version>2.2.3</quartz.version>
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency>
3.2、定义任务类
public class JobTest implements Job {
@Autowired
UserService userService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("任务执行中");
System.out.println("userService:"+userService);
}
}
可以在spring容器启动成功后执行这个任务,在任务类中尝试注入UserService ,但是最后的结果是无法注入。
3.3、解决注入问题
在构造方法中从spring容器中去获取需要的bean
public JobTest() {
this.userService= SpringContextKit.getBean("userService");
}
SpringContextKit代码
/**
* 获取spring容器中的组件
*/
@Component
public class SpringContextKit implements ApplicationContextAware {
private static ApplicationContext context = null;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
/**
*
* @param beanName 需要在接口实现类上标注 如@Service("userService")
* @param <T>
* @return
*/
public static <T> T getBean(String beanName){
return (T) context.getBean(beanName);
}
}
3.4、在spring.xml中配置任务
3.4.1、定义任务类
@Component
public class TaskBean {
@Autowired
UserService userService;
private void executeTask(){
System.out.println("任务执行中");
System.out.println("userService:"+userService);
}
}
通过@Component 注解将任务bean交由spring容器进行管理,那么在此bean中就可以使用容器中的其他bena,比如这里的userService。
3.4.2、配置spring-quartz.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.xsd">
<!--jobDetail -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="taskBean"/>
<property name="targetMethod" value="executeTask"/>
<property name="concurrent" value="false"/>
</bean>
<!--jobDetail 触发器 定义任务执行规则-->
<bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"/>
<!--每五秒执行一次任务-->
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>
<!--任务调度-->
<bean id="schedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="trigger1"/>
</list>
</property>
<property name="autoStartup" value="true"/>
</bean>
</beans>