application定时器

合集下载

delphi timer用法

delphi timer用法

delphi timer用法Delphi Timer用法Delphi是一种高级编程语言,它支持许多不同的编程任务,包括创建定时器。

在Delphi中,定时器被称为“Timer”,它允许您在指定的时间间隔内执行代码。

在本文中,我们将介绍如何使用Delphi Timer 来创建一个简单的计时器应用程序。

一、Timer控件Timer控件是一个非可视化组件,可以用来触发事件或者过程。

当Timer控件启动后,它会在指定的时间间隔内执行事件或过程。

您可以使用Timer控件来实现周期性任务、延迟任务、以及其他需要定期执行的操作。

二、创建一个计时器应用程序1. 新建一个VCL Forms Application首先,在Delphi IDE中新建一个VCL Forms Application项目。

这将创建一个空的窗体(Form),您可以向其中添加各种控件。

2. 添加Timer控件接下来,在窗体上添加一个Timer控件。

在左侧工具栏中选择“System”选项卡,在其中找到“Timer”组件并将其拖动到窗体上。

3. 设置Timer属性现在,您需要设置Timer属性以便使其按照指定的时间间隔执行事件或过程。

点击窗体上添加的Timer控件,在右侧属性栏中找到“Interval”属性,并将其设置为1000。

这意味着Timer控件将每隔1秒钟执行一次事件或过程。

4. 添加计时器代码最后,您需要添加计时器代码以便使其在每个时间间隔内执行指定的操作。

在窗体上双击Timer控件,这将打开一个事件处理程序。

在其中添加您希望执行的代码,例如:procedure TForm1.Timer1Timer(Sender: TObject);beginLabel1.Caption := TimeToStr(Now);end;此代码将在每个时间间隔内更新Label1标签的内容为当前时间。

5. 运行应用程序现在,您可以运行应用程序并测试计时器是否按照指定的时间间隔执行操作。

Spring配置定时器(注解+xml)方式—整理

Spring配置定时器(注解+xml)方式—整理

Spring配置定时器(注解+xml)⽅式—整理⼀、注解⽅式1. 在Spring的配置⽂件ApplicationContext.xml,⾸先添加命名空间1 xmlns:task="/schema/task"2 /schema/task3 /schema /task/springtask3.1.xsd42. 最后是我们的task任务扫描注解1<task:annotation-driven/>3. spring扫描位置1<context:annotation-config/>2<context:component-scan base-package="com.test"/>4.写⾃⼰的定时任务1 @Component //import ponent;2public class MyTestServiceImpl implements IMyTestService {3 @Scheduled(cron="0/5 * * * * ? ") //每5秒执⾏⼀次4public void myTest(){5 System.out.println("进⼊测试");6 }7 }♦注意:定时器的任务⽅法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定⼀个proxytargetclass的某个值为true)⼆、XML⽅式1.在spring配置⽂件中创建bean,创建schedule1<bean id="schedule"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">3<property name="triggers">4<list>5<ref bean="testTrigger"/>6</list>7</property>8</bean>2. 在spring配置⽂件中创建bean,创建你的triggers1<bean id="testTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">3<property name="jobDetail" ref="testJobDetail"/>4<property name="cronExpression" value="0 1/5 * * * ?"/>5</bean>3. 在spring配置⽂件中创建bean,指定定时器作⽤在那个类那个⽅法上⾯1<bean id="testJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">3<property name="targetObject" ref="targetTestService"/>4<property name="targetMethod" value="timerTest"/>5</bean>♦注明:把定时器作⽤在targetTestService对象中的timerTest⽅法上⾯4. 当然还得把你作⽤的对象交Spring来管理,所以在spring配置⽂件中创建作⽤类的 bean1<bean id="targetTestService" class=".service.TargetTestService" scope="prototype"></bean>♦这是时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运⾏时间,只需要设置其cronExpression属性。

深入探讨Excel Application对象OnTime方法的死穴

深入探讨Excel Application对象OnTime方法的死穴

深入探讨Excel Application对象OnTime方法的死穴作者:傅华碧来源:《中国科技博览》2016年第02期[摘要]因为Excel集数据库和程序设计于一体,令广大VBA编程爱好者前赴后继地奔走在Excel考试系统路上,定时器作为考试系统的基本要求,而Excel却没有Timer,使爱好者乱了方寸,幸好Application对象OnTime方法带来了一线生机,但它又无法感知系统时间被修改的弊端,成了Excel考试系统的死穴,又让爱好者垂头丧气。

[关键词]探讨 Excel Application对象 OnTime方法中图分类号:TP311.52 文献标识码:A 文章编号:1009-914X(2016)02-0351-01Excel考试系统的重点和难点都是定时器的实现,但定时器作为任何考试系统的基本要求,又无法回避,怎样彻底实现Excel考试系统的定时器功能呢?一、实现定时器的基本方法虽然Excel VBA没有提供定时器,但可以通过Application对象的OnTime方法实现简单的定时器功能,OnTime方法能够安排一个过程在将来的特定时间运行,既可以是具体指定的某个时间,也可以是指定的一段时间之后。

语法如下:Application.OnTime EarliestTime,Procedure,LatestTime,Schedule在OnTime方法中递归调用Procedure过程,就可实现定时器。

二、致命的死穴尽管OnTime方法可以具体指定的某个时间和指定的一段时间之后两种方式执行Procedure,但本质上都是具体指定的某个时间,因此一旦修改系统时间,不管是提前或延后时间,让其错过指定时刻,或让指定时刻延后数小时或更长,导致OnTime方法失效,从而失去定时器的功能,成为Excel考试系统的死穴。

三、解决方案许多编程爱好者都在苦苦探索一旦修改系统时间,立刻让Excel感知系统时间被修改了,从而调整定时器方案,其中想利用类似lostfocus和getfocus事件的Workbook_Activate()、Workbook_SheetActivate()、Workbook_WindowActivate()等事件的探索者,均以失败而告终,因为WindowActivate等事件都是在有两个以上workbook打开时(也就是多个excel文件),互相之间切换起作用,而不是workbook和其他程序窗口间切换。

Windows中7种定时器

Windows中7种定时器

众所周知,Windows 是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的。

这样就带来了一些问题,如一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列中的消息就暂时被挂起,得不到实时处理。

