当前位置: 首页 > article >正文

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中为何这样处理。
5quartzcrontab的区别
aquartz属于用户级别,crontab则属于系统级别;
bquartz调度的线程,所有线程共享一个jvmcrontab调度的则是应用,每个应用都独立的占用资源。
6quartz中加入并发多线程分析
aquartz本身是有线程池支持的,这个可以用org.quartz.threadPool.threadCount属性来设置线程池大小,quartz的任务可以由quartz的线程池自动调度
b、对每个任务也可能起多线程,但是需要对并发数量做控制,可以考虑使用commons-pools提供的对象池机制

 

http://www.lryc.cn/news/2414071.html

相关文章:

  • 【JavaScript】用于模拟 word 生成网页页面的插件
  • DuplicateHandle的应用
  • 逆向破解crackme简要分析
  • SCJP基本概念
  • 数字逻辑实验——138译码器
  • Linux之ClamAV杀毒软件YUM安装和使用
  • 外网如何访问公司内网?
  • 使用C#中的CultureInfo类实现全球化
  • 代理IP协议选择攻略:HTTP、HTTPS、SOCKS5协议该如何选?
  • 什么是栈?什么是堆?
  • 有关完整的闭路监控系统组成、设备简介、原理
  • 汇编(五):第一个汇编程序
  • php小h站视频系统源码,苹果cms v10x 原创自适应x站h站源码 视频模板 带试看功能 带自动采集YM源码...
  • 巨星陨落!清华大学发讣告
  • MotionEvent 概述
  • 2021-04-29
  • Java简单基础知识汇总
  • 入门到精通,掌握这些SQL语句让你成功玩转数据库!
  • Linux中文本搜索命令grep用法详解
  • 何为时域和频域?
  • PHP安装与配置指南
  • C#编程概述
  • mysql红黑联盟_MySQL - mysql数据库栏目 - 红黑联盟
  • c#编码技巧(三):EventArgs的使用
  • ThreadStart和ParameterizedThreadStart的区别
  • Java中的堆和栈
  • 炫彩界面库v1.4.2-360安全卫士v8.5-UI设计器使用教程
  • 软件测试---软件测试开发基础
  • piwik 访客跟踪(一)
  • JS--JavaScript节点插入、删除、替换、克隆(appendChild、cloneNode、insertBefore、normalize、removeChild、replaceChild)