spring定时器配置
Spring提供的三种定时任务机制及其比较
Spring提供的三种定时任务机制及其比较定时任务的需求在众多应用系统中广泛存在,在Spring中,我们可以使用三种不同的定时机制,下面一一描述并加以比较1. 基于Quartz的定时机制下面详细解释这个类图中涉及的关键类及其使用场景1.1. SchedulerFactoryBean这是Spring中基于Quartz的定时机制入口,只要Spring容器装载了这个类,Quartz定时机制就会启动,并加载定义在这个类中的所有triggerSpring配置范例:[xhtml]view plaincopy1.<bean id="sfb"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">2.<!-- 添加触发器 -->3.<property name="triggers">4.<list>5.<ref local="appSubscTrigger"/>6.</list>7.</property>8.9.<!-- 添加listener -->10.<property name="globalTriggerListeners">11.<list>12.<ref local="myTaskTriggerListener"/>13.</list>14.</property>15.</bean>1.2. CronTriggerBean实现了Trigger接口,基于Cron表达式的触发器这种触发器的好处是表达式与linux下的crontab一致,能够满足非常复杂的定时需求,也容易配置Spring配置范例:[xhtml]view plaincopy1.<bean id="notifyTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">2.<property name="jobDetail"ref="notifyJobDetail"/>3.<property name="cronExpression"value="${notify_trigger_cron_expression}"/>4.</bean>1.3. SimpleTriggerBean该类也实现了Trigger接口,基于配置的定时调度这个触发器的优点在于很容易配置一个简单的定时调度策略Spring配置范例:[xhtml]view plaincopy1.<bean id="simpleReportTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean">2.<property name="jobDetail">3.<ref bean="reportJob"/>4.</property>5.<property name="startDelay">6.<value>3600000</value>7.</property>8.<property name="repeatInterval">9.<value>86400000</value>10.</property>11.</bean>1.4. JobDetailBeanJobDetail类的简单扩展,能够包装一个继承自QuartzJobBean的普通Bean,使之成为定时运行的Job缺点是包装的Bean必须继承自一个指定的类,通用性不强,对普通Job的侵入性过强,不推荐使用1.5. MethodInvokingJobDetailFactoryBeanSpring提供的一个不错的JobDetail包装工具,能够包装任何bean,并执行类中指定的任何stati或非static的方法,避免强制要求bean去实现某接口或继承某基础类Spring配置范例:[xhtml]view plaincopy1.<bean id="notifyJobDetail"parent="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">2.<property name="targetObject"ref="notifyServerHandler"/>3.<property name="targetMethod"value="execute"/>4.</bean>1.6. 关于TriggerListener和JobListenerQuartz中提供了类似WebWork的拦截器的功能,系统执行任务前或任务执行完毕后,都会检查是否有对应的Listener需要被执行,这种AOP的思想为我们带来了灵活的业务需求实现方式。
spring定时器定时任务到时间未执行问题的解决
spring定时器定时任务到时间未执⾏问题的解决⽬录spring定时器定时任务到时间未执⾏应⽤场景原因分析解决⽅式解决修改系统时间后Spring 定时任务不执⾏问题描述起因错误解决问题spring定时器定时任务到时间未执⾏应⽤场景⼀个定时器类中有n个定时任务,有每30秒执⾏⼀次的还有每1分钟执⾏⼀次的,出现问题的定时任务是0点整时执⾏的定时任务到了0点没有执⾏。
原因分析spring定时器任务scheduled-tasks默认配置是单线程串⾏执⾏的,当某个定时任务出现阻塞,或者执⾏时间过长,则线程就会被占⽤,其他定时任务排队执⾏,导致后⾯的定时任务未能准时执⾏。
解决⽅式开启多线程定时任务执⾏/*** 多线程执⾏定时任务*/@Configurablepublic class ScheduleConfig implements SchedulingConfigurer {private static final int FIVE = 5;@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(FIVE));}}解决修改系统时间后Spring 定时任务不执⾏问题描述Spring 定时任务不执⾏事情起因是这样的,我们有⼀个spring定时任务,每隔半⼩时要执⾏⼀次。
起因由于种种原因,昨晚上这台服务器被关机了,今早【重启服务器】和【启动定时任务服务】。
机器重启后,发现服务器机器系统时间和实际北京时间不⼀致,相差10个⼩时。
于是乎,我使⽤date -s 10:35:35 设置和北京时间保持⼀致。
错误本以为这样,时间已经⼀致了,定时任务应该能正常执⾏了!等了好⼏个⼩时,定时任务依然没有执⾏。
如何在spring中配置定时任务(job)-zxs9999的专栏-CSDN博客
如何在spring中配置定时任务(job)-zxs9999的专栏-CSDN博客如何在spring中配置定时任务(job) 收藏一、在web.xml文件中进行如下配置:<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/classes/applicationContext-*.xml</param-value></context-param>那么需要在工程下创建一个以applicationContext- 为开头的xml 文件eg:applicationContext-jobconfig.xmlxml的头和结尾部分跟其他spring配置文件相似,就不赘述,正文如下:<bean id="youJobName(类别名)" class="com.******.YourJobClassLocation(类的定位)" /> <bean id="doYourJob(别名)" class="org.springframework.scheduling.quartz.MethodInvoking JobDetailFactoryBean"><property name="targetObject"><ref bean="youJobName(类别名)""/></property><property name="targetMethod"><value>runMethodName(定时执行的方法名)</value></property></bean><bean id="youJobNameTrigger(触发器别名)" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail"><ref bean="doYourJob(别名)""/></property><property name="cronExpression"><value>0 0/20 * * * ?(定时的时间配置)</value></property></bean><bean id="doScheduler" class="org.springframework.scheduling.quartz.SchedulerFactory Bean"><property name="triggers"><list><ref local="youJobNameTrigger(触发器别名)"/></list></property></bean>这样的配置几本就可以运转了,但是有一个地方可能是你需要根据你的需求来确定的,那就是触发时间。
定时器配置
<!-- 定时任务执行次数,-1表示永久执行-->
<property name="repeatCount" value="-1" />
</bean>
<!-- 启动定时器,triggers属性接受一组触发器 -->
<bean name="priScheduler"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="snmpQueryInfoService" />
<property name="targetMethod" value="execute" />
<property name="concurrent" value="false" />
</bean>
<!-- CronTriggerBean指定工作的准确运行时间
<bean id="snmp" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="querySnmp" />
spring定时器的说明
<property name="jobClass" value="com.zb.job.PlanJob"/>
<!-- 注入参数 -->
<property name="jobDataAsMap"&;entry key="planService" value-ref="planService"></entry>
<entry key="name" value="王二"></entry>
</map>
</property>
</bean>
7.注入触发器
第一种: 间隔时间发生事情
<bean id="mytrig" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!-- 间隔时间 -->
<property name="repeatInterval" value="3000"></property>
</bean>
第二种 : 每天的某个时间发生
<bean id="mytrig" class="org.springframework.scheduling.quartz.CronTriggerBean">
spring quartz定时器的简单配置和使用
</bean>
<!-- 第三步: 定义好调用模式: 如每隔2秒钟调用一次或每天的哪个时间调用一次等 -->
<bean id="printTimerTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="applicationContextSchedulerContextKey" value="applicationContext"/>
<property name="triggers">
<list>
<property name="jobDetail" ref="printTimerJob" />
<property name="cronExpression" value="0/2 * * * * ?" />
</bean>
<!-- 启动定时器 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 加载spring的配置文件(一个或者多个) -->
<context-param>
<param-name>contextConfigLocation</param-name>
JAVA定时器JAVA定时器
定时器1、首先在导入Spring所有包的前提下还要导入一个定时器包:quartz-1.6.2.jar,然后在写一个要执行的任务类,如下:public class Prison {public Prison() {}public void execute() {List<Into_Prison> prisonlist = new ArrayList<Into_Prison>();prisonlist=into_prisonService.getAll();if(prisonlist.size()!=0 ){for(Into_Prison prison : prisonlist){if(Integer.parseInt(prison.getIp_Leftday())>0){ prison.setIp_Leftday(String.valueOf(Integer.parseInt(prison.getIp_Leftday() )-1));into_prisonService.save(prison);}else{prison.setIp_Leftday("0");into_prisonService.save(prison);}}}//System.out.println("=======执行了吗============");}private Into_PrisonService into_prisonService;public Into_PrisonService getInto_prisonService() {return into_prisonService;}public void setInto_prisonService(Into_PrisonService into_prisonService) {this.into_prisonService = into_prisonService;}}2、然后在Spring中的配置文件如下:<bean id="prison" class="com.prison.action.Prison"><property name="into_prisonService" ref="into_prisonService" /> </bean>以上配置为给任务类的注入<bean id="saveProjectJob"class="org.springframework.scheduling.qua rtz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref local="prison" /></property><property name="targetMethod"><value>execute</value></property></bean>指定任务类中执行的方法:execute,把任务类的注入给Spring.<bean id="timeTrigger"class="org.springframework.scheduling.quartz .CronTriggerBean"><property name="jobDetail"><ref local="saveProjectJob" /></property><property name="cronExpression"><value>59 59 23 * * ?</value></property></bean>设置定时器的时间,59 59 23 * * ?为在每天的23:59:59执行<bean id="scheduler"class="org.springframework.scheduling.quartz.S chedulerFactoryBean"><property name="triggers"><list><ref bean="timeTrigger"/></list></property></bean>执行定时器以上定时器主要完成的是把数据库里某个字段的数据过一天就减少一天。
enablescheduling注解
enablescheduling注解enablescheduling注解,又叫Spring定时任务注解,是Spring 框架提供的一种能够自动安排任务执行的注解。
其作用是在用户设定的定时时间到期后,自动触发用户设置的任务,以实现定时执行的功能。
enablescheduling注解的使用,可以大大降低开发和维护的复杂度,提高应用的可靠性,也有利于统一定时任务的管理。
## 二、enablescheduling注解原理enablescheduling注解是基于Java的反射机制来实现的,当用户将enablescheduling注解添加到目标类时,Spring就会检测到注解所标注的对象,然后对其进行反射处理,通过反射机制解析注解,实现对目标类的操作。
这就是enablescheduling注解的原理。
## 三、enablescheduling注解的使用1. 使用@Enablesscheduling注解:在类上添加@Enablesscheduling注解,开启定时任务功能;2.加@Scheduled注解:在要执行定时任务的方法上添加@Scheduled注解,定义执行任务的时间和间隔;3.动定时任务:启动Spring容器,就可以自动执行定时任务; ##、enablescheduling注解的优势1.便快捷:使用enablescheduling注解,可以快速实现定时任务,新手也可以非常容易上手;2.于管理:使用enablescheduling注解,可以统一管理各个任务,可以更加方便地进行定时任务的开启、暂停和停止;3.高应用可靠性:使用enablescheduling注解,可以有效减少任务的失败率,提高任务的可靠性;4.低开发复杂度:使用enablescheduling注解,可以减少专门用于定时任务的程序的开发,降低开发复杂度;## 五、enablescheduling注解的不足1.前只支持单机环境:enablescheduling注解目前只支持单机环境,对于分布式环境,需要分别配置定时任务;2.带有参数的定时任务支持不够好:enablescheduling注解对带有参数的定时任务支持不够好,要实现带有参数的定时任务,还需要稍微改动代码;3.度任务量过大也会受到影响:如果调度任务量过大,可能会造成系统性能的下降,对系统整体性能造成影响;##、enablescheduling注解的应用1.常提醒:enablescheduling注解可以用于实现日常提醒,例如每日早上定时提醒用户进行备忘录的查看和记录等;2.现网站的定时统计:可以使用enablescheduling注解定时统计某个网站的数据,以便于更加直观地查看网站的历史访问情况;3.时发布内容:可以使用enablescheduling注解定时发布内容,例如可以定时发布某个博客站点的每日文章等;## 七、总结enablescheduling注解是一种可以自动安排任务执行的注解,它的使用可以方便快捷的实现定时任务,提高应用的可靠性,降低开发复杂度,可以应用于日常提醒,定时统计,定时发布内容等方面。
spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的方法
spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的⽅法串⾏的定时任务@Componentpublic class ScheduledTimer {private Logger logger = Logger.getLogger(this.getClass());/*** 定时任务,1分钟执⾏1次,更新潜在客户超时客户共享状态*/@Scheduled(cron="0 0/1 8-20 * * ?")public void executeUpdateCuTask() {Thread current = Thread.currentThread();(" 定时任务1:"+current.getId()+ ",name:"+current.getName());}@Scheduled(cron="0 0/1 8-20 * * ?")public void executeGetRepayTask() {Thread current = Thread.currentThread();(" 定时任务2:"+current.getId()+ ",name:"+current.getName());}}并⾏的定时任务需要添加配置⽂件因为spring-boot的⽬的就是⼲掉配置⽂件,我在⽹上看到的很多都是通过配置⽂件来实现的,这⾥通过代码配置实现:@Configurationpublic class ScheduleConfig implements SchedulingConfigurer{@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar){TaskScheduler taskScheduler = taskScheduler();taskRegistrar.setTaskScheduler(taskScheduler);}@Bean(destroyMethod = "shutdown")public ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(20);scheduler.setThreadNamePrefix("task-");scheduler.setAwaitTerminationSeconds(60);scheduler.setWaitForTasksToCompleteOnShutdown(true);return scheduler;}}⽹上教程说的需要在启动类上加上@EnableScheduling注解来发现注解@Scheduled的任务并后台执⾏。
spring定时任务
Chapter 23. Spring中的定时调度(Scheduling)和线程池(Thread Pooling)23.1. 简介Spring包含了对定时调度服务的内置支持类。
当前,Spring支持从JDK1.3开始内置的Timer类和QuartzScheduler(/quartz/)。
二者都可以通过FactoryBean,分别指向Timer或Trigger实例的引用进行配置。
更进一步,有个对Quartz Scheduler和Timer都有效的工具类可以让你调用某个目标对象的方法(类似通常的MethodInvokingFactoryBean操作)。
Spring 还包含有用于线程池调度的类,它针对Java 1.3,1.4,5和JEE环境的差异都进行了抽象。
23.2. 使用OpenSymphony Quartz 调度器Quartz使用Trigger, Job以及JobDetail等对象来进行各种类型的任务调度。
关于Quartz的基本概念,请参阅/quartz。
为了让基于Spring的应用程序方便使用,Spring提供了一些类来简化uartz的用法。
23.2.1. 使用JobDetailBeanJobDetail对象保存运行一个任务所需的全部信息。
Spring提供一个叫作JobDetailBean的类让JobDetail能对一些有意义的初始值进行初始化。
让我们来看个例子:<bean name="exampleJob"class="org.springframework.scheduling.quartz.JobDetailBean"><property name="jobClass" value="example.ExampleJob" /><property name="jobDataAsMap"><map><entry key="timeout" value="5" /></map></property></bean>Job detail bean拥有所有运行job(ExampleJob)的必要信息。
Quartz在Spring中如何动态配置时间
Quartz在Spring中如何动态配置时间在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度。
有关调度的实现我就第一就想到了Quartz这个开源调度组件,因为很多项目使用过,Spring 结合Quartz静态配置调度任务时间,非常easy。
比如:每天凌晨几点定时运行一个程序,这只要在工程中的spring配置文件中配置好spring整合quartz的几个属性就好。
Spring配置文件引用<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="simpleService" /><property name="targetMethod" value="test" /></bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="jobDetail" /><property name="cronExpression" value="0 0/50 * ? * * *" /></bean><bean id="schedulerTrigger" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger"/></list></property></bean>这种配置就是对quartz的一种简单的使用了,调度任务会在spring启动的时候加载到内存中,按照cronTrigger中定义的cronExpression定义的时间按时触发调度任务。
【spring-boot】springboot整合quartz实现定时任务
【spring-boot】springboot整合quartz实现定时任务在做项⽬时有时候会有定时器任务的功能,⽐如某某时间应该做什么,多少秒应该怎么样之类的。
spring⽀持多种定时任务的实现。
我们来介绍下使⽤spring的定时器和使⽤quartz定时器 1.我们使⽤spring-boot作为基础框架,其理念为零配置⽂件,所有的配置都是基于注解和暴露bean的⽅式。
2.使⽤spring的定时器: spring⾃带⽀持定时器的任务实现。
其可通过简单配置来使⽤到简单的定时任务。
@Component@Configurable@EnableSchedulingpublic class ScheduledTasks{@Scheduled(fixedRate = 1000 * 30)public void reportCurrentTime(){System.out.println ("Scheduling Tasks Examples: The time is now " + dateFormat ().format (new Date ()));}//每1分钟执⾏⼀次@Scheduled(cron = "0 */1 * * * * ")public void reportCurrentByCron(){System.out.println ("Scheduling Tasks Examples By Cron: The time is now " + dateFormat ().format (new Date ()));}private SimpleDateFormat dateFormat(){return new SimpleDateFormat ("HH:mm:ss");}}没了,没错,使⽤spring的定时任务就这么简单,其中有⼏个⽐较重要的注解: @EnableScheduling:标注启动定时任务。
Spring4定时器cronTrigger和simpleTrigger实现方法
Spring4定时器cronTrigger和simpleTrigger实现⽅法spring4定时器 cronTrigger和simpleTrigger实现⽅法Quartz 是个开源的作业调度框架,为在应⽤程序中进⾏作业调度提供了简单却强⼤的机制。
Quartz 允许开发⼈员根据时间间隔(或天)来调度作业。
它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。
整合了 Quartz 的应⽤程序可以重⽤来⾃不同事件的作业,还可以为⼀个事件组合多个作业。
SimpleTrigger 当需要在规定的时间执⾏⼀次或在规定的时间段以⼀定的时间间隔重复触发执⾏Job时,SimpleTrigger就可以满⾜要求;SimpleTrigger的属性有:开始时间、结束时间、重复次数和重复的时间间隔,重复次数属性的值可以为0、正整数、或常量 SimpleTrigger.REPEAT_INDEFINITELY,重复的时间间隔属性值必须为0或长整型的正整数,以毫秒作为时间单位,当重复的时间间隔为0时,意味着与Trigger同时触发执⾏(或⼏乎与Scheduler开始时同时触发执⾏)。
如果有指定结束时间属性值,则结束时间属性优先于重复次数属性,这样的好处在于:当我们需要创建⼀个每间隔10秒钟触发⼀次直到指定的结束时间的 Trigger,⽽⽆需去计算从开始到结束的所重复的次数,我们只需简单的指定结束时间和使⽤REPEAT_INDEFINITELY作为重复次数的属性值即可(我们也可以指定⼀个⽐在指定结束时间到达时实际执⾏次数⼤的重复次数)。
CronTrigger ⽀持⽐ SimpleTrigger 更具体的调度,⽽且也不是很复杂。
基于 cron 表达式,CronTrigger ⽀持类似⽇历的重复间隔,⽽不是单⼀的时间间隔。
Cron 表达式包括以下 7 个字段:格式: [秒] [分] [⼩时] [⽇] [⽉] [周] [年]序号说明是否必填允许填写的值允许的通配符1 秒是 0-59 , - * /2 分是 0-59 , - * /3 ⼩时是 0-23 , - * /4 ⽇是 1-31 , - * ? / L W5 ⽉是 1-12 or JAN-DEC , - * /6 周是 1-7 or SUN-SAT , - * ? / L #7 年否 empty 或 1970-2099 , - * /Quartz官⽅⽹站对SimpleTrigger和CronTrigger的简单对⽐:SimpleTrigger is handy if you need 'one-shot' execution (just single execution of a job at a given moment in time), or if you need to fire a job at a given time, and have it repeat N times, with a delay of T between executions.当你需要的是⼀次性的调度(仅是安排单独的任务在指定的时间及时执⾏),或者你需要在指定的时间激活某个任务并执⾏N次,设置每次任务执⾏的间隔时间T。
Spring内置定时任务调度@Scheduled使用详解
Spring内置定时任务调度@Scheduled使⽤详解Spring提供了@Scheduled注解⽤于定时任务。
⼀、@Scheduled的基本使⽤启⽤调度⽀持:@EnableScheduling可以将@Scheduled注释与触发器元数据⼀起添加到⽅法中。
例如,以下⽅法每隔5秒调⽤⼀次,并具有固定的延迟,这意味着周期是从前⾯每次调⽤的完成时间开始计算的@Scheduled(fixedDelay=5000)public void doSomething() {// something that should execute periodically}如果需要固定速率执⾏,可以更改批注中指定的属性名。
以下⽅法每5秒调⽤⼀次(在每次调⽤的连续开始时间之间计算)@Scheduled(fixedRate=5000)public void doSomething() {// something that should execute periodically}对于固定延迟和固定速率任务,可以通过指⽰在⾸次执⾏⽅法之前要等待的毫秒数来指定初始延迟@Scheduled(initialDelay=1000, fixedRate=5000)public void doSomething() {// something that should execute periodically}如果简单的周期性调度不够表达,可以提供cron表达式。
例如,以下命令仅在⼯作⽇执⾏:@Scheduled(cron="*/5 * * * * MON-FRI")public void doSomething() {// something that should execute on weekdays only}实现SchedulingConfigurer接⼝,重写configureTasks⽅法:@Schedule注解的⼀个缺点就是其定时时间不能动态更改,它适⽤于具有固定任务周期的任务,若要修改任务执⾏周期,只能⾛“停服务→修改任务执⾏周期→重启服务”这条路。
spring自带的定时任务功能基于注解和xml配置
spring自带的定时任务功能基于注解和xml配置版权声明:本文为博主原创文章,未经博主允许不得转载。
1、spring的配置文件[html] view plain copy <beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xmlns:p="/schema/p" xmlns:task="/schema/task" xmlns:context="/schema/conte xt"xmlns:aop="/schema/aop" xsi:schemaLocation="/schema/ beans/schema/beans/spring-beans-3.0.xsd /schema/tx /schema/tx/spring-tx-3.0.xsd /schema/jee/schema/jee/spring-jee-3.0.xsd /schema/context/schema/context/spring-context -3.0.xsd /schema/aop /schema/aop/spring-aop-3.0.xsd /schema/task /schema/task/spring-task-3.0.xs d"> <task:annotation-driven /> <!-- 定时器开关--> <bean id="myTaskXml"class="com.spring.task.MyTaskXml"></bean><task:scheduled-tasks> <!--这里表示的是每隔五秒执行一次--><task:scheduled ref="myTaskXml" method="show"cron="*/5 * * * * ?" /> <task:scheduledref="myTaskXml" method="print" cron="*/10 * * * * ?"/> </task:scheduled-tasks> <!-- 自动扫描的包名--> <context:component-scanbase-package="com.spring.task" /> </beans>2、基于xml的定时器任务[java] view plain copy package com.spring.task; /** * 基于xml的定时器* @author hj */ public class MyTaskXml { public void show(){ System.out.println("XMl:is show run"); } public voidprint(){ System.out.println("XMl:printrun"); } } 3、基于注解的定时器任务[java] view plain copy package com.spring.task; importorg.springframework.scheduling.annotation.Scheduled; importponent; /** * 基于注解的定时器* @author hj */ @Component public class MyTaskAnnotation { /** * 定时计算。
crontriggerfactorybean用法(一)
crontriggerfactorybean用法(一)crontriggerfactorybean用法•介绍•cron表达式•代码示例介绍在Java中,我们经常需要使用定时器来执行一些动作。
而Spring框架提供了一个非常方便的定时器工具类——CronTriggerFactoryBean。
CronTriggerFactoryBean是一个FactoryBean,它用于创建CronTrigger实例。
CronTrigger是一个可以根据Cron表达式设定执行时间的Trigger(触发器)。
cron表达式Cron表达式是一种时间表达式,它可以帮助我们非常方便地设定按照规律执行的时间点。
Cron表达式的格式如下:<秒> <分> <时> <日> <月> <周> <年>其中,年是可选的。
例:0 0 12 * * ? 表示每天中午12点执行。
表达式中各字段的含义如下:•<秒>:秒,取值范围 0 - 59。
•<分>:分,取值范围 0 - 59。
•<时>:时,取值范围 0 - 23。
•<日>:天,取值范围 1 - 31。
•<月>:月,取值范围 1 - 12。
•<周>:星期,取值范围 1 - 7,1 表示星期日,2 表示星期一,以此类推。
•<年>:年,取值范围 1970 - 2099。
代码示例下面是使用CronTriggerFactoryBean创建定时器的示例代码:<bean id="cronTrigger" class="org.springframework.s cheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="jobDetail"/><property name="cronExpression" value="0 0 12 * * ?" /></bean><bean id="jobDetail" class="org.springframework.scheduli ng.quartz.JobDetailFactoryBean"><property name="jobClass" value="com.example.MyJob"/></bean><bean id="scheduler" class="org.springframework.scheduli ng.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger"/></list></property></bean>上述代码中,我们使用了3个Bean:•JobDetailFactoryBean:用于创建JobDetail实例,用于指定需要执行的任务。
timelimiterconfig timeoutduration方法
timelimiterconfig timeoutduration方法在许多现代应用程序中,时间限制是实现复杂逻辑和性能优化的重要手段。
在这个背景下,Spring框架中的TimelimiterConfig类提供了一种机制,允许我们在一定时间内对特定资源或任务进行限制。
其中,timeoutDuration方法是TimelimiterConfig类中的一个重要方法,用于设置超时时间。
一、背景介绍时间限制是一种常见的资源管理技术,它可以帮助我们避免长时间运行的任务或操作耗尽系统资源。
在许多情况下,我们需要对特定任务或操作设置一个时间限制,以确保它们在一定时间内完成,避免对系统性能产生负面影响。
Spring框架提供了一种方便的机制来实现时间限制,即TimelimiterConfig类。
该类提供了一种配置超时时间的机制,使得我们可以轻松地定义任务的执行时间和超时时间。
这对于在系统资源有限的情况下管理长时间运行的任务或操作非常有用。
二、timeoutDuration方法详解timeoutDuration方法是TimelimiterConfig类中的一个核心方法,用于设置超时时间。
该方法接受一个参数,即超时时间(以秒为单位)。
通过设置合适的超时时间,我们可以确保任务在一定时间内完成,否则将会触发相应的超时处理逻辑。
使用timeoutDuration方法,我们可以轻松地为特定的任务或操作设置超时时间。
例如,我们可以将超时时间设置为5秒,以确保任务在5秒内完成。
如果任务未能在规定时间内完成,系统将会触发相应的处理逻辑,如中断任务执行、抛出异常等。
三、配置示例下面是一个简单的示例,展示了如何使用timeoutDuration方法配置TimelimiterConfig类:```javaimport org.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.config.TimelimiterConfig;importorg.springframework.scheduling.config.ScheduledTask;import org.springframework.scheduling.support.CronTrigger;importorg.springframework.scheduling.support.CronTriggerFactoryBean;@Configurationpublic class TimelimiterConfigExample {@Beanpublic TimelimiterConfig timeoutConfig() {TimelimiterConfig config = newTimelimiterConfig();config.setTimeoutDuration(5, TimeUnit.SECONDS);// 设置超时时间为5秒return config;}@ScheduledTask(executesOn = "mySchedulerGroup") // 指定调度组名public void myTask() {// 执行任务的代码...}}```在上面的示例中,我们创建了一个名为timeoutConfig的配置类,其中使用了timeoutDuration方法设置了超时时间为5秒。
Spring定时器的时间表达式
Spring定时器的时间表达式定时器的时间表达式:1. 字段允许值允许的特殊字符秒 0-59 , - * /分 0-59 , - * /⼩时 0-23 , - * /⽇期 1-31 , - * ? / L W C⽉份 1-12 或者 JAN-DEC , - * /星期 1-7 或者 SUN-SAT , - * ? / L C #年(可选)留空, 1970-2099 , - * /表达式意义"0 0 12 * * ?" 每天中午12点触发"0 15 10 ? * *" 每天上午10:15触发"0 15 10 * * ?" 每天上午10:15触发"0 15 10 * * ? *" 每天上午10:15触发"0 15 10 * * ? 2005" 2005年的每天上午10:15触发"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发"0 10,44 14 ? 3 WED" 每年三⽉的星期三的下午2:10和2:44触发"0 15 10 ? * MON-FRI" 周⼀⾄周五的上午10:15触发"0 15 10 15 * ?" 每⽉15⽇上午10:15触发"0 15 10 L * ?" 每⽉最后⼀⽇的上午10:15触发"0 15 10 ? * 6L" 每⽉的最后⼀个星期五上午10:15触发"0 15 10 ? * 6L 2002-2005" 2002年⾄2005年的每⽉的最后⼀个星期五上午10:15触发"0 15 10 ? * 6#3" 每⽉的第三个星期五上午10:15触发每天早上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 *有些⼦表达式能包含⼀些范围或列表例如:⼦表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT” “*”:字符代表所有可能的值因此,“*”在⼦表达式(⽉)⾥表⽰每个⽉的含义,“*”在⼦表达式(天(星期))表⽰星期的每⼀天“/”:字符⽤来指定数值的增量例如:在⼦表达式(分钟)⾥的“0/15”表⽰从第0分钟开始,每15分钟 ;在⼦表达式(分钟)⾥的“3/20”表⽰从第3分钟开始,每20分钟(它和“3,23,43”)的含义⼀样“?”:字符仅被⽤于天(⽉)和天(星期)两个⼦表达式,表⽰不指定值当2个⼦表达式其中之⼀被指定了值以后,为了避免冲突,需要将另⼀个⼦表达式的值设为“?” “L”:字符仅被⽤于天(⽉)和天(星期)两个⼦表达式,它是单词“last”的缩写但是它在两个⼦表达式⾥的含义是不同的。
使用spring的@Scheduled注解执行定时任务,启动项目不输出警告
使⽤spring的@Scheduled注解执⾏定时任务,启动项⽬不输出警告在applicationContext.xml中添加:xmlns:task="/schema/task"xsi:schemaLocation="/schema/task/schema/task/spring-task-4.0.xsd"><task:annotation-driven executor="myExecutor" scheduler="myScheduler"/><task:executor id="myExecutor" pool-size="5"/><task:scheduler id="myScheduler" pool-size="10"/>java代码:@Componentpublic class CleanExpireTokenTask {private Logger logger = LoggerFactory.getLogger(LogTag.BUSINESS);@Scheduled(cron = "0 * * * * ?")public void startUpdateSaleThread(){try{System.out.println("check token expire");}catch(Exception e){logger.error("Make salesReport faild",e);}}}注意:实现类上要加注解@Component定时器的任务⽅法不能有返回值配置及启动报错问题参考⾃2016-11-22⽇安全关闭spring定时任务线程池java代码@Resource(name = "myScheduler")private ThreadPoolTaskScheduler threadPoolTaskScheduler;/*** 等待正在执⾏的定时任务执⾏完毕,不再执⾏新的定时任务,*/public void shutdown(){ threadPoolTaskScheduler.shutdown(); // 等待任务执⾏完毕 while(threadPoolTaskScheduler.getActiveCount() > 0){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }}注:1.根据测试,通过此⽅式创建的定时任务,⽐如每分钟0秒执⾏任务,如果上⼀分钟0秒执⾏的任务还没执⾏完,则这次任务就不会启动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.Jar包准备quartz-all-1.6.0.jar二.配置文件spring-timer.xml配置属性如下<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd"><!-- 配置作业类 --><beanid="test"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactory Bean"><propertyname="targetObject"><!--配置作业类包路径--><beanclass="com.topsoft.topfets.service.TestDemoService"></bean></property> <!--配置定时执行方法--><propertyname="targetMethod"value="generateRandom"></property><propertyname="concurrent"value="false"/><!-- 作业不并发调度reevaluationCompute --></bean><beanid="test1"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactory Bean"><propertyname="targetObject"><beanclass="com.topsoft.topfets.service.TestDemoService"></bean></property> <propertyname="targetMethod"value="sendData"></property><propertyname="concurrent"value="false"/><!-- 作业不并发调度reevaluationCompute --></bean><!-- 配置作业调度触发器可以根据需要配置--><!--配置为每天12点执行--><beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTrigg erBean"><propertyname="jobDetail"ref="test"/><!-- 每天12:00运行一次 --><propertyname="cronExpression"value="0 0 12 * * ?"/></bean><!--每10s执行一次--><beanid="simpleTrigger"class="org.springframework.scheduling.quartz.SimpleT riggerBean"><propertyname="jobDetail"ref="test1"/><propertyname="startDelay"value="0"/><!-- 调度工厂实例化后,经过0秒开始执行调度 --><propertyname="repeatInterval"value="10000"/><!-- 每10秒调度一次 --></bean><!-- 配置调度工厂--><beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <propertyname="triggers"><list><!-- 根据需要配置调度工程每天定时执行就用cronTrigger,每隔一定时间用simpleTrigger --><ref bean="cronTrigger" /><refbean="simpleTrigger"/></list></property></bean></beans>三.cronExpression时间配置说明CronTrigger配置完整格式为: [秒] [分] [小时] [日] [月] [周] [年]序号说明是否必填允许填写的值允许的通配符1 秒是 0-59, - * /2 分是 0-59, - * /3 小时是 0-23, - * /4 日是 1-31, - * ? / L W5 月是 1-12 or JAN-DEC , - * /6 周是 1-7 or SUN-SAT , - * ? / L #7 年否 empty 或 1970-2099 , - * /通配符说明:*表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? 表示不指定值。
使用的场景为不需要关心当前设置这个字段的值。
例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 00010 * ?- 表示区间,例如在小时上设置 "10-12",表示 10,11,12点都会触发。
, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发/用于递增触发。
如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。
在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。
L 表示最后的意思。
在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。
如果在"L"前加上数字,则表示该数据的最后一个。
例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五" W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。
如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。
如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。
如果1号正是周六,则将在3号下周一触发。
(注,"W"前只能设置具体的数字,不允许区间"-").# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了) ;小提示:'L'和 'W'可以一组合使用。
如果在日字段上设置"LW",则表示在本月的最后一个工作日触发;周字段的设置,若使用英文字母是不区分大小写的,即MON与mon相同;常用示例:0012 * * ? 每天12点触发01510 ? * * 每天10点15分触发01510 * * ? 每天10点15分触发01510 * * ? * 每天10点15分触发01510 * * ? 2005 2005年每天10点15分触发0 * 14 * * ? 每天下午的 2点到2点59分每分触发00/514 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)00/514,18 * * ? 每天下午的 2点到2点59分、18点到18点59分(整点开始,每隔5分触发)00-514 * * ? 每天下午的 2点到2点05分每分触发010,4414 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发01510 ? * MON-FRI 从周一到周五每天上午的10点15分触发0151015 * ? 每月15号上午10点15分触发01510 L * ? 每月最后一天的10点15分触发01510 ? * 6L 每月最后一周的星期五的10点15分触发01510 ? * 6L2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发01510 ? * 6#3 每月的第三周的星期五开始触发00121/5 * ? 每月的第一个中午开始每隔5天触发一次011111111 ? 每年的11月11号 11点11分触发四.在spring的根配置文件中导入spring-timer.xml<import resource="spring-timer.xml" />。