zoukankan      html  css  js  c++  java
  • Spring 自动定时任务配置

    Spring中可以通过配置方便的实现周期性定时任务管理,这需要用到以下几个类:
     
    org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean--配置需要调度的Bean的某个方法
    org.springframework.scheduling.quartz.SimpleTriggerBean--定时器,负责配置启动时间、执行周期
    org.springframework.scheduling.quartz.SchedulerFactoryBean--触发器,负责配置所有定时器
     
    实例如下:
     

    <bean id="taskService" class="com.mrd.task.TaskService"></bean>
    <bean id="autoTask" class ="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject">
    <ref bean="taskService"/> 
    </property>
    <property name="targetMethod">
    <value>doTask</value>
    </property>
    </bean>
    <bean id="autoTaskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="startDelay"><value>300000</value></property>
    <property name="repeatCount"><value>-1</value></property>
    <property name="repeatInterval"><value>28800000</value></property>
    <property name="jobDetail"><ref bean="autoTask" /></property>
    </bean>
    <bean id ="triggersStarter" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" singleton="true"> 
    <property name="triggers"> 
    <list> 
    <ref bean="autoTaskTrigger"/>
    </list> 
    </property>
    <property name="autoStartup">
    <value>true</value>
    </property>
    </bean >
    

      

    注意以上4个Bean需要按顺序配置,从配置属性的字面意思,应该很容易理解具体的参数含义。
    另外对SchedulerFactoryBean的使用需要注意以下几个方面:
     
     
     
    1、SchedulerFactoryBean会自动启动。
    当在spring文件中定义了多个SchedulerFactoryBean实例时,一定要小心,因为这些ScheduleFactoryBean自从load进程序里,就会自动启动。如果要手动控制,注意要将autoStartup属性设置为false,注意如果没有singleton="true",SchedulerFactoryBean就不是单独存在的,autoStartup也就不能很好的手动控制
    定时器。
     
    2、SchedulerFactoryBean暴露的是Scheduler,而不是SchedulerFactoryBean。
    SchedulerFactoryBean实现了FactoryBean接口,必须实现两个方法,一个是getObjectType,另外一个则是getObject;其中getObjectType定义了返回的类型应该为Scheduler,而getObject指定了返回的是其一个重要属性scheduler,这个scheduler就是我们要获得的调度。
     
    若在配置文件里为SchedulerFactoryBean定义了id属性为"scheduler",则在程序里调用getBean时,需要注意getBean("scheduler")返回的是Scheduler对象
     
    3、
    SchedulerFactoryBean中有两个很重要的属性,一个是scheduler,另外一个是schedulerFactoryClass,spring通过用schedulerFactoryClass做代理来产生调度,并把它赋给scheduler。
     
    private Class schedulerFactoryClass = StdSchedulerFactory.class;
    //如果你没有指定schedulerFactoryClass ,那么它用的是quartz中自带的调度工厂,
    this.scheduler = createScheduler(schedulerFactory, this.schedulerName);
    //这里的schedulerName默认传进来是空的,其实如果你不是用自己定义的schedulerFactoryClass
    //恐怕也没有什么意义,因为createScheduler是这样调用的
    return schedulerFactory.getScheduler();
    //显然schedulerName并没有用到,除非是你自行写一个schedulerFactory,并做好相应处理,
    //否则返回的这个scheduler一定是一个指定名称的调度
    Scheduler sched = schedRep.lookup(getSchedulerName());
    //这个sched就是要代理生成的scheduler,getSchedulerName只有一句话,如下:
    cfg.getStringProperty(PROP_SCHED_INSTANCE_NAME,"QuartzScheduler");
    //如果我们没有使用一些特殊的机制,那么返回的只能是一个固定的字符串。
     
    如上说述,如果我们希望不进行改造,就在spring的配置文件中定义多个调度的方法来实现我们个性化的任务安排时,可能并不可行。因为spring配置的scheduler只能有一个,即使你定义了多个调度,那么其实实现的只有一个,只是所有你希望指向不同调度的id都会指向它罢了,而这个调度会包含了其它所有调度中的任务。
     
     
    4、抱错:org.quartz.SchedulerException: Repeat Interval cannot be zero
    场景:该错误通常是在引用了SimpleTriggerBean的时候没有为repeatCount和repeatInterval赋值发生的,很奇怪,SimpleTriggerBean有一个空构造函数,在里面直接为repeatCount赋了一个REPEAT_INDEFINITELY,这样,当其进入validate函数时,会抱错。而quartz中的SimpleTrigger这两个属性默认值均为0,不懂spring中为何这样处理。
     
    5、quartz和crontab的区别
    a、quartz属于用户级别,crontab则属于系统级别;
    b、quartz调度的线程,所有线程共享一个jvm;crontab调度的则是应用,每个应用都独立的占用资源。
     
    6、quartz中加入并发多线程分析
    a、quartz本身是有线程池支持的,这个可以用org.quartz.threadPool.threadCount属性来设置线程池大小,quartz的任务可以由quartz的线程池自动调度
    b、对每个任务也可能起多线程,但是需要对并发数量做控制,可以考虑使用commons-pools提供的对象池机制

  • 相关阅读:
    mysqldump 导出数据库为DBname的表名为Tname的表结构 导出数据库的所有表的表结构
    mysqldump 备份某张表 Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions,
    nfs missing codepage or helper program, or other error
    date 增加一个小时 减少一个小时
    mysqldump 备份单个数据库
    mysql删除账户
    怎么删除某个用户的所有帖子?
    mongodb删除重复数据
    ReSharper2018破解详细方法
    激活windows和office
  • 原文地址:https://www.cnblogs.com/yuyu666/p/10060601.html
Copyright © 2011-2022 走看看