quartz:Quartz是一个彻底由Java编写的开源任务调度的框架,经过触发器设置做业定时运行规则,控制做业的运行时间java
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency>
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())); } }
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(); } } }
定义job任务实现类,和SimpleTrigger同样。spring
启动任务app
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(); } } }
<quartz.version>2.2.3</quartz.version>
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency>
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 ,可是最后的结果是没法注入。框架
在构造方法中从spring容器中去获取须要的beanide
public JobTest() { this.userService= SpringContextKit.getBean("userService"); }
SpringContextKit代码ui
/** * 获取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); } }
@Component public class TaskBean { @Autowired UserService userService; private void executeTask(){ System.out.println("任务执行中"); System.out.println("userService:"+userService); } }
经过@Component 注解将任务bean交由spring容器进行管理,那么在此bean中就能够使用容器中的其余bena,好比这里的userService。this
<?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>