`
jslfl
  • 浏览: 313746 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring定时器在SSH框架中的应用

阅读更多
转自网络,来源不详....

并非应用系统中发生的所有事情都是由用户的动作引起的。有时候,系统自己也需要发起一些动作。例如,集抄系统每天早上六点把抄表数据传送给营销系统。我们有两种选择:或者是每天由用户手动出发任务,或者让应用系统中按照预定的计划自动执行任务。
在Spring中有两种流行配置:Java的Timer类和OpenSymphony的Quartz来执行调度任务。下面以给商丘做的接口集抄900到中间库的日冻结数据传输为例:
1.Java Timer调度器
首先定义一个定时器任务,继承java.util.TimerTask类实现run方法
import java.util.TimerTask; 
import xj.service.IJdbc1Service;
import xj.service.IJdbc2Service;
public class DayDataTimerTask extends TimerTask{
	private IJdbc2Service jdbc2Service=null;
	private IJdbc1Service jdbc1Service=null;
	public void run(){
		SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("日冻结转接任务开始时间:"+df.format(Calendar.getInstance().getTime()));
		System.out.println("日冻结转接任务结束时间:"+df.format(Calendar.getInstance().getTime()));
	}
	
	//通过set方法获取service服务,如果没有该方法,则为null
	public void setJdbc2Service(IJdbc2Service jdbc2Service) {
		this.jdbc2Service = jdbc2Service;
	}

	public void setJdbc1Service(IJdbc1Service jdbc1Service) {
		this.jdbc1Service = jdbc1Service;
	} 
}

Run()方法定义了当任务运行时该做什么。jdbc1Service,jdbc2Service通过依赖注入的方式提供给DayDataTimerTask。如果该任务中没有service服务的set方法,则取到的该service服务为null。
其次,在Spring配置文件中声明 dayDataTimerTask:
<!-- 声明定时器任务 -->
	<bean id="dayDataTimerJob" class="xj.action.DayDataTimerTask">
		<property name="jdbc1Service">
			<ref bean="jdbc1Service"/>
		</property>
		<property name="jdbc2Service">
			<ref bean="jdbc2Service"/>
		</property>
	</bean>

该声明将DayDataTimerTask放到应用上下文中,并在jdbc1Service、jdbc2Service属性中分别装配jdbc1Service、jdbc2Service。在调度它之前,它不会做任何事情。
	<!-- 调度定时器任务 -->
	<bean id="scheduledDayDataTimerJob" class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="timerTask">
			<ref bean="dayDataTimerJob"/>
		</property>
		<property name="delay">
			<value>3000</value>
		</property>
		<property name="period">
			<value>864000000</value>
		</property>
	</bean>

属性timerTask告诉ScheduledTimerTask运行哪个TimerTask。再次,该属性装配了指向scheduledDayDataTimerJob的一个引用,它就是DayDataTimerTask。属性period告诉ScheduledTimerTask以怎样的频度调用TimerTask的run()方法。该属性以毫秒作为单位,它被设置为864000000,指定这个任务应该每24小时运行一次。属性delay允许你指定当任务第一次运行之前应该等待多久。在此指定DayDataTimerTask的第一次运行相对于应用程序的启动时间延迟3秒钟。
	<!-- 启动定时器 -->
	<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
		<property name="scheduledTimerTasks">
			<list>
				<ref bean="scheduledDayDataTimerJob"/>
			</list>
		</property>
	</bean>

Spring的TimerFactoryBean负责启动定时任务。属性scheduledTimerTasks要求一个需要启动的定时器任务的列表。在此只包含一个指向scheduledDayDataTimerJob的引用。
    Java Timer只能指定任务执行的频度,但无法精确指定它何时运行,这是它的一个局限性。要想精确指定任务的启动时间,就需要使用Quartz[kwɔ:ts]调度器。
2.Quartz调度器
Quartz调度器不仅可以定义每隔多少毫秒执行一个工作,还允许你调度一个工作在某个特定的时间或日期执行。
首先创建一个工作,继承QuartzJobBean类实现executeInternal方法
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import xj.service.IJdbc1Service;
import xj.service.IJdbc2Service;
public class DayDataQuartzTask extends QuartzJobBean{
	private IJdbc2Service jdbc2Service=null;
	private IJdbc1Service jdbc1Service=null;
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException{
		SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("日冻结转接任务开始时间:"+df.format(Calendar.getInstance().getTime()));
		System.out.println("日冻结转接任务结束时间:"+df.format(Calendar.getInstance().getTime()));
	}

	//通过set方法获取service服务,如果没有该方法,则为null
	public void setJdbc2Service(IJdbc2Service jdbc2Service) {
		this.jdbc2Service = jdbc2Service;
	}

	public void setJdbc1Service(IJdbc1Service jdbc1Service) {
		this.jdbc1Service = jdbc1Service;
	}
	
}

在Spring配置文件中按照以下方式声明这个工作:
<!-- 定时启动任务 Quartz-->
<!—声明工作-->
	<bean id="dayDataJob" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass">
			<value>xj.action.DayDataQuartzTask</value>
		</property>
		<property name="jobDataAsMap">
			<map>
				<entry key="jdbc1Service">
					<ref bean="jdbc1Service"/>
				</entry>
				<entry key="jdbc2Service">
					<ref bean="jdbc2Service"/>
				</entry>
			</map>
		</property>
	</bean>

Quartz的org.quartz.Trigger类描述了何时及以怎样的频度运行一个Quartz工作。Spring提供了两个触发器SimpleTriggerBean和CronTriggerBean。SimpleTriggerBean与scheduledTimerTasks类似。指定工作的执行频度,模仿scheduledTimerTasks配置。
<!-- 调度Simple工作 -->
	<bean id="simpleDayDataJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail">
			<ref bean="dayDataJob"/>
		</property>
		<property name="startDelay">
			<value>1000</value>
		</property>
		<property name="repeatInterval">
			<value>86400000</value>
		</property>
	</bean>
<!—调度cron工作-->
	<bean id="dayDataJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="dayDataJob"/>
		</property>
		<property name="cronExpression">
			<value>0 30 2 * * ?</value>
		</property>
	</bean>

一个cron表达式有6个或7个由空格分隔的时间元素。从左至右,这些元素的定义如下:1、秒(0-59);2、分(0-59);3、小时(0-23);4、月份中的日期(1-31);5、月份(1-12或JAN-DEC);6、星期中的日期(1-7或SUN-SAT);7、年份(1970-2099)。
每一个元素都可以显式地规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”这两个元素互斥,应该通过设置一个问号(?)来表明你不想设置的那个字段。
我们在此定义该任务在每天凌晨两点半开始启动。
<!—启动工作-->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
<ref bean="simpleDayDataJobTrigger"/>
				<ref bean="dayDataJobTrigger"/>
			</list>
		</property>
	</bean>

属性triggers接受一组触发器,在此只装配包含simpleDayDataJobTrigger bea和dayDataJobTrigger bean的一个引用列表。
分享到:
评论

相关推荐

    Python零基础30天速通(小白定制版)(完结)

    宣导片:开启Python进阶之路 30动漫番剧播放量影响因素分析1综合案例 29小红书卖货实力与用户分析1综合案例 28星巴克门店探索|Matplotlib实战 27詹姆斯哈登的制胜宝典1 Panads的使用 26一晚5万的酒店| Numpy的使用 25揭开数据分析的面纱1数据分析"三剑客"概述 24虎牙直播数据告诉你谁最火1案例篇 23我的音乐我做主1数据保存之csv和excel 22电竟| BeautifulSoup解析HTML 21对李焕英的评价1HTML基础 20我的美食我做主1爬虫介绍、requests请 19看我四十二变1内容提取和格式转换 18我的版权我做主1PDF就是这么帅 17婚礼策划师离不开你|亲爱的PPT 16运营部的烦恼1战胜Excel 15Up主的创作之路1 Python与word初次 14你的offer之选|邮件发送 13我的存在只为悦你1 Pillow图片处理 12你喜欢的电竟赛事大全1 Python的文件操作 11哈利波特的魔法棒|模块 10龙珠之赛亚人1面向对象基础 09大吉大利今晚吃鸡1特种兵的战场(项目案

    20240519基本完整

    20240519基本完整

    MATLAB仿真项目-大数据源码-疲劳检测识别,可应用于疲劳驾驶监测,专注度检测等(高分期末大作业).rar

    本项目提供了一个基于MATLAB的疲劳检测识别仿真系统,旨在帮助计算机相关专业的在校学生、老师和企业员工更好地学习和实践大数据与人工智能技术。该项目可应用于疲劳驾驶监测、专注度检测等领域,具有较高的实用价值。 项目源码已经过运行测试,确保OK,可作为课程设计、毕业设计的优质资源。此外,我们还为您提供了一些网络相关资源,以便您在学习过程中进行参考。这些资源将帮助您更好地理解项目的原理和应用。 本项目的源码适用于初学者,即使是编程基础较弱的同学也能快速上手。同时,源码结构清晰,易于理解和修改。您可以在这个基础上进行二次开发,实现更多有趣的功能。 请放心下载使用,我们为您提供了详细的文档说明,以便您更好地了解和使用该项目。希望这个项目能为您提供实质性的帮助,祝您在学习和工作中取得更好的成绩!

    利用协同过滤算法,基于用户历史订单数据,对店铺的用户和商品进行推荐.zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

    用C#实现人工智能中的八数码问题,有界面效果,可以得出结果,也可以逐步求解.zip

    用C#实现人工智能中的八数码问题,有界面效果,可以得出结果,也可以逐步求解.zip

    Matlab 太阳能电池 simulink 模型太阳能电池模型连接到巴克 converter.by

    Matlab 太阳能电池 simulink 模型太阳能电池模型连接到巴克 converter.by 不同占空比和 PS 转炉值,我们可以改变输出 voltage.buck 转换器调节来自太阳能电池的电压,因而顺利和调节直流电压在负载的忧伤。通过将许多细胞我们可以使太阳能机舱和增加输出电压电流 (串联或并联).zip

    npy 文件的基本结构和内容

    npy 文件的基本结构和内容

    Learning Python 5th Edition

    Learning Python 5th Edition

    Learning Docker

    Learning Docker

    SwiftUI-加载动画 圆点循环缩放动画

    SwiftUI-加载动画 圆点循环缩放动画

    一种用于非线性模型预测控制的并行优化工具包(NMPC)

    介绍了一种专为非线性模型预测控制(NMPC)设计的并行优化工具包。内容涉及该工具包的功能特点、使用方法以及在解决非线性控制问题中的应用实例。通过对比分析,突出了并行优化在提高NMPC计算效率和实时性方面的重要作用。适合控制工程师、算法研究员和对高性能计算感兴趣的专业人士。使用场景包括复杂系统控制、实时仿真和工业自动化。目标是推广这一工具包的使用,助力非线性控制系统的研究与开发。 关键词标签: 非线性模型预测控制 NMPC 并行优化 工具包 实时控制

    matlab矩阵位移法实现有限元求解.zip

    matlab矩阵位移法实现有限元求解.zip

    Matlab 交互式多模型目标跟踪IMM.zip

    Matlab 交互式多模型目标跟踪IMM.zip

    520节日李珣的爱心代码

    内容概要:本项目是李珣创作的“爱心代码”,旨在通过编程表达浪漫与情感。该项目使用JavaScript编写,生成一个动态的爱心图案,并可以附加个性化的文字祝福。代码逻辑简单清晰,适合在网页上展示和分享。源码提供了完整的代码文件,部署文档详细介绍了代码的使用方法和展示步骤,讲解内容涵盖了代码的实现原理、技术选型理由、设计思路以及使用方法。 适合人群:对JavaScript有基础了解,并希望通过编程表达情感的开发者和编程爱好者。 能学到什么: 1. 掌握JavaScript绘图和动画的实现方法。 2. 学习如何通过代码生成动态图案。 3. 了解简单的前端开发和部署流程。 4. 掌握个性化定制代码的技巧。 阅读建议:本资源旨在帮助学习者通过实践项目掌握JavaScript的绘图和动画实现方法,并了解如何通过编程表达情感。建议在学习过程中结合部署文档进行实践,并深入理解讲解内容中的技术原理和设计思路。同时,鼓励学习者根据实际需求对代码进行拓展和优化,以提升自己的技术水平和创造力。

    python源码毕业设计基于深度学习的水果识别系统源码+文档说明+数据集+模型(期末大作业项目).rar

    本源码提供了一个基于深度学习的水果识别系统,涵盖了Python编程、深度学习、图像识别等多个领域的技术。项目利用神经网络模型对水果图像进行分类,实现了高效的水果识别功能。适合计算机专业的学生、老师和从业人员学习和参考,尤其是对深度学习图像识别感兴趣的朋友。 核心功能包括: 1. 数据集:包含大量水果图片,用于训练和测试模型。 2. 模型训练:采用卷积神经网络(CNN)进行训练,提升模型精度。 3. 图像识别:加载预训练模型,对新图像预测类别。 4. 测试验证:确保模型准确性和实用性。 代码可用于毕业设计、课程设计等,快速构建原型,基于此优化和扩展。 资源丰富,包含详细文档,讲解代码结构和算法;提供数据集和预训练模型,方便测试;代码清晰易懂,结构完整,便于理解深度学习图像识别。 请放心下载,这是经过测试的高质量资源,助你取得课程设计高分!

    Java项目毕业设计-航空订票系统(前台订票+后台票务管理)基于SSM开发+数据库(详细源码)-期末大作业.rar

    本项目为Java项目毕业设计-航空订票系统,基于SSM框架开发,结合前台订票与后台票务管理功能,满足现代航空票务需求。系统采用三层架构,包括表现层、业务逻辑层和数据访问层,确保高效稳定运行。数据库设计考虑数据完整性和安全性,采用MySQL数据库存储关键数据。 经过运行测试,系统性能良好,满足设计要求。界面简洁直观,用户友好;后台管理功能强大,方便管理员管理。系统安全性高,有效防止SQL注入、跨站脚本等攻击。 本资源适合计算机相关专业学生和从业者下载学习。对初学者,可快速掌握SSM框架和航空订票系统开发流程;对有一定基础者,可作为参考,拓宽思路,提升技能。此外,也适用于毕业设计、课程设计、项目立项等场景,展现项目基本框架和功能。 请放心下载使用,相信能助您顺利完成学习和项目任务。期待在您的努力下,系统不断完善,功能更加丰富,为航空事业发展贡献力量。

    web期末大作业-基于html+css+js实现的模仿华为商城静态网页源码+项目说明(附静态网页效果链接).rar

    本学期Web期末大作业,我们为您呈现一个精心制作的静态网页源码项目——基于HTML+CSS+JS实现的仿华为商城。经过严格的运行测试,我们确保该项目在各大主流浏览器中均能完美呈现,无兼容性问题。 这个项目不仅是一个简单的网页复刻,更是一次对前端技术的全面实践。我们采用了HTML5标准编写页面结构,利用CSS3实现丰富的样式与动画效果,同时运用JavaScript进行交互逻辑的编写,使得整个页面动态而生动。 我们深知每位同学的需求不同,因此这个项目的源码设计得非常灵活,易于修改和扩展。无论您是想学习前端技术的基础知识,还是想借鉴实际项目经验,亦或是作为课程设计的素材,这个项目都能满足您的需求。 请放心下载使用,我们承诺提供完善的售后服务和技术支持。遇到任何问题,欢迎随时与我们联系。相信通过这个项目,您一定能获得宝贵的实践经验,为未来的学习和职业生涯打下坚实的基础。

    web期末大作业网页设计期末大作业-大鱼海棠(html+css+js) 项目源码案例.rar

    大鱼海棠网页设计期末大作业项目概述 本项目名为“大鱼海棠”,旨在通过HTML、CSS和JavaScript技术,为学生提供一个具有挑战性的网页设计期末大作业。项目源码经过精心编写与测试,确保运行稳定,无兼容性问题。代码结构清晰,注释详细,便于初学者快速上手,同时也为经验丰富的开发者提供了丰富的参考资料。 大鱼海棠的设计灵感来源于同名动画电影,采用了中国传统元素与现代设计相结合的风格,展现出浓郁的中国风。页面布局合理,色彩搭配和谐,交互效果流畅,用户体验良好。 本资源特别适合计算机相关专业的在校学生、老师以及企业员工下载学习。无论您是初学者还是有一定基础的学员,都能从这个项目中学到宝贵的实践经验。此外,大鱼海棠也适用于毕业设计、课程设计、课程作业以及项目初期立项演示等多种场合。 请放心下载使用,我们承诺提供优质的售后服务和技术支持。祝您学习愉快,取得优异成绩!

    java家庭理财系统(java+applet).zip

    java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)java家庭理财系统(java+applet)

    Matlab HP过滤算法可以用于对混沌时间序列分析过滤使用,能够有效去噪,保留时间序列中有效信息.zip

    Matlab HP过滤算法可以用于对混沌时间序列分析过滤使用,能够有效去噪,保留时间序列中有效信息.zip

Global site tag (gtag.js) - Google Analytics