因此,不能简单地通过Windows消息引发一个对定时要求严格的事件。

另外,由于在Windows中已经封装了计算机底层硬件的访问,所以,要想通过直接利用访问硬件来完成精确定时,也比较困难。

所以在实际应用时,应针对具体定时精度的要求,采取相适应的定时方法。

VC中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作。

本文详细介绍了VC中基于Windows的精确定时的七种方式,如下图所示:图一图像描述方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。

首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms 的时间间隔。

然后在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。

这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为30ms,CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。

只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。

如示例工程中的Timer1。

方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。

精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。

如示例工程中的Timer2。

方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。

【JMETER】【压测】jmeter--几种定时器介绍(包括思考时间、集合点)

【JMETER】【压测】jmeter--几种定时器介绍(包括思考时间、集合点)

【JMETER】【压测】jmeter--⼏种定时器介绍(包括思考时间、集合点)⽂章摘⾃:jmeter提供了很多元件,帮助我们更好的完成各种场景的性能测试,其中,定时器(timer)是很重要的⼀个元件,最新的3.0版本jemter提供了9种定时器(之前6种),下⾯⼀⼀介绍:⼀、定时器的作⽤域1、定时器是在每个sampler(采样器)之前执⾏的,⽽不是之后(⽆论定时器位置在sampler之前还是下⾯);2、当执⾏⼀个sampler之前时,所有当前作⽤域内的定时器都会被执⾏;3、如果希望定时器仅应⽤于其中⼀个sampler,则把定时器作为⼦节点加⼊;4、如果希望在sampler执⾏完之后再等待,则可以使⽤Test Action;⼆、定时器的作⽤1、固定定时器(Constant Timer)备注:如果需要每个步骤均延迟,则将定时器放在与请求持平的位置,若只针对⼀个请求延迟,则将定时器放在该请求⼦节点中。

如果你需要让每个线程在请求之前按相同的指定时间停顿,那么可以使⽤这个定时器;需要注意的是,固定定时器的延时不会计⼊单个sampler的响应时间,但会计⼊事务控制器的时间。

对于“java请求”这个sampler来说,定时器相当于loadrunner中的pacing(两次迭代之间的间隔时间);对于“事务控制器”来说,定时器相当于loadrunner中的think time(思考时间:实际操作中,模拟真实⽤户在操作过程中的等待时间)。

这⾥附上⼀个传送门,对loadrunner中的pacing和think time有⽐较全⾯的解释:我们通常说的响应时间,应该⼤部分情况下是针对某⼀个具体的sampler(http请求),⽽不是针对⼀组sampler组合的事务。

2、⾼斯随机定时器(Gaussian Random Timer)如需要每个线程在请求前按随机时间停顿,那么使⽤这个定时器,上图表⽰暂停时间会分布在100到400之间,计算公式参考:Math.abs((this.random.nextGaussian() * 300) + 100)传送门(什么是⾼斯随机分布):3、均匀随机定时器(Uniform Random Timer)和⾼斯随机定时器的作⽤差异不⼤,区别在于延时时间在指定范围内且每个时间的取值概率相同,每个时间间隔都有相同的概率发⽣,总的延迟时间就是随机值和偏移值之和。

GSM定时器详解

GSM定时器详解

定时器专题研究报告(一)——GSM常用定时器目录1概述 (1)2Um接口定时器 (2)2.1CC层 (2)2.1.1MSC侧 (2)2.1.2MS侧 (6)2.2MM层 (9)2.2.1MSC侧定时器 (9)2.2.2MS侧定时器 (10)2.3RR层 (13)2.3.1MSC侧 (13)2.3.2BSC侧 (16)2.3.3MS侧 (24)2.4LAPDm层 (27)2.4.1BTS侧 (27)2.4.2MS侧 (29)3Abis接口定时器 (31)3.1BTSM层 (31)3.1.1BSC侧 (31)3.1.2BTS侧 (33)3.2LAPD层 (34)3.2.1BSC侧 (34)3.2.2BTS侧 (35)4A接口定时器 (36)4.1BSSMAP层 (36)4.1.1MSC侧 (36)4.1.2BSC侧 (38)5Ater接口定时器 (42)5.1BTAP层 (42)5.1.1BSC侧 (42)5.1.2TC侧 (44)附录一:主要流程中的定时器 (45)附录二:GSM系统CC层定义的原因值 (83)关键词:定时器、Um、Abis、Ater、A、CC、MM、RR、BSSMAP、BTAP、BTSM、LAPD、LAPDm 摘要:本文是对GSM BSS系统各接口中主要定时器的研究报告。

文中对各个定时器的作用以及使用条件和策略进行了阐述。

通过对这些定时器的作用及使用方式的阐述和研究,使我们更清楚地了解了各定时器的特性,为今后我们进行网络优化时使用这些定时器来改善网络性能提供了有效的借鉴信息。

缩略语清单:参考资料清单:1、GSM 03.94、04.08、08.08、08.58等相关协议2、《各种定时器--新疆伊犁网络拥塞问题分析》中研文档3、《GSM原理及其网络优化》韩斌杰编著机械工业出版社4、Ericsson:“User Description, Circuit Switched Traffic Timers”1 概述GSM系统内设计了大量的定时器和计数器用来对系统的信令或操作流程进行监控,通过这些定时器和计数器的配合和应用,可以使GSM系统的各个接口的同一消息层或不同消息层的信令或操作流程有效地运作起来。

C#的三种定时器

C#的三种定时器

C#的三种定时器三种定时器:·关于C#中timer类在C#⾥关于定时器类就有3个1、基于 Windows 的标准计时器(System.Windows.Forms.Timer)2、基于服务器的计时器(System.Timers.Timer)3、线程计时器(System.Threading.Timer)System.Windows.Forms.Timer是应⽤于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使⽤API SetTimer实现的。

它的主要缺点是计时不精确,⽽且必须有消息循环,Console Application(控制台应⽤程序)⽆法使⽤。

System.Timers.Timer和System.Threading.Timer⾮常类似,它们是通过.NET Thread Pool实现的,轻量,计时精确,对应⽤程序、消息没有特别的要求。

System.Timers.Timer还可以应⽤于WinForm,完全取代上⾯的 Timer控件。

