- 浏览: 193903 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
wangzhiangtony:
401的原因是,DrepositoryId这个配置的id跟你m ...
如何在本地库和私服中添加第三方的jar包 -
lily_better:
用到了,很好!谢谢~
用Java程序实现文件夹的复制 -
星夜的遐想:
dota_nec 写道以上都运行成功了,但是客户端怎么调用呢, ...
Tomcat 发布基于JAX-WS的项目流程小案例 -
dota_nec:
dota_nec 写道以上都运行成功了,但是客户端怎么调用呢, ...
Tomcat 发布基于JAX-WS的项目流程小案例 -
dota_nec:
以上都运行成功了,但是客户端怎么调用呢,请指教
Tomcat 发布基于JAX-WS的项目流程小案例
最近在网上看到的一片好文章,在此跟大家分享下
2012-10-17 Spring的任务调度管理 Spring的任务调度管理 在项目开发中,有不少程序需要定时触发。比如,统计报表程序需要在每月初运行一次,对上月份数据进行统计。而这种触发,在unix上就是使用 crontab或at命令来指定。其中at命令可以设定程序在某年某月某日、何时何分定时启动,at命令只执行一次程序。而crontab则可以设定程序在指定的时刻重复执行。在window操作系统中也有类似的命令。Window的at命令在功能上基本与unix的一致。Window控制面板中的“任务计划”与unix上从crontab类似,只是它是基于图形界面的,更人性化一些。 在开发上一个项目时,我遇到以下这样的一个问题。项目是java+tomcat开发的,在window系统上运行,但我们没有该服务器上的管理员权限(因为该服务器上还运行着其它重要的系统,管理员只给了我们一个最低权限的帐号),无法配置“任务计划”。我们使用该功能的话,需要打申请,通过客户的系统管理员帮我们配置。考虑到我们的业务统计报表程序需要有一段稳定期,期间必定需要做不少的修正,每修改一次,都需要打申请后才能测试,一个流程下来会耗费不少时间。另外,数据库连接使用了tomcat自带的连接池,如果使用了window的任务计划,则需要启动独立于tomcat的应用程序,而项目组中没有人知道如何在这个应用程序获取tomcat连接池中的数据库连接。替代方法是不使用tomcat的连接池,并给这个应用程序配置独立数据库参数配置文件。这样的话在应用程序中获取数据库连接的方法就得改动,并且需要维护两套配置文件,也挺麻烦。 最后经小组商讨,决定自己编写定时服务调度线程,并随tomcat应用程序一起启动运行,共用tomcat的数据库连接池。为此,我们耗费了一个工作周的开发时间。最惨的是,服务调度线程运行不太稳定,有时还需人工干预一下。 最近看Spring,发现Spring有任务调度管理功能,能很好地解决以上的问题。于是我们决定将定时程序迁移到Spring中。下面就结合我们这次程序的迁移,介绍一下如何使用Spring的任务调度。 在讨论Spring的任务调度前,我们先谈谈Spring。仔细探究Spring,你会发现很多有趣的东西。第一,Spring中并没有多少新技术,就如AOP这些概念,其实于上个****早已存在了。 MS的操作系统 window2000及以后版本的MTS(Microsoft Transaction Server,事务服务器)就是使用AOP实现的。至于更早的如TUXEDO之类的交易中间件,我想在其中也应该有着AOP理念。第二,Spring并没有实现很多功能,它只是集成了很多功能。如数据层,它可以集成Hibernate或iBATIS;MVC框架,它可以集成Struts;邮件收发,它集成了JavaMail;包括下面我们将要讨论的Spring任务调度,它也是集成了第三方的任务调度类库:JDK自带的Timer类库或第三方的 Quartz类库。Spring只是做了个抽象的接口和集成,方便我们调用。Sping看起来很庞大,可以做很多事情,其实它什么事都不做!这可能也是它的“轻量级”含义所在的吧。 在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron服务那样可以指定具体年、月、日、时和分的时间。你只能将时间通过换算成微秒后传给它。如任务是每天执行一次,则需要在spring中如下配置: <bean id="scheduledTask" class= "org.springframework.scheduling.timer.ScheduledTimerTask"> <!--程序启动后开始执行任务的延迟时间 --> <property name="delay" value="0" /> <!--每隔一天【一天=24×60×60×1000微秒】执行一次--> <property name="period" value="86400000" /> <!--业务统计报表bean --> <property name="timerTask" ref="businessReport" /> </bean> 其中period就是一天的微秒数。如果每月1日运行一次,那就复杂了,不知如何配置。因为月份有大、小月之分,每月的微秒数都不一样。 而Quartz类库不但有着上述JDK的Timer类库类似的配置,更重要的,它还有着类似于unix的cron服务的配置。因此,在迁移中我们采用了Quartz类库的接口。 Quartz可以通过两种方式来调度程序:一是使用Spring提供的MethodInvokingJobDetailFactoryBean 代理类,Quartz通过该代理类直接调度任务类的某个函数;二是任务类继承并实现Quartz接口,Quartz通过该接口进行调度。 如果采用第一种方式,即由Quartz直接调度任务类的某个接口,那么,业务类是不必进行任何修改的。我们的业务类大概如下 public class BusinessReport { public void perform(){ //执行报表统计入口函数 //业务逻辑 } } 第一步,在Spring配置文件中增加本业务类 <bean id=" businessReport " class=" BusinessReport "/> 第二步,定义任务。在Spring配置文件中配置代理类MethodInvokingJobDetailFactoryBean,定义任务的详细信息。 <bean id=" reportTask " class= "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name=" targetObject " ref=" businessReport " /> <property name=" targetMethod " value=" perform " /> <property name=" concurrent " value=" false " /> </bean> 这个配置告诉Spring,我们的任务是执行id为businessReport的bean中的perform函数。其中参数concurrent告诉Spring,不要并发运行这个任务。 第三步,配置一个触发器。在Spring配置文件中配置触发器类CronTriggerBean 。 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref=" reportTask " /> <property name="cronExpression" value="0 0 1 1 * ?" /> </bean> 触发器将告诉Quartz两件事:在何时触发任务、触发哪个任务。其中属性参数cronExpression为调度时间,格式和unix上的 crontab类似,具体见下表1。“0 0 1 1 * ?”表示每月1日凌晨1点运行。其中问号表示忽略该位置(星期)上的值。属性参数jobDetail指向具体的任务bean:reportTask 。如果你有多个任务,每个任务的触发时间都不一样,则你可以在此配置多个不同的触发器。 表1. cronExpression的时间格式 位置 含义 1 秒(0–59) 2 分(0–59) 3 时(0–23) 4 日(1–31) 5 月(1–12) 6 星期(SUN–SAT or 1–7) 7 年(可选, 1970–2099) 第四步,配置一个调度器。在Spring配置文件中配置调度器类SchedulerFactoryBean。 <bean class= "org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean> 该调度器用于管理触发器。只有在调度器中列表出现的触发器才被Quartz系统调度执行。至此,所有的配置已完成,任务已能正常跑了。 如果采用第二种方式,那业务类是要进行小小的修改。整个过程如下。 第一步,修改上述的业务类,修改如下: public class BusinessReport implements org.quartz.Job {//继承quartz 的job接口 //实现job接口的execute函数,在其中简单调用perform()函数就可以了。 public void execute(org.quartz.JobExecutionContext context){ //执行报表统计入口函数 perform() } //其它的保持不变。 public void perform(){ //执行报表统计入口函数 //业务逻辑 } } 修改过程比较简单,只增加了两三行代码。 第二步,定义任务。在Spring配置文件中配置如下任务的详细信息。 <bean name=" reportTask " class= "org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value=" BusinessReport " /> </bean> 此配置告诉Quartz,我们的任务类的名字为BusinessReport。在定时触发时,Quartz会利用该类名来创建任务的实例,并执行该实例的execute方法。 第三、第四步与第一种的调度方式相应的步骤一样。 按第二种方式,整个Spring的配置文件如下: <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 我们的任务 --> <bean name=" reportTask " class= "org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value=" BusinessReport " /> </bean> <!-- 触发器 --> <bean id="cronTrigger" class= "org.springframework.scheduling.quartz.CronTriggerBean"> <!-- 指向我们的任务 --> <property name="jobDetail" ref=" reportTask " /> <!-- 每月1日凌晨1点运行 --> <property name="cronExpression" value="0 0 1 1 * ?" /> </bean> <!-- 调度器 --> <bean class= "org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list><!-- 触发器列表--> <ref bean="cronTrigger" /> </list> </property> </bean> </beans> 按照上述步骤,整个迁移十分顺利,程序也稳定运行。 到Quartz的官方网站溜达了一下,发现Quartz还有不少强大的功能,包括任务的持久化、事务化、容错、负载均衡等功能。但这些功能暂时在项目中都用不上。 Spring的任务调度管理就介绍到这里。Spring还有很多其它实用的功能,如果我们能拿过来用在项目中,不但加快开发进度,而且还可以保证项目质量。 参考文献: 1.http://www.springframework.org Spring的官方网站 2.http://www.opensymphony.com/quartz/ Quartz的官方网站 3.《Pro Spring》Rob Harrop and Jan Machacek,电子版 补充,如果你使用的不是固定时间执行,而是隔几分钟或者几小时执行的话,就会有一点修改的地方: <bean id="SmsSendTaskScheduledTask" class="org.springframework.scheduling.quartz.CronTriggerBean">这之间的内容改为: <bean id="SmsSendTaskScheduledTask" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="startDelay"> <value>60000</value><!-- 服务启动一分钟后执行 --> </property> <property name="repeatInterval"> <value>6000</value><!-- 每隔1分钟执行一次 --> </property> <property name="jobDetail"> <ref bean="SmsSendTaskDetail"/> </property> </bean> =========================================== 关于cronExpression的介绍: 字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 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 is 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 example "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-3 1月1日早上4点 0 4 1 1 *
发表评论
-
事务传播特性摘记
2015-11-12 23:32 1964在配置Hibernat的事务传播特性比较常用就是REQUI ... -
Hibernate中将HQL转换成SQL的方法
2015-11-09 18:46 3022public String hql2Sql(String h ... -
Atomikos实现分布式事务异常小结
2015-11-08 16:21 34472015-11-08 02:47:22:WARN ma ... -
Atomikos实现分布式事务开发小结
2015-11-08 16:10 1534由于项目中用到了操作多个数据库,并且要在通过Service方 ... -
使用springmvc的注意点
2015-11-08 15:44 6411、web.xml中配置DispatcherServlet ... -
java.lang.NullPointerException at org.hibernate.type.LongType.next(LongType.java
2015-04-04 19:05 29221、为了初步解决并发造成的问题,我们通常会在实体类上声明一 ... -
Hibernate显示DDL日志设置
2015-04-02 14:13 10661、默认情况下,有些时候需要将实体映射到数据库创建相应的表, ... -
无法在service中try catch 数据库异常的的解决方案
2015-01-25 00:03 2945例如有一个批量操作数据库的功能(例如数据导入),当某条数 ... -
mappedBy和@JoinColumn的相似和区别
2015-01-18 23:36 57691、在使用@OneToMany注解 ... -
HQL 主附表关联查询,返回主表结果集
2014-12-21 16:54 1196数据模型A Public classs ... -
Spring 与Ehcache实现基于方法的缓存
2014-06-17 12:16 1611基于方法的缓存,顾名思义; 就是缓存的级别是在方法上,并 ... -
Apache+Tomcat集群环境配置
2014-06-09 18:48 939一、web开发中,为什么需要tomcat集群,我个人认为有 ... -
SpringMVC配置多视图配置的优先级别问题
2014-05-11 23:14 967在使用springmvc集成jsp和freemarker时 ... -
JPA的注解小结
2013-03-27 18:44 1600在开发中基于注解的方式配置数据表与是实体之间的关联在开发过 ... -
Struts2获取request等对象的方法
2013-03-15 22:30 1003写道 struts2里面有三种方法可以获取request ... -
Struts2中一个Action转到另一个Action以及传参的问题
2012-08-27 09:21 1738在WEB的开过程中,我们在使用Struts2中Action完成 ... -
Hibernate 二级缓存的配置和使用
2012-07-01 18:00 1115用Hibernate做了些项目感 ... -
Struts2之文件上传和下载
2012-07-01 00:17 1175Struts2 上传和下载的原理: Commons ...
相关推荐
内容概要:本文深入剖析了安川MP7系列工业控制系统的关键源码,重点介绍了运动轨迹规划、通信协议处理以及故障处理机制等方面的技术细节。通过对实际代码片段的解读,揭示了该系统在硬件寄存器直接访问、特殊功能码处理等方面的独特之处。同时,文中还分享了一些基于实践经验得出的重要参数设置及其背后的故事,如特定摩擦补偿系数的选择原因等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对安川产品有一定了解并希望深入了解其内部工作机制的专业人士。 使用场景及目标:帮助读者掌握安川MP7系列控制器的工作原理,提高对类似系统的维护能力和故障排查效率。对于想要进一步研究或二次开发该系统的开发者来说,也能提供宝贵的参考资料。 其他说明:文章不仅限于理论讲解,还包括了许多来自一线的实际案例和经验教训,使读者能够更好地理解和应用所学知识。
自动化测试与脚本开发_Python3_pynput_键盘鼠标操作录制执行代码生成工具_用于自动化测试_脚本录制_重复操作模拟_宏命令生成_提高工作效率_支持GUI界面_跨平台兼容_
嵌入式八股文面试题库资料知识宝典-深入分析Windows和Linux动态库应用异同.zip
嵌入式八股文面试题库资料知识宝典-C语言总结.zip
内容概要:本文详细探讨了风储直流微电网中母线电压控制的关键技术。首先介绍了风储直流微电网的背景和发展现状,强调了母线电压控制的重要性。接着阐述了永磁风机储能并网技术,解释了永磁风机如何通过直接驱动发电机将风能转化为电能,并确保与电网的同步性和稳定性。然后深入讨论了双闭环控制MPPT技术,这是一种通过内外两个闭环控制系统来实现实时调整发电机运行参数的技术,确保风机始终处于最大功率点附近。最后,文章探讨了储能控制母线电压平衡的方法,即通过储能系统的充放电操作来维持母线电压的稳定。结论部分指出,通过这些技术的有机结合,可以实现对风储直流微电网的有效管理和优化控制。 适合人群:从事新能源技术研发的专业人士、电气工程研究人员、风电系统工程师。 使用场景及目标:适用于希望深入了解风储直流微电网母线电压控制策略的研究人员和技术人员,旨在帮助他们掌握最新的控制技术和方法,以提高系统的稳定性和效率。 其他说明:文章还对未来风储直流微电网的发展进行了展望,指出了智能化和自动化的趋势,以及储能技术的进步对系统性能的影响。
嵌入式八股文面试题库资料知识宝典-C++object-oriented.zip
内容概要:文章详细介绍了HarmonyOS的目录结构及其重要性,从整体框架到核心目录的具体功能进行了全面剖析。HarmonyOS凭借其分布式架构和跨设备协同能力迅速崛起,成为全球操作系统领域的重要力量。文章首先概述了HarmonyOS的背景和发展现状,强调了目录结构对开发的重要性。接着,具体介绍了根目录文件、AppScope、entry和oh_modules等核心目录的功能和作用。例如,AppScope作为全局资源配置中心,存放应用级的配置文件和公共资源;entry目录是应用的核心入口,负责源代码和界面开发。此外,文章还对比了HarmonyOS与Android、iOS目录结构的异同,突出了HarmonyOS的独特优势。最后,通过旅游应用和电商应用的实际案例,展示了HarmonyOS目录结构在资源管理和代码组织方面的应用效果。; 适合人群:具备一定编程基础,尤其是对移动操作系统开发感兴趣的开发者,包括初学者和有一定经验的研发人员。; 使用场景及目标:①帮助开发者快速理解HarmonyOS的目录结构,提高开发效率;②为跨设备应用开发提供理论和技术支持;③通过实际案例学习资源管理和代码组织的最佳实践。; 其他说明:HarmonyOS的目录结构设计简洁明了,模块职责划分明确,有助于开发者更好地管理和组织代码和资源。随着万物互联时代的到来,HarmonyOS有望在开发便利性和生态建设方面取得更大进展,吸引更多开发者加入其生态系统。
内容概要:本文详细介绍了飞轮储能充放电控制的Simulink仿真模型,重点在于采用永磁同步电机的矢量控制和dq轴解耦控制策略。充电时,外环控制转速,内环控制dq轴电流;放电时,外环控制直流母线电压,内环同样控制dq轴电流。文中还讨论了硬件与软件环境的选择,以及仿真模型的调试与运行情况,最终得出该模型具有良好的跟随性能和波形完美度。 适用人群:从事电力电子系统、储能技术和Simulink仿真的研究人员和技术人员。 使用场景及目标:适用于需要对飞轮储能系统进行深入研究和仿真的场合,旨在提高充放电效率和稳定性,满足不同应用场景的需求。 其他说明:该仿真模型已调试完成,可以直接用于进一步的研究和实际应用,为未来的飞轮储能技术研发提供了有价值的参考。
嵌入式八股文面试题库资料知识宝典-北京瑞德方科技.zip
嵌入式八股文面试题库资料知识宝典-同方万维硬件测试工程师.zip
1_15套python PDF格式.zip
内容概要:本文详细介绍了三相三电平整流器的仿真过程及其性能分析。文中首先概述了三相三电平整流器的基本概念及其在电力系统中的重要作用,接着重点探讨了电压电流双闭环控制方式的工作原理和优势,以及SPWM调制技术的具体应用。通过仿真文件展示了整流器在不同条件下的响应情况,验证了这两种技术的有效性和优越性。最后,作者表达了对未来实际应用的期望。 适合人群:从事电力电子研究的技术人员、高校相关专业师生、对电力控制系统感兴趣的工程爱好者。 使用场景及目标:适用于希望深入了解三相三电平整流器工作原理和技术细节的研究人员;目标是在理论基础上掌握电压电流双闭环控制和SPWM调制的实际应用方法。 其他说明:本文提供的仅为仿真文件,未涉及实物实验数据。
嵌入式八股文面试题库资料知识宝典-恒光科技.zip
嵌入式八股文面试题库资料知识宝典-北京天华威视科技有限公司面试题.zip
嵌入式八股文面试题库资料知识宝典-微软研究院笔试题目的答案.zip
Arduino UART实验例程,开发板:正点原子EPS32S3,本人主页有详细实验说明可供参考。
嵌入式八股文面试题库资料知识宝典-朝歌数码.zip
嵌入式八股文面试题库资料知识宝典-Cortex系列.zip
嵌入式八股文面试题库资料知识宝典-中科中科长青笔试题.zip
内容概要:本文详细介绍了自适应巡航(ACC)控制和纵向跟车避撞控制的分层式控制策略。上层控制通过建立离散跟车运动学模型和基于反馈校正的跟车预测模型,获得期望加速度;下层控制则根据上层提供的数据计算期望制动压力和节气门开度。文中特别强调了引入松弛因子进行多目标优化求解,以及利用模糊控制动态调整权重系数的方法,如车间距误差权重系数q_Δd、两车相对速度权重系数q_vrel和自车加速度权重系数q_ar。通过这种方式,系统能够在复杂多变的道路环境中保持灵活性和稳定性。仿真结果显示,在前车以50~70km/h的正弦速度变化行驶的情况下,自车能够平稳跟车,各项参数变化平稳。 适合人群:从事智能车辆研究的技术人员、自动驾驶领域研究人员、高校相关专业师生。 使用场景及目标:适用于智能车辆系统的设计与开发,特别是需要提升ACC系统性能的研究项目。目标是提高驾驶的安全性、舒适性和经济性。 其他说明:实验基于Matlab/Simulink 2021a和Carsim 2019.0版本完成,提供了完整的运行视频和参考资料。