Spring定时器的实例

上传人:feng****heng 文档编号:187724201 上传时间:2023-02-16 格式:DOCX 页数:13 大小:25.36KB
收藏 版权申诉 举报 下载
Spring定时器的实例_第1页
第1页 / 共13页
Spring定时器的实例_第2页
第2页 / 共13页
Spring定时器的实例_第3页
第3页 / 共13页
资源描述:

《Spring定时器的实例》由会员分享,可在线阅读,更多相关《Spring定时器的实例(13页珍藏版)》请在装配图网上搜索。

1、1) ScheduledTimer.java:package com.str on git.zwjc.i nfopush.vo;import java.util.Cale ndar; import java.util.Date;import java.util List;import com.str on m on .dao.BaseDAO;import com.str on git.zwjc.i nfopush.po.Affiche info;import com.stro ngit.zwjc.i nfopush.po.I nfopushDocClass;import com.str on

2、git.zwjc.i nfopush.po.Performa nee;import com.str on git.zwjc.util.TimeKitl;/*定一个定时查询的类*/ public class ScheduledTimer /*定时运行的方法*/private BaseDAO baseDaoImpl;SuppressWar nin gs( un checked, deprecati on ) public void startRun() throws Exception /第一,查询类型表中的规则Cale ndar now = Cale ndar.get In sta nce();

3、SuppressWar nin gs( unu sed)int nowDay = now.get(Cale ndar.DAY_OF_MONTH);int nowMo nth = now.get(Cale ndar.MONTH) + 1;List In fopushClassList = this.baseDaoImpl .fin dAll( In fopushDocClass. class);Str ing docPushRule = mo nthly:15;SuppressWar nin gs( unu sed)Stri ng mon thly =;Str ing strDay =;int

4、in tDay = 0;Str ing classId =;Stri ng className =;Stri ng orgId =;Stri ng orgName = orgName;/In fopushDoc in fopushDoc = n ull;List in fopushDocList = null ;Performa nee performa nee = null ;Affiche info affiche info = n ull ;Str ing strSffiche info =;ListvPerforma nce performa nceList = n ull ;Date