它们的缺点是不⽀持直接的拖放,需要⼿⼯编码。

例:使⽤System.Timers.Timer类System.Timers.Timer t = new System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒;t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执⾏事件;t.AutoReset = true;//设置是执⾏⼀次(false)还是⼀直执⾏(true);t.Enabled = true;//是否执⾏System.Timers.Timer.Elapsed事件;public void theout(object source, System.Timers.ElapsedEventArgs e){MessageBox.Show("OK!");}⼀、基于 Windows 的标准计时器(System.Windows.Forms.Timer)微软的注释很明确:“实现按⽤户定义的时间间隔引发事件的计时器。

关于VBA Application.OnTime用法

关于VBA Application.OnTime用法

关于VBA Application.OnTime用法2013-02-03 18:45:36| 分类:默认分类 | 标签:vba application.ontime |举报 |字号订阅Application.OnTime可实现定时执行vba程序。

在中可定时执行windows 程序。

下面介绍定时执行vba程序过程:1.Application.OnTime参数Application.OnTime(EarliestTime,Procedure asString,[LatestTime],[Schedule])EarliestTime调用程序的时间Procedure调用程序的程序名,类型StringLatestTime程序执行的结束时间,可选,默认不停调用Schedule默认True:预定新的调用过程,False非预定调用新的过程2.举例Sub fslk()'本程序在每天的12点运行yourproc过程"Application.OnTime _EarliestTime:=TimeValue("12:00:00"), _Procedure:="YourProc"End Sub'被调用程序Sub yourpc()Cells.(1, 2).Value = 4423End Sub3.循环调用程序自身,并设置调用时间举例Option Explicit '公共变量说明Dim endtime As StringSub oneminute() '主程序endtime = Now + TimeValue("00:01:00")Call updateselfEnd SubSub updateself() '被调用程序Sheet1.Cells(4, 3).Value = Format(Now(), "hh:mm:ss")Application.OnTime Now + TimeValue("00:00:01"), "updateself", endtime, TrueEnd Sub此例子在单元格C4读秒持续显示,显示时间长度1分钟。

定时器的工作原理

定时器的工作原理

定时器的工作原理How Timers Work: An In-Depth Explanation。

Timers are essential components in many electronic devices, from simple alarm clocks to complex industrial control systems. They allow us to measure time intervals, trigger events at specific times, and synchronize different processes. But how do timers actually work? In this article, we will explore the principles behind timers and their various applications.What is a Timer?A timer is a device that generates a time delay or a periodic signal. It can be either analog or digital, depending on the type of signal it produces. Analog timers use mechanical components such as gears, springs, andmotors to generate a time delay, while digital timers rely on electronic circuits and microprocessors to produce precise timing signals.Regardless of their design, timers have three basic components: an input, a timing element, and an output. The input is used to start or reset the timer, the timing element determines the duration of the delay, and the output generates a signal when the delay is complete.Types of Timers。

freertos定时器回调函数

freertos定时器回调函数

freertos定时器回调函数一、什么是FreeRTOS?FreeRTOS(Real Time Operating System)是一个用于嵌入式系统的开源实时操作系统。

它专为资源有限的嵌入式设备设计,具有高可靠性、低延迟和高并发性能的特点。

FreeRTOS提供了许多功能模块,其中之一是定时器模块。

二、FreeRTOS定时器回调函数在FreeRTOS中,定时器回调函数是指在特定时间间隔内定期执行的函数。

定时器回调函数常用于周期性任务、事件处理和定时触发等场景。

它通过FreeRTOS提供的定时器模块实现,具有高度的灵活性和可定制性。

2.1 定时器回调函数的注册和使用使用FreeRTOS定时器回调函数,需要经历以下步骤:1.创建定时器:使用xTimerCreate()函数创建一个定时器,并指定定时器的实际处理函数。

2.注册回调函数:使用xTimerCallbackFunction()函数将自定义的回调函数与定时器绑定。

3.启动定时器:使用xTimerStart()函数启动定时器,并指定定时器的周期和初始延迟时间。

4.定时器回调函数:定时器达到设定的时间时,回调函数将被调用执行。

2.2 定时器回调函数的参数和返回值In FreeRTOS, the callback function of a timer has the following signature:void callback( TimerHandle_t timer );定时器回调函数的返回值为空,参数为一个TimerHandle_t类型的定时器句柄。

通过句柄,回调函数可以获取相关的定时器信息,如定时器的名称、定时器的周期、定时器的触发次数等。

2.3 定时器的周期性和一次性触发FreeRTOS定时器回调函数支持两种触发模式:周期性触发和一次性触发。

周期性触发的定时器会根据设定的时间间隔,周期性地触发回调函数。

一次性触发的定时器则只会在设定的时间点触发一次回调函数。

Springboot+websocket+定时器实现消息推送

Springboot+websocket+定时器实现消息推送

