黑马程序员技术交流社区

标题: 【石家庄】定时任务(一) [打印本页]

作者: 花祭-    时间: 2017-12-27 16:51
标题: 【石家庄】定时任务(一)
本帖最后由 小石姐姐 于 2017-12-27 18:55 编辑

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特点:
默认单线程同步执行
一个任务执行完上一次之后,才会执行下一次调度
多任务之间按顺序执行,一个任务执行完成之后才会执行另一个任务
多任务并行执行需要设置线程池
全程可以通过注解配置




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2