黑马程序员技术交流社区
标题:
【石家庄校区】Quartz 任务调度框架与spring task
[打印本页]
作者:
江南樵夫
时间:
2017-12-9 14:59
标题:
【石家庄校区】Quartz 任务调度框架与spring task
本帖最后由 小石姐姐 于 2017-12-11 16:16 编辑
Quartz 任务调度框架
启动定时任务的框架
引入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
JobDetail & Job: JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中
Trigger: 定义触发的条件
Scheduler:调度器。所有的调度都是由它控制
spring 整合 quartz
applicationContex.xml
<!-- 扫描包 -->
<context:component-scan base-package="cn.itcast.quartz"></context:component-scan>
<!-- jobDetail 实现类, 具体工作的人 -->
<bean id="helloDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 找类名是hellojob类 -->
<property name="targetObject" ref="helloJob"></property>
<!-- 通过反射找指定的方法 -->
<property name="targetMethod" value="hello"></property>
</bean>
<!-- tirgger cron 触发器-->
<bean id="helloTirgger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="helloDetail"></property>
<!-- 间隔时间表达式 -->
<property name="cronExpression" value="0/5 * * * * ?"></property>
</bean>
<!--scheduler 将触发器加载到 quartz中 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<array>
<ref bean="helloTirgger"/>
</array>
</property>
</bean>
对应的类
//该注解默认会生成类名首字母小写的 bean 的id
@Component
public class HelloJob {
@Autowired
private HelloService helloService;
public void say(){
helloService.sayService();
}
public void hello(){
System.out.println("Hello job ...");
}
}
@Service
public class HelloService {
public void sayService(){
System.out.println("Service method .....");
}
}
spring task 任务调度
配置文件
<task:scheduled-tasks>
指向helloJob类的 hello方法
<task:scheduled ref="helloJob" method="hello" cron="0/5 * * * * ?"/>
</task:scheduled-tasks>
使用注解
在方法上加注解 @Scheduled(cron="0/5 * * * * ?")
quartz多线程
task 是绑定到当前线程
Spring Quartz 特点:
默认多线程异步执行
一个任务在上一次调度未完成执行,下一次调度时间到时,会另起一个线程开始新的调度。在业务繁忙时,一个任务或许会有多个线程在执行,导致数据处理异常。
单任务同步:配置属性,可以使一个任务的一次调度在未完成时,而不会开启下一次调度
多个任务同时运行,任务之间没有直接的影响,多任务执行的快慢取决于CPU的性能
SchedulerFactoryBean不能使用注解来配置?还是我没找到注解的方法?
Spring Task特点:
默认单线程同步执行
一个任务执行完上一次之后,才会执行下一次调度
多任务之间按顺序执行,一个任务执行完成之后才会执行另一个任务
多任务并行执行需要设置线程池
全程可以通过注解配置
作者:
小石姐姐
时间:
2017-12-11 16:16
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2