Springboot+websocket+定时器实现消息推送由于最近有个需求,产品即将到期(不同时间段到期)时给后台⽤户按⾓⾊推送,功能完成之后在此做个⼩结1. 在启动类中添加注解@EnableSchedulingpackage com.hsfw.backyard.websocket333;/*** @Description* @Author: liucq* @Date: 2019/1/25*/import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.boot.web.support.SpringBootServletInitializer;import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication@MapperScan("com.siwei.insurance.*.dao")/*** //该注解是开启定时任务的⽀持*/@EnableSchedulingpublic class lifeInsuranceApplication extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {return builder.sources(lifeInsuranceApplication.class);}public static void main(String[] args) {SpringApplication.run(lifeInsuranceApplication.class, args);}}2. 写定时器package com.hsfw.backyard.websocket333;/*** @Description* @Author: liucq* @Date: 2019/1/25*/import com.siwei.insurance.permission.dao.RolePermissionDao;import com.siwei.insurance.productManage.dao.ExpirePushMsgMapper;import com.siwei.insurance.productManage.service.ProductService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.Scheduled;import java.util.ArrayList;import java.util.List;@Componentpublicclass ProductExpireTask {@Autowiredprivate RolePermissionDao rolePermissionDao;@Autowiredprivate ProductService productService;@Autowiredprivate ExpirePushMsgMapper expirePushMsgMapper;/*** 每天早上0点执⾏*/@Scheduled(cron = "0 0 0 1/1 * ?")public void productExpire() {//距离到期还有⼀个⽉提醒String oneMonthExpireDate = DateUtil.addOneMonth();dealExpireProduct(oneMonthExpireDate);//距离到期还有⼀天提醒String oneDayExpireDate = DateUtil.addOneDay();dealExpireProduct(oneDayExpireDate);//距离到期还有⼀周提醒String oneWeekExpireDate = DateUtil.addFewDays(7);dealExpireProduct(oneWeekExpireDate);}private void dealExpireProduct(String expireDate) {List<Map<String, Object>> expireProductMapList = productService.findExpireProducts(expireDate);if (expireProductMapList != null && !expireProductMapList.isEmpty()) {// 根据路径查询需要推送的⾓⾊List<String> needPushRoleIds = rolePermissionDao.findNeedPushRoleIdByUrl(TotalConstant.PRODUCT_PUSH_URL);List<ExpirePushMsg> expirePushMsgs = new ArrayList<>();for (Map<String, Object> expireProductMap : expireProductMapList) {ExpirePushMsg expirePushMsg = new ExpirePushMsg();expirePushMsg.setNeedPushEntityId((int) expireProductMap.get("id"));expirePushMsg.setNeedPushEntityNo((String) expireProductMap.get("insuranceNo"));String productName = (String) expireProductMap.get("insuranceName");expirePushMsg.setNeedPushEntityName(productName);//设置此推送消息的到期时间expirePushMsg.setExpireDate(DateUtil.stringToDate(DateUtil.addOneDay()));expirePushMsg.setPushType(2);StringBuffer needPushRoleIdString = new StringBuffer();needPushRoleIds.forEach(e -> needPushRoleIdString.append(e + ";"));expirePushMsg.setPushRoleId(needPushRoleIdString.toString().trim());String productExpireDateString = DateUtil.dateToShotString((Date) expireProductMap.get("expiryDate"));expirePushMsg.setPushMsg("您的产品:" + productName + ",将于" + productExpireDateString + "即将过期,请及时处理!"); expirePushMsgs.add(expirePushMsg);}expirePushMsgMapper.insertAll(expirePushMsgs);}}@Scheduled(cron = "0 0 0 1/1 * ?")public void pushMsgExpire() {String oneDayExpireDate = DateUtil.getZeroTime(DateUtil.addOneDay());//推送消息只存在⼀天,根据到期时间将数据删除expirePushMsgMapper.deleteByExpireDate(oneDayExpireDate);}}DateUtil⼯具类package com.hsfw.backyard.websocket333;/*** @Description* @Author: liucq* @Date: 2019/1/25*/import ng3.StringUtils;import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;/*** @Description 时间处理⼯具类 * @author linxiunan * @date 2018年9⽉3⽇*/public class DateUtil {private static final SimpleDateFormat dayOfDateFormat = new SimpleDateFormat("yyyy-MM-dd");private static final SimpleDateFormat secondOfDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/*** @return当天时间加⼀天,返回"yyyy-MM-dd"格式*/public static String addOneDay() {Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DAY_OF_MONTH, 1);return dayOfDateFormat.format(calendar.getTime());}/*** @return当天时间加⼀⽉,返回"yyyy-MM-dd"格式*/public static String addOneMonth() {Calendar calendar = Calendar.getInstance();calendar.add(Calendar.MONTH, 1);return dayOfDateFormat.format(calendar.getTime());}/*** @param dayNumber 加的天数 * @return返回当天时间添加⼏天之后的时间,返回"yyyy-MM-dd"格式*/public static String addFewDays(int dayNumber) {Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DAY_OF_MONTH, dayNumber);return dayOfDateFormat.format(calendar.getTime());}/*** @param dateString 需要转换成时间格式的⽇期字符串 * @return返回字符串转换成的时间*/public static Date stringToDate(String dateString) {ParsePosition parsePosition = new ParsePosition(0);if (dateString.contains(" ")) {return secondOfDateFormat.parse(dateString, parsePosition);} else {return dayOfDateFormat.parse(dateString, parsePosition);}}/*** @param date 需要转换成字符串格式的⽇期 * @return返回"yyyy-MM-dd"格式的转换后的字符串*/public static String dateToShotString(Date date) {return dayOfDateFormat.format(date);}/*** @param date 需要转换成字符串格式的⽇期 * @return返回"yyyy-MM-dd HH:mm:ss"格式的转换后的字符串*/public static String dateToLongString(Date date) {return secondOfDateFormat.format(date);}/*** @param dateString 需要获取0点的时间字符串,如果获取当天0点,传null即可 * @return返回"yyyy-MM-dd HH:mm:ss"格式的某天0点字符串 */public static String getZeroTime(String dateString) {if (StringUtils.isBlank(dateString)) {Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);return secondOfDateFormat.format(calendar.getTime());} else {Date date = stringToDate(dateString);return dateToLongString(date);}}}3. 引⼊websocket所需jar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>4. 配置websocket编写MyEndpointConfigure类package com.hsfw.backyard.websocket333;/*** @Description* @Author: liucq* @Date: 2019/1/25*/import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import javax.websocket.server.ServerEndpointConfig;public class MyEndpointConfigure extends ServerEndpointConfig.Configurator implements ApplicationContextAware {private static volatile BeanFactory context;@Overridepublic <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {return context.getBean(clazz);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {MyEndpointConfigure.context = applicationContext;}}websocket配置类package com.hsfw.backyard.websocket333;/*** @Description* @Author: liucq* @Date: 2019/1/25*/import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configurationpublic class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}@Beanpublic MyEndpointConfigure newConfigure() {return new MyEndpointConfigure();}}这⾥需要重点说明⼀下,在websocket配置类中,第⼀个配置是因为使⽤springboot内置容器,⾃⼰开发时需要配置,如果有独⽴的容器需要将其注释掉,也就意味着,如果将项⽬打成WAR包,部署到服务器,使⽤Tomcat启动时,需要注释掉ServerEndpointExporter配置;MyEndpointConfigure配置是因为我的需求需要,需要在websocket类中注⼊service层或者dao层的接⼝,MyEndpointConfigure配置就是为了解决websocket⽆法注⼊的问题,如果没有需要可以不⽤配置---------------------5. websocket类package com.hsfw.backyard.websocket333;/*** @Description* @Author: liucq* @Date: 2019/1/25*/import ng.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import ponent;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.concurrent.CopyOnWriteArraySet;@Component@ServerEndpoint(value = "/productWebSocket/{userId}", configurator = MyEndpointConfigure.class)public class ProductWebSocket {// 静态变量,⽤来记录当前在线连接数。

自己总结的vc定时器制作方法

自己总结的vc定时器制作方法

定时器VC定时器SetTimer函数一、SetTimer表示的是定义个定时器。

根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了。

SetTimer有两个函数。

①一个是全局的函数::SetTimer()UINT SetTimer(HWND hWnd, // handle of window for timer messagesUINT nIDEvent, // timer identifierUINT uElapse, // time-out valueTIMERPROC lpTimerFunc // address of timer procedure);其中hWnd 是指向CWnd的指针,即处理Timer事件的窗口类。

因此继承CWnd的子类均可以定义SetTimer事件。

②SetTimer() 在CWnd中也有定义,即SetTimer()是CWnd的一个成员函数。

CWnd的子类可以调用该函数,来设置触发器。

UINT SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );参数含义:nIDEvent:是指设置这个定时器的iD,即身份标志,这样在OnTimer()事件中,才能根据不同的定时器,来做不同的事件响应。

这个ID是一个无符号的整型。

nElapse是指时间延迟。

单位是毫秒。

这意味着,每隔nElapse毫秒系统调用一次Ontimer()。

void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)Specifies the address of the application-supplied TimerProc callback function that processes the WM_TIMER messages. If this parameter is NULL, the WM_TIMER messages are placed in the application’s message queue and handled by the CWnd object。

SpringBoot中定时任务的3种实现方式

SpringBoot中定时任务的3种实现方式

SpringBoot中定时任务的3种实现⽅式Ref定时任务的实现⽅式⽅式1:基于java.util.Timer定时器,实现类似闹钟的定时任务⽅式2:使⽤ Quartz、elastic-job、xxl-job 等开源第三⽅定时任务框架,适合分布式项⽬应⽤。

该⽅式的缺点是配置复杂。

⽅式3:使⽤ Spring 提供的⼀个注解@Schedule,开发简单,使⽤⽐较⽅便。

java.util.Timer实现定时任务基于java.util.Timer定时器,实现类似闹钟的定时任务。

这种⽅式在项⽬中使⽤较少,参考如下Demo。

import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class SpringbootAppApplication {/*** main⽅法* @param args*/public static void main(String[] args) {SpringApplication.run(SpringbootAppApplication.class, args);System.out.println("Server is running ...");TimerTask timerTask = new TimerTask() {@Overridepublic void run() {System.out.println("task run:"+ new Date());}};Timer timer = new Timer();timer.schedule(timerTask,10,3000);}}复制代码ScheduledExecutorService实现定时任务该⽅法类似Timer,参考如下Demo。

public class TestScheduledExecutorService {public static void main(String[] args) {ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();/*** @param command the task to execute 任务体* @param initialDelay the time to delay first execution ⾸次执⾏的延时时间* @param period the period between successive executions 任务执⾏间隔* @param unit the time unit of the initialDelay and period parameters 间隔时间单位*/service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);}}复制代码@Schedule实现定时任务Demo1. ⾸先,在项⽬启动类上添加@EnableScheduling注解,开启对定时任务的⽀持。