5、 performa nceDate = TimeKitl.getDateByStri ng(TimeKit1. no w(short); for (In fopushDocClass in fopushDocClass : In fopushClassList) docPushRule = in fopushDocClass.getDocPushRule();classId = in fopushDocClass.getClassId();orgId = in fopushDocClass.getOrgId();mon thly = docPushRule.split(:)0;strDay =

6、 docPushRule.split(:)1;in tDay = In teger.parse In t(strDay);此方法只能适应与月报if (no wDay = in tDay) in fopushDocList = this.baseDaoImpl.findAII(FROM InfopushDoc idoc where idoc.infopushDocClass.classId=+ classId+ and idoc.orgId =+ orgId+ “);int totalsize = in fopushDocList.size();performa nceList = this.b

7、aseDaoImpl.fi ndAII(Performa nce.class); if(totalsize0)boolea n flag = false ;for(Performa nee performa nce2:performa nceList)int performa nceMo nth = performa nce2.getPerforma nceDate().getMo nth()+1 ;if( no wMo nth=performa nceMo nth)flag = true ;break ;if(flag)else/有数据加分className = in fopushDocCl

8、ass.getClassName();orgName = in fopushDocClass.getOrgName();performa nee = new Performa nce();performa nce.setClassId(classId);performa nce.setOrgId(orgId);performa nce.setOrgName(orgName);performa nce.setClassName(className);performa nce.setPerforma nceDate(performa nceDate);performa nce.setScore(L

9、 on g.valueOf(T); this.baseDaoImpl.i nsert(performa nee);elseboolea n flag = false ;for(Performa nee performa nce2:performa nceList)int performa nceMo nth = performa nce2.getPerforma nceDate().getMo nth()+1 ;if( no wMo nth=performa nceMo nth)flag = true ;break ;if(flag)else/没有数据为0分,并且通报orgName = in

10、fopushDocClass.getOrgName();className = in fopushDocClass.getClassName();performa nee = new Performa nce();performa nce.setClassId(classId);performa nce.setClassName(className);performa nce.setOrgld(orgld);performa nce.setOrgName(orgName);performa nce.setPerforma nceDate(performa nceDate);performa n

11、ce.setScore(L on g.valueOf(0);this.baseDaoImpl.i nsert(performa nee);className = in fopushDocClass.getClassName();affiche info = new Affiche info();affichei nfo.setClassld(classld);affichei nfo.setOrgld(orgld);affiche in fo.setAffiche in foDate(performa nceDate);strSfficheinfo =【+TimeKit1.getNowDate

12、()+】【+orgName+】未推送【 +className+】分类文献信息;affiche in fo.setAffiche In fo(strSffiche info);affiche in fo.setClassName(className);affiche in fo.setOrgName(orgName); this.baseDaoImpl.i nsert(affiche info);System.out.println(成功插入! !);public BaseDAO getBaseDaoImpl() retur n baseDaoImpI;public void setBaseDa

13、oImpl(BaseDAO baseDaoImpl) this.baseDaoImpl = baseDaoImpl;applicatio nCon text-i nfopush-timer.xml: startR unv/valuev/bea nvbea n id=cr on Triggerclass=org.spr in gframework.scheduli ng.quartz.Cr on TriggerBea n vproperty name=jobDetailvref bean=scheduledTask /v/propertyvproperty name=cronExpression

14、vvalue0 0 12 * * ?v/valuev/propertyv/bea nv!-管理触发器的总设置,可以放置多个触发器。-vbean autowire=noclass=org.spr in gframework.scheduli ng.quartz.SchedulerFactoryBea n vproperty name=triggersvlistvref bea n=cr on Trigger /v/listv/propertyv/bea nv/beans两者结合就能实现定时运行程序!Spring 的任务调度管理Spring 的任务调度管理从兴公司 | 陈百平在项目开发中,有不少程

15、序需要定时触发。比如,统计报表程序需要在每月初运行一次,对 上月份数据进行统计。而这种触发,在 unix 上就是使用 crontab 或 at 命令来指定。其中 at 命令可以设定程序在某年某月某日、何时何分定时启动,at命令只执行一次程序。而crontab 则可以设定程序在指定的时刻重复执行。在window操作系统中也有类似的命令。Window 的at命令在功能上基本与unix的一致。Window控制面板中的“任务计划”与unix上从crontab 类似,只是它是基于图形界面的,更人性化一些。在开发上一个项目时,我遇到以下这样的一个问题。项目是java+tomcat开发的,在window 系

16、统上运行,但我们没有该服务器上的管理员权限(因为该服务器上还运行着其它重要的系 统,管理员只给了我们一个最低权限的帐号),无法配置“任务计划”。我们使用该功能的话, 需要打申请,通过客户的系统管理员帮我们配置。考虑到我们的业务统计报表程序需要有一 段稳定期,期间必定需要做不少的修正,每修改一次,都需要打申请后才能测试,一个流程 下来会耗费不少时间。另外,数据库连接使用了tomcat自带的连接池,如果使用了 window 的任务计划,则需要启动独立于tomcat的应用程序,而项目组中没有人知道如何在这个应 用程序获取tomcat连接池中的数据库连接。替代方法是不使用tomcat的连接池,并给这个

17、 应用程序配置独立数据库参数配置文件。这样的话在应用程序中获取数据库连接的方法就得 改动,并且需要维护两套配置文件,也挺麻烦。最后经小组商讨,决定自己编写定时服务调度线程,并随tomcat应用程序一起启动运行, 共用 tomcat 的数据库连接池。为此,我们耗费了一个工作周的开发时间。最惨的是,服务 调度线程运行不太稳定,有时还需人工干预一下。最近看Spring,发现Spring有任务调度管理功能,能很好地解决以上的问题。于是我们决 定将定时程序迁移到Spring中。下面就结合我们这次程序的迁移,介绍一下如何使用Spring 的任务调度。在讨论Spring的任务调度前,我们先谈谈Spring。

18、仔细探究Spring,你会发现很多有趣的东 西。第一,Spring中并没有多少新技术,就如AOP这些概念,其实于上个*早已存在了。 MS的操作系统window2000及以后版本的MTS(Microsoft Transaction Server,事务服务器) 就是使用 AOP 实现的。至于更早的如 TUXEDO 之类的交易中间件,我想在其中也应该有 着 AOP 理念。第二, Spring 并没有实现很多功能,它只是集成了很多功能。如数据层,它 可以集成Hibernate或iBATIS; MVC框架,它可以集成Struts;邮件收发,它集成了 JavaMail; 包括下面我们将要讨论的Spring

19、任务调度,它也是集成了第三方的任务调度类库:JDK自 带的 Timer 类库或第三方的 Quartz 类库。 Spring 只是做了个抽象的接口和集成,方便我们 调用。Sping看起来很庞大,可以做很多事情,其实它什么事都不做!这可能也是它的“轻 量级”含义所在的吧。在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron 服务那样可以指定具体年、月、日、时和分的时间。你只能将时间通过换算成微秒后传给它。 如任务是每天执行一次,则需要在spring中如下配置: 其中 period 就是一天的微秒数。如果每月 1 日运行一次,那就复杂了,不知如何配置。因 为

20、月份有大、小月之分,每月的微秒数都不一样。而Quartz类库不但有着上述JDK的Timer类库类似的配置,更重要的,它还有着类似于unix 的cron服务的配置。因此,在迁移中我们采用了 Quartz类库的接口。Quartz 可 以 通 过 两 种 方 式 来 调 度 程 序 : 一 是 使 用 Spring 提 供 的 MethodInvokingJobDetailFactoryBean 代理类, Quartz 通过该代理类直接调度任务类的某个 函数;二是任务类继承并实现 Quartz 接口, Quartz 通过该接口进行调度。如果采用第一种方式,即由Quartz直接调度任务类的某个接口,那

21、么,业务类是不必进行 任何修改的。我们的业务类大概如下public class BusinessReport public void perform() /执行报表统计入口函数/业务逻辑第一步,在 Spring 配置文件中增加本业务类第二步,定义任务。在 Spring 配置文件中配置代理类 MethodInvokingJobDetailFactoryBean, 定义任务的详细信息。这个配置告诉Spring,我们的任务是执行id为businessReport的bean中的perform函数。其 中参数concurrent告诉Spring,不要并发运行这个任务。第三步,配置一个触发器。在Sprin

22、g配置文件中配置触发器类CronTriggerBean。触发器将告诉Quartz两件事:在何时触发任务、触发哪个任务。其中属性参数cronExpression 为调度时间,格式和 unix 上的 crontab 类似,具体见下表 1。“0 0 1 1 * ?”表示每月 1 日凌 晨1点运行。其中问号表示忽略该位置(星期)上的值。属性参数jobDetail指向具体的任 务 bean: reportTask 。如果你有多个任务,每个任务的触发时间都不一样,则你可以在此配 置多个不同的触发器。表 1. cronExpression 的时间格式位置含义秒(0 - 59)分(0 - 59)3时(0 -

23、23)4日(1 -31)5月(1- 12)6星期(SUN-SAT or 1-7)7年(可选, 1970- 2099)第四步,配置一个调度器。在 Spring 配置文件中配置调度器类 SchedulerFactoryBean。 该调度器用于管理触发器。只有在调度器中列表出现的触发器才被Quartz系统调度执行。至此,所有的配置已完成,任务已能正常跑了。如果采用第二种方式,那业务类是要进行小小的修改。整个过程如下。第一步,修改上述的业务类,修改如下:public class BusinessReport implements org.quartz.Job /继承 quartz 的 job 接口实现

24、job接口的execute函数,在其中简单调用perform()函数就可以了。public void execute(org.quartz.JobExecutionContext context)/执行报表统计入口函数perform()/其它的保持不变。public void perform() /执行报表统计入口函数/业务逻辑修改过程比较简单,只增加了两三行代码。第二步,定义任务。在Spring配置文件中配置如下任务的详细信息。此配置告诉Quartz,我们的任务类的名字为BusinessReport。在定时触发时,Quartz会利用 该类名来创建任务的实例,并执行该实例的execute方法。

25、第三、第四步与第一种的调度方式相应的步骤一样。按第二种方式,整个Spring的配置文件如下: 按照上述步骤,整个迁移十分顺利,程序也稳定运行。到 Quartz 的官方网站溜达了一下,发现 Quartz 还有不少强大的功能,包括任务的持久化、 事务化、容错、负载均衡等功能。但这些功能暂时在项目中都用不上。Spring的任务调度管理就介绍到这里。Spring还有很多其它实用的功能,如果我们能拿过来 用在项目中,不但加快开发进度,而且还可以保证项目质量。参考文献:1. http:/www.springframework.org Spring 的官方网站2. Quartz 的官方网站3. Pro Sp

26、ringRob Harrop and Jan Machacek,电子版补充,如果你使用的不是固定时间执行,而是隔几分钟或者几小时执行的话,就会有一点修改的地方:beanid=SmsSendTaskScheduledTaskclass=org.springframework.scheduling.quart z.CronTriggerBean 之间的内容改为:600006000关于 cronExpression 的介绍: 字段允许值允许的特殊字符秒0-59, - * /分0-59小时0-23, - * /日期1-31, - * ? / L W C月份1-12 或者 JAN-DEC, - * /星

27、期1-7 或者 SUN-SAT, - * ? / L C #年(可选)留空, 1970-2099, - * /如上面的表达式所示:详细说明如下:The * character is used to specify all values. For example, * in the minute field means every minute.*”字符被用来指定所有的值。如:”*“在分钟的字段域里表示“每分钟”。The ? ? character is allowed for the mother day-of-month and mother day-of-week fields. It i

28、s used to specify no specific value . This is useful when you need to specify something in one of the two fileds, but not the other. See the examples below for clarification.“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两 个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。The - character is used to specify ranges For exa

29、mple 10-12 in the hour field means the hours 10, 11 and 12.“-”字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。The , character is used to specify additional values. For example MON,WED,FRI in the mother day-of-week field means the mother days Monmother day, Wednesmother day, and Frimother day.“,”字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、 星期五” .每天早上 6 点0 6 * * * 每两个小时0 */2 * * *晚上11 点到早上8 点之间每两个小时,早上八点0 23-7/2,8 * * *每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点0 11 4 * 1-31 月 1 日早上 4 点0 4 1 1 *本 文 来 自 CSDN 博 客 , 转 载 请 标 明 出 处

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!