目录
quartz 定时任务使用
工作中难免会用都定时任务,如果公司针对定时任务没有特别的要求,分布式定时任务你可以选择开源的定时任务elastic-job,与spring结合简单方便(当然需要zookeeper的支持);但是如果你所在的公司针对部分开源不感冒,或者有自己的组件化团队,或者自研的定时任务框架还在研发中,那么你只能选择java自带的Timer,或者Quartz,或者Spring3.0以后自带的task。这里我们介绍下Quartz的使用,感觉应用还是比较广泛的的。
准备工作
引入以下jar包:spring-context-support、quartz
<!--定时任务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
xml配置定时任务
- java类:代码自定义的类,Job中业务逻辑
- Job:任务job包括job需要的各种属性
- Trigger:触发器定义job的执行规则,经常使用SimpleTrigger、CroTrigger
- Scheduler:调度器管理Job、Trigger。一个Job可以有多个Trigger,一个Trigger只能对应一个Job
/**
* @author yxf
*/
public class AdminJob {
public void job1() {
System.out.println("执行定时任务-job");
try {
System.out.println("定时任务执行中...");
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println("定时任务-job执行异常");
}
System.out.println("执行定时任务-job 结束");
}
}
<bean id="adminJob" class="com.yxf.job.AdminJob"/>
<!--此处id值为需要执行的定时任务方法名-->
<bean id="job1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="adminJob"/>
<property name="targetMethod" value="job1"/>
<!--作业不并发调度-->
<property name="concurrent" value="false"/>
</bean>
<!--此处为定时任务触发器-->
<bean id="job1Trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="job1"/>
<property name="cronExpression" value="0/1 * * * * ?"/>
<property name="description" value="job1定时任务触发器"/>
</bean>
<!-- 触发器 -->
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="job1Trigger"/>
</list>
</property>
</bean>
<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="1"/>
<property name="maxPoolSize" value="2"/>
<property name="queueCapacity" value="2"/>
</bean>
执行结果分析
--->代码中我们让线程睡了3s;定时任务我们配置的为每隔1s执行一次;目前是每隔3s执行一次
控制定时任务是否并发的配置,默认为true。当为true时同一个定时任务如果还未执行完,到时间点后还会再次开启;
<!--作业不并发调度-->
<property name="concurrent" value="false"/>我们看下concurrent=true时的执行结果
其它方式-注解配置
<!--计划任务配置,用 @Service @Lazy(false)标注类,用@Scheduled(cron = "0 0 2 * * ?")标注方法-->
<task:annotation-driven/>
<!-- 自动扫描注解的bean -->
<context:component-scan base-package="com.yxf.job"/>
来源:CSDN
作者:落日下的茅屋
链接:https://blog.csdn.net/weixin_34221904/article/details/104620434