Timer2

Timer2
Point p = new Point ( this.DesktopLocation.X + 1 , this.DesktopLocation.Y ) ;
this.DesktopLocation = p ;
if ( p.X == 550 )
{
timer1.Enabled = false ;
this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
bel1.Font = new Font ( "宋体" , 22F , FontStyle.Bold , GraphicsUnit.Point , ( ( System.Byte ) ( 0 ) ) ) ;
设定Timer1的Interval值为"10",就是当Timer1启动后,每隔0.01秒触发的事件是Timer1_Tick(),在这个事件中编写给窗体左上角的横坐标不断加"1"的代码,就可以了,具体如下:
private void timer1_Tick(object sender, System.EventArgs e)
this.SuspendLayout ( ) ;
this.timer1.Enabled = true ;
this.timer1.Interval = 10 ;
this.timer1.Tick += new System.EventHandler ( this.timer1_Tick ) ;
this.AutoScaleBaseSize = new Size ( 5 , 13 ) ;
this.ClientSize = new Size ( 352 , 70 ) ;

Spring:ApplicationListener用法及原理

Spring:ApplicationListener用法及原理

if (this.parent != null) { if (this.parent instanceof AbstractApplicationContext) { ((AbstractApplicationContext) this.parent).publishEvent(event, eventType); } else { this.parent.publishEvent(event); } } } 派发方法源码: @Override public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) { ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); //获取所有事件监听器 for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
手动发布事件 还是调用publishEvent方法
容器关闭 调用doClose方法:
事件派发器的创建 容器启动时,调用refresh方法,其中有一步就初始化好了一些事件派发器
// Decorate event as an ApplicationEvent if necessary ApplicationEvent applicationEvent; if (event instanceof ApplicationEvent) { applicationEvent = (ApplicationEvent) event; } else { applicationEvent = new PayloadApplicationEvent<Object>(this, event); if (eventType == null) {

S7-1200 定时器的编程应用

S7-1200 定时器的编程应用

106Internet Application互联网+应用S7-1200 是 S7-200 的升级产品,目前已成为西门子新一代小型可编程控制,并已广泛应用于各种中小型自动化控制系统中。

在工业自动化控制过程中PLC 定时器常用于实现各种计时功能,所以本文以小型S7-1200为例,介绍定时器的应用方法,为学生学习S7-1200提供帮助,通过编程实例的讲解,让学生深入理解并灵活应用S7-1200定时器进行编程。

一、S7-1200定时器分类S7-1200 CPU 定时器是IEC 定时器,共有生成脉冲定时器(TP)、接通延时定时器(TON)、关断延时定时器(TOF)及时间累加器(TONR)4种。

IEC 定时器属于函数块(FB),定时器的设定值(PT)和当前值(ET)存储在指定的 IEC_TIMER DB 数据中,调用时需要指定配套的背景数据块。

用户程序中可以使用的定时器数量仅仅受CPU 的存储容量限制[1]。

二、S7-1200定时器指令的工作原理S7-1200定时器的编程应用【摘要】 本文重点介绍了S7-1200定时器指令的工作原理和编程方法,并通过编程实例详细介绍了定时器的编程应用,为初学者提供帮助。

【关键词】 S7-1200定时器 S7-200 PLCS7-200定时器有三种时基:1ms、10ms、100ms,预设时间和当前时间以数字形式输入,并与时基相乘,时基与定时器编号有关。

而S7-1200定时器没有编号,可用背景数据块的名称作为标识符,其时基均为1ms,每1ms 更新一次数据[2]。

定时设置时直接输入时间值即可。

TIME 数据使用 T# 标识符,可以用简单时间单元(T#500ms 或 500)或复合时间单元(如T#3s_500ms)的形式输入,最大定时值为T#24D_20H_31M_23S_647MS [3]。

4种定时器指令的工作原理与对应波形如图1(a)、(b)、(c)、(d)所示。

图1(a)中,当IN 端I0.1接通(信号上升沿)时,脉冲定时器开始计时,无论后续I0.0的信号状态如何变化,在PT 时间内(10s)输出Q 始终置位为“1”;如果定时器正在计时,即使检测到I0.1的信号再次从“0”变为“1”,Q的状态也不变。

MINITIMER BA 7905 延时定时器说明书

MINITIMER BA 7905 延时定时器说明书

124.09.21 en / 445AYour Advantages• Higher safety at connection of machine parts during start up • High repeat accuracy • Wide setting rangeh • Easy settingFeatures• Power ON-delay relay according to EN 61812-1• Delay up to 300 s• Repeat accuracy < ± 1 %• Voltage up to DC 220 V without series resistor • With remote potentiometer connection• With LED indication for operation and contact position • 1 or 2 changeover contacts • Width 45 mm0227956MINITIMER Timer, On-delay BA 7905The timer BA 7905 can be used to switch devices and controls with an adjustable on delay. With these timer the start behaviour of machine parts e. g. the starting of motors can be influenced. With a potentiometer the time delay can be adjusted simply over a large setting range.ApplicationTime dependent controlUpper LED: On when operating voltage applied Lower LED:On when output relay activatedBA 7905.81BA 7905.82Translationof the original instructionsAll technical data in this list relate to the state at the moment of edition. We reserve the right for technical improvements and changes at any time.224.09.21 en / 445ATime circuitTime ranges: 0.05 ... 1 s 1.5 ... 30 s 0.15 ... 3 s 5 ... 100 s0.5 ... 10 s 15 ... 300 sSetting: Stepless, setting on absolute scale. Connection possibility for externalvariable resistor on terminal Z1-Z2 (5-6). Variable resistor in the device to be set to the minimum value and bridge Z1-Z2(5-6) is to be removed.Recovery time tw 50 / 100:100/50 msRepeat accuracy: ≤ ± 1 % of max. scale value Voltage influence:0.5 %Temperature influence: 0.2 % / KInputNominal voltage U N : AC 24, 42, 110 ... 127, 230, 240 VDC 24, 42, 60, 110 ... 127, 220 V Voltage range:0.8 ... 1.1 U NNominal consumption: AC 24 230 V 1.9 18 VA DC 24 220 V0.8 2.6 W Nominal frequency: 50 / 60 Hz Frequency range: ± 5 % f NOutputContacts BA 7905.81: 1 changeover contact, delayed BA 7905.82: 2 changeover contacts, delayed Contact material: AgNiMeasured nominal voltage: AC 250 V Release time: 10 ms Thermal current I th : 5 A Switching capacity T o AC 15BA 7905.81: 3 A / AC 230 V IEC/EN 60947-5-1BA 7905.82: 2 A / AC 230 V IEC/EN 60947-5-1T o DC 13: 2 A / DC 24 V IEC/EN 60947-5-1Electrical life IEC/EN 60947-5-1T o AC 15 at 3 A, AC 230 V BA 7905.81: 2.5 x 105 switching cycles T o AC 15 at 2 A, AC 230 V BA 7905.82: 0.5 x 105 switching cycles Permissible switching frequency: 6000 switching cycles / h Short circuit strength Max. fuse rating: 4 A gG / gL IEC/EN 60947-5-1Mechanical life: 50 x 106switching cycles General DataOperating mode: Continuous operation Temperature range:Operation: - 20 ... + 60 °C Storage: - 20 ... + 60 °C Altitude:≤ 2000 mClearance and creepage distancesRated impulse voltage /pollution degree in- / output: 4 kV / 2 IEC 60664-1EMCElectrostatic discharge: 8 kV (air) IEC/EN 61000-4-2HF irradiation: 80 MHz ... 1 GHz: 12 V / m IEC/EN 61000-4-31 GHz ... 2.7 GHz: 10 V / m IEC/EN 61000-4-3Fast transients: 2 kVIEC/EN 61000-4-4Surge voltages Betweenwires for power supply: 1 kV IEC/EN 61000-4-5Between wire and ground: 2 kV IEC/EN 61000-4-5HF-wire guided:10 VIEC/EN 61000-4-6Interference suppression:Limit value class BEN 55011Degree of protection Housing: IP 40 IEC/EN 60529Terminals: IP 20 IEC/EN 60529Housing: Thermoplast with V0 behaviouraccording to UL subject 94Vibration resistance: Amplitude 0.35 mmfrequency 10...55Hz IEC/EN 60068-2-6Climate resistance: 20 / 050 / 04 IEC/EN 60068-1Terminal designation: EN 50005Wire connection: 2 x 2.5 mm 2 solid or2 x 1.5 mm 2 stranded wire with sleeveDIN 46228-1/-2/-3/-4Wire fixing: Flat terminals with self-liftingclamping piece IEC/EN 60999-1Fixing torque: 0.8 Nm Mounting: DIN rail IEC/EN 60715Weight: 170 gDimensionsWidth x height x depth : 45 x 74 x 133 mmBA 7905.82/200With guided contacts Ordering example for variants BA 7905 .81 /_ _ AC 230 V 50 / 60 Hz 300 sTime range max. valueNominal frequency Nominal voltage Variant, if required ContactsTypeBA 7905.81 AC 230 V 50/60 Hz 0.5 ... 10 s Article number: 0021737• Output: 1 changeover contact, delayed • Nominal voltage U N : AC 230 V • Time range: 0.5 ... 10 s • Width: 45 mm AD 3:External variable resistor0,05 ... 1 s 1 M Ω Article number: 00040820,15 ... 3 s 2,2 M Ω Article number: 00061540,5 ...10 s 10 M Ω Article number: 00040841,5 ... 30 s 10 M Ω Article number: 00040845 ... 100 s 10 M Ω Article number: 000408415 ... 300 s 20 M ΩArticle number: 0004085Degree of protection front side: IP 40M6925_aStandard dimensionE. Dold & Söhne GmbH & Co. KG • D-78120 Furtwangen dold-relays @ • •Bregstraße 18 • Phone +49 7723 654-0 • Fax +49 7723 654356。

QT定时器的使用方法

QT定时器的使用方法

QT定时器的使⽤⽅法在界⾯程序中很容易使⽤到,定时刷新或者更新什么东西,此时应该使⽤定时器的功能,定时器是在指定时间触发定时器函数,来达到定时的效果接下来介绍两种定时器的使⽤,废话不说直接上代码代码结构:dialog.h#ifndef DIALOG_H#define DIALOG_H#include <QDialog>#include <QTimerEvent>#include <QDebug>#include <QTimer>namespace Ui {class Dialog;}class Dialog : public QDialog{Q_OBJECTpublic:explicit Dialog(QWidget *parent = nullptr);~Dialog();enum timerIndex //枚举从 0 开始{timer1,timer2,timer3};private:Ui::Dialog *ui;QTimer *update_time;int id1,id2,id3;void timerEvent(QTimerEvent *event);private slots:void time_update();};#endif// DIALOG_Hdialog.cpp#include "dialog.h"#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog){ui->setupUi(this);id1 = startTimer(1000);id2 = startTimer(2000);id3 = startTimer(3000);update_time = new QTimer();connect(update_time,SIGNAL(timeout()),this,SLOT(time_update()));update_time->start(1000); //1秒钟后启动}void Dialog::timerEvent(QTimerEvent *event){qDebug() << event->timerId() << endl;switch (event->timerId()-1){case timer1 :qDebug() << "timer1" << endl;break;case timer2 :qDebug() << "timer2" << endl;break;case timer3 :qDebug() << "timer3" << endl;break;default:qDebug() << "no !!"<<endl;break;}}void Dialog::time_update(){qDebug() <<"update"<< endl;}Dialog::~Dialog(){delete ui;}main.cpp#include "dialog.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Dialog w;w.show();return a.exec();}两种定时器使⽤⽅法已经介绍,可以根据⾃⼰的实际情况进⾏选择使⽤,个⼈感觉推荐使⽤获取定时器id 的那种⽅法,⽐较⽅便⼯程代码在此链接需要⾃⾏下载链接:https:///s/1iM3IgRzfEoOD21ek1L_GVQ提取码:hcqy。

PyQt5中QTimer定时器的实例代码

PyQt5中QTimer定时器的实例代码

PyQt5中QTimer定时器的实例代码如果要在应⽤程序中周期性地进⾏某项操作,⽐如周期性地检测主机的CPU值,则需要⽤到QTimer定时器,QTimer类提供了重复的和单次的定时器。

要使⽤定时器,需要先创建⼀个QTimer实例,将其timeout信号连接到相应的槽,并调⽤start()。

然后定时器会以恒定的间隔发出timeout信号,当窗⼝控件收到timeout信号后,它就会停⽌这个定时器。

⼀、QTimer类中的常⽤⽅法⽅法描述start(milliseconds)启动或重新启动定时器,时间间隔为毫秒。

如果定时器已经运⾏,它将被停⽌并重新启动。

如果singleShot信号为真,定时器将仅被激活⼀次Stop()停⽌定时器⼆、QTimer类中的常⽤信号信号描述singleShot在给定的时间间隔后调⽤⼀个槽函数时发射此信号timeout当定时器超时时发射此信号三、QTimer的使⽤⽰例1:import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *class Demo(QWidget):count = 0def __init__(self):super().__init__()self.setGeometry(100, 50, 500, 400)self.setWindowTitle('QTimer')self.list = QListWidget()bel = QLabel('显⽰当前时间')self.start = QPushButton('开始')self.end = QPushButton('结束')layout = QGridLayout()#初始化定时器self.timer = QTimer(self)self.timer.timeout.connect(self.showTime)self.start.clicked.connect(self.startTimer)self.end.clicked.connect(self.endTimer)layout.addWidget(bel,0,0,1,2)layout.addWidget(self.start,1,0)layout.addWidget(self.end,1,1)self.setLayout(layout)def showTime(self):#获取系统现在的时间time = QDateTime.currentDateTime().toString('yyyy-MM-dd hh:mm:ss dddd')bel.setText(time)def startTimer(self):#设置时间间隔并启动定时器self.timer.start(1000)self.start.setEnabled(False)self.end.setEnabled(True)def endTimer(self):#关闭定时器self.timer.stop()self.start.setEnabled(True)self.end.setEnabled(False)if __name__ == "__main__":app = QApplication(sys.argv)form = Demo()form.show()sys.exit(app.exec_())运⾏效果如下:⽰例2:import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *if __name__ == "__main__":app = QApplication(sys.argv)label = QLabel('<font color=blue size=20><b>PyQt5,窗⼝5秒后消失</b></font>')#⽆边框窗⼝label.setWindowFlags(Qt.SplashScreen|Qt.FramelessWindowHint)label.show()#设置5秒后⾃动退出QTimer.singleShot(5000,app.quit)sys.exit(app.exec_())运⾏效果如下:PyQt5 QTimer计数到特定的秒数我正在使⽤python创建程序,并且正在使⽤pyqt。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Quartz定时发送消息的功能,该功能依附于Web应用上,即当Web应用启动时,该应用就开始作用。

起先决定使用java.util.Timer和java.util.TimerTask来实现,但是研究了一下以后发现Java Timer的功能比较弱,而且其线程的范围不受Web应用的约束。

后来发现了Quartz这个开源的调度框架,非常有趣。

首先我们要得到Quartz的最新发布版。

目前其最新的版本是1.6。

我们可以从以下地址获得它的完整下载包,包中可谓汤料十足,不仅有我们要的quartz.jar,更包含多个例程和详细的文档,从API到配置文件的XSD一应俱全。

感兴趣的朋友也可以在src目录下找到该项目的源码一看究竟。

废话少说,下面就来看一看这个东东是怎么在Java Web Application中得以使用的。

首先不得不提出的是Quartz的三个核心概念:调度器、触发器、作业。

让我们来看看他们是如何工作的吧。

一.作业总指挥——调度器1.Scheduler接口该接口或许是整个Quartz中最最上层的东西了,它提携了所有触发器和作业,使它们协调工作。

每个Scheduler都存有JobDetail和Trigger的注册,一个Scheduler中可以注册多个JobDetail和多个Trigger,这些JobDetail和Trigger都可以通过group name和他们自身的name加以区分,以保持这些JobDetail和Trigger的实例在同一个Scheduler内不会冲突。

所以,每个Scheduler中的JobDetail的组名是唯一的,本身的名字也是唯一的(就好像是一个JobDetail的ID)。

Trigger也是如此。

Scheduler实例由SchedulerFactory产生,一旦Scheduler实例生成后,我们就可以通过生成它的工厂来找到该实例,获取它相关的属性。

下面的代码为我们展示了如何从一个Servlet中找到SchedulerFactory并获得相应的Scheduler实例,通过该实例,我们可以获取当前作业中的testmode 属性,来判断该作业是否工作于测试模式。

Java代码1.//从当前Servlet上下文中查找StdSchedulerFactory2.3.ServletContext ctx=request.getSession().getServletContext();4.5.StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");6.7.Scheduler sch = null;8.9.try{10.11.//获取调度器12.13.sch = factory.getScheduler("SchedulerName");14.15.//通过调度器实例获得JobDetail,注意领会JobDetailName和GroupName的用法16.17.JobDetail jd=sch.getJobDetail("JobDetailName", "GroupName");18.19.Map jobmap1=jd.getJobDataMap();20.21.istest=jobmap1.get("testmode")+"";22.23.} catch(Exception se) {24.25.//如果得不到当前作业,则从配置文件中读取testmode26.27.ReadXML("job.xml").get(“job.testmode”);28.29.}[java]view plaincopyprint?1.//从当前Servlet上下文中查找StdSchedulerFactory2.3.ServletContext ctx=request.getSession().getServletContext();4.5.StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute("org.quartz.impl.StdSchedulerFact ory.KEY");6.7.Scheduler sch = null;8.9.try {10.11.//获取调度器12.13.sch = factory.getScheduler("SchedulerName");14.15.//通过调度器实例获得JobDetail,注意领会JobDetailName和GroupName的用法16.17.JobDetail jd=sch.getJobDetail("JobDetailName", "GroupName");18.19.Map jobmap1=jd.getJobDataMap();20.21.istest=jobmap1.get("testmode")+"";22.23.} catch (Exception se) {24.25.//如果得不到当前作业,则从配置文件中读取testmode26.27.ReadXML("job.xml").get(“job.testmode”);28.29.}Scheduler实例生成后,它处于"stand-by"模式,需要调用其start方法来使之投入运作。

Java代码1.public class SendMailShedule{2.3.//设置标准SchedulerFactory4.5.static SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();6.7.static Scheduler sched;8.9.public static void run()throws Exception{10.11.//生成Scheduler实例12.13.sched = schedFact.getScheduler();14.15.//创建一个JobDetail实例,对应的Job实现类是SendMailJob16.17.JobDetail jobDetail = new JobDetail("myJob",sched.DEFAULT_GROUP,SendMailJob.class);18.19.//设置CronTrigger,利用Cron表达式设定触发时间20.21.CronTrigger trigger = new CronTrigger("myTrigger","test","0 0 8 1 * ?");22.23.sched.scheduleJob(jobDetail, trigger);24.25.sched.start();26.27.}28.29.public static void stop()throws Exception{30.31.sched.shutdown();32.33.}34.35.}[java]view plaincopyprint?1.public class SendMailShedule{2.3.//设置标准SchedulerFactory4.5.static SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();6.7.static Scheduler sched;8.9.public static void run()throws Exception{10.11.//生成Scheduler实例12.13.sched = schedFact.getScheduler();14.15.//创建一个JobDetail实例,对应的Job实现类是SendMailJob16.17.JobDetail jobDetail = new JobDetail("myJob",sched.DEFAULT_GROUP,SendMailJob.class);18.19.//设置CronTrigger,利用Cron表达式设定触发时间20.21.CronTrigger trigger = new CronTrigger("myTrigger","test","0 0 8 1 * ?");22.23.sched.scheduleJob(jobDetail, trigger);24.25.sched.start();26.27.}28.29.public static void stop()throws Exception{30.31.sched.shutdown();32.33.}34.35.}另外,我们也可以通过监听器来跟踪作业和触发器的工作状态。

二.作业及其相关1. Job作业实际上是一个接口,任何一个作业都可以写成一个实现该接口的类,并实现其中的execute()方法,来完成具体的作业任务。

2. JobDetailJobDetail可以指定我们作业的详细信息,比如可以通过反射机制动态的加载某个作业的实例,可以指定某个作业在单个调度器内的作业组名称和具体的作业名称,可以指定具体的触发器。

一个作业实例可以对应多个触发器(也就是说学校每天10点放一次眼保健操录音,下午3点半可以再放一次),但是一个触发器只能对应一个作业实例(10点钟的时候学校不可能同时播放眼保健操和广播体操的录音)。

3. JobDataMap这是一个给作业提供数据支持的数据结构,使用方法和java.util.Map一样,非常方便。

当一个作业被分配给调度器时,JobDataMap实例就随之生成。

Job有一个StatefulJob子接口,代表有状态的任务,该接口是一个没有方法的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。

无状态任务在执行时拥有自己的JobDataMap拷贝,对JobDataMap的更改不会影响下次的执行。

而有状态任务共享共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,也即每次执行任务后都会对后面的执行发生影响。

相关文档
最新文档