spring定时任务

spring定时任务
spring定时任务

Chapter 23. Spring中的定时调度(Scheduling)和线程池(Thread Pooling)

23.1. 简介

Spring包含了对定时调度服务的内置支持类。当前,Spring支持从JDK1.3开始内置的Timer类和Quartz

Scheduler(https://www.360docs.net/doc/903892206.html,/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的基本概念,请参阅https://www.360docs.net/doc/903892206.html,/quartz。为了让基于Spring的应用程序方便使用,Spring提供了一些类来简化uartz的用法。

23.2.1. 使用JobDetailBean

JobDetail对象保存运行一个任务所需的全部信息。Spring提供一个叫作JobDetailBean的类让JobDetail能对一些有意义的初始值进行初始化。让我们来看个例子:

class="org.springframework.scheduling.quartz.JobDetailBean">

Job detail bean拥有所有运行job(ExampleJob)的必要信息。通过job的data map来制定timeout。Job的data map可以通过JobExecutionContext(在运行时刻传递给你)来得到,但是JobDetailBean同时把从job的data map中得到的属性映射到实际job中的属性中去。所以,如果ExampleJob中包含一个名为timeout的属性,JobDetailBean将自动为它赋值:

package example;

public class ExampleJob extends QuartzJobBean {

private int timeout;

/**

* Setter called after the ExampleJob is instantiated

* with the value from the JobDetailBean (5)

*/

public void setTimeout(int timeout) {

this.timeout = timeout;

}

protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {

// do the actual work

}

}

当然,你同样可以对Job detail bean中所有其他的额外配置进行设置。

注意:使用name和group属性,你可以分别修改job在哪一个组下运行和使用什么名称。默认情况下,job的名称等于job detail bean的名称(在上面的例子中为exampleJob)。

23.2.2. 使用MethodInvokingJobDetailFactoryBean

通常情况下,你只需要调用特定对象上的一个方法即可实现任务调度。你可以使用MethodInvokingJobDetailFactoryBean准确的做到这一点:

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailF actoryBean">

上面例子将调用exampleBusinessObject中的doIt方法(如下):

public class ExampleBusinessObject {

// properties and collaborators

public void doIt() {

// do the actual work

}

}

class="examples.ExampleBusinessObject"/>

使用MethodInvokingJobDetailFactoryBean你不需要创建只有一行代码且只调用一个方法的job, 你只需要创建真实的业务对象来包装具体的细节的对象。

默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail指定两个Trigger, 很可能当第一个job完成之前,第二个job就开始了。如果JobDetail对象实现了Stateful接口,就不会发生这样的事情。第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean中的concurrent标记为false。

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailF actoryBean">

Note

注意:默认情况下,jobs在并行的方式下运行。

23.2.3. 使用triggers和SchedulerFactoryBean来包装任务

我们已经创建了job details,jobs。我们同时回顾了允许你调用特定对象上某一个方法的便捷的bean。当然我们仍需要调度这些jobs。这需要使用triggers 和SchedulerFactoryBean来完成。 Quartz自带一些可供使用的triggers。Spring提供两个子类triggers,分别为CronTriggerBean和SimpleTriggerBean。

Triggers也需要被调度。Spring提供SchedulerFactoryBean来暴露一些属性来设置triggers。SchedulerFactoryBean负责调度那些实际的triggers。

几个例子:

class="org.springframework.scheduling.quartz.SimpleTriggerBean">

class="org.springframework.scheduling.quartz.CronTriggerBean">

现在我们创建了两个triggers,其中一个开始延迟10秒以后每50秒运行一次,另一个每天早上6点钟运行。我们需要创建一个SchedulerFactoryBean来最终实现上述的一切:

class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

更多的属性你可以通过SchedulerFactoryBean来设置,例如job details使用的Calendars, 用来订制Quartz的一些属性以及其它相关信息。你可以查阅相应的

JavaDOC(https://www.360docs.net/doc/903892206.html,/docs/api/org/springframework/s cheduling/quartz/SchedulerFactoryBean.html)来了解进一步的信息。

23.3. 使用JDK Timer支持类

另外一个调度任务的途径是使用JDK Timer对象。更多的关于Timer的信息可以在这里

https://www.360docs.net/doc/903892206.html,/docs/books/tutorial/essential/threads/timer.html 找到。上面讨论的概念仍可以应用于Timer的支持。你可以创建定制的timer 或者调用某些方法的timer。包装timers的工作由TimerFactoryBean完成。

23.3.1. 创建定制的timers

你可以使用TimerTask创建定制的timer tasks,类似于Quartz中的jobs: public class CheckEmailAddresses extends TimerTask {

private List emailAddresses;

public void setEmailAddresses(List emailAddresses) {

this.emailAddresses = emailAddresses;

}

public void run() {

// iterate over all email addresses and archive them

}

}

包装它很简单:

test@https://www.360docs.net/doc/903892206.html,

foo@https://www.360docs.net/doc/903892206.html,

john@https://www.360docs.net/doc/903892206.html,

class="org.springframework.scheduling.timer.ScheduledTimerTask">

注意若要让任务只运行一次,你可以把period属性设置为0(或者负值)。23.3.2. 使用MethodInvokingTimerTaskFactoryBean类

和对Quartz的支持类似,对Timer的支持也包含一个组件,可以让你周期性的调用某个方法:

class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFa ctoryBean">

以上的例子会调用exampleBusinessObject对象的doIt方法。(见下):

public class BusinessObject {

// properties and collaborators

public void doIt() {

// do the actual work

}

}

将上例中ScheduledTimerTask的timerTask引用修改为doIt,bean将会用一个固定的周期来调用doIt方法。

23.3.3. 打包:使用TimerFactoryBean来设置任务

TimerFactoryBean类和Quartz的SchedulerFactoryBean类有些类似,它们是为同样的目的而设计的:设置确切的任务计划。TimerFactoryBean对一个Timer 进行配置,设置其引用的任务的周期。你可以指定是否使用背景线程。

class="org.springframework.scheduling.timer.TimerFactoryBean">

23.4. Spring TaskExecutor抽象

Spring 2.0 为执行器(Executor)处理引入了一个新的抽象层。Executor是Java 5的名词,用来表示线程池的概念。之所以用这个奇怪的名词,是因为实际上不能保证底层实现的确是一个池。实际上,很多情况下,executor只是单线程。

Spring的抽象层帮助你把线程池引入到Java 1.3和1.4环境中,同时隐藏了 1.3, 1.4, 5, 和 Java EE环境中线程池实现的差异。

23.4.1. TaskExecutor接口

Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口。实际上,它存在主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象掉。这个接口只有一个方法execute(Runnable task),它根据线程池的语义和配置,来接受一个执行任务。

23.4.2. 何时使用TaskExecutor接口

TaskExecutor接口开始的时候,是为了其他Spring组件使用线程池的抽象需要创建的。例如ApplicationEventMulticaster组件、JMS的AbstractMessageListenerContainer和对Quartz的整合都使用了TaskExecutor 接口来抽象线程池。当然,如果你的bean需要线程池行为,你也可以使用这个抽象层。

23.4.3. TaskExecutor类型

在Spring发行包中预定义了一些TaskExecutor实现。有了它们,你甚至不需要再自行实现了。

?SimpleAsyncTaskExecutor类

这个实现不重用任何线程,或者说它每次调用都启动一个新线程。但是,

它还是支持对并发总数设限,当超过线程并发总数限制时,阻塞新的调用,直到有位置被释放。如果你需要真正的池,请继续往下看。

?SyncTaskExecutor类

这个实现不会异步执行。相反,每次调用都在发起调用的线程中执行。它

的主要用处是在不需要多线程的时候,比如简单的test case。

?ConcurrentTaskExecutor类

这个实现是对Java 5 java.util.concurrent.Executor类的包装。有另

一个备选, ThreadPoolTaskExecutor类,它暴露了Executor的配置参数

作为bean属性。很少需要使用ConcurrentTaskExecutor, 但是如果

ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一

个备选。

?SimpleThreadPoolTaskExecutor类

这个实现实际上是Quartz的SimpleThreadPool类的子类,它会监听

Spring的生命周期回调。当你有线程池,需要在Quartz和非Quartz组

件中共用时,这是它的典型用处。

?ThreadPoolTaskExecutor类

它不支持任何对java.util.concurrent包的替换或者下行移植。Doug Lea 和Dawid Kurzyniec对java.util.concurrent的实现都采用了不同的包

结构,导致它们无法正确运行。

这个实现只能在Java 5环境中使用,但是却是这个环境中最常用的。它

暴露的bean properties可以用来配置一个

java.util.concurrent.ThreadPoolExecutor,把它包装到一个

TaskExecutor中。如果你需要更加先进的类,比如

ScheduledThreadPoolExecutor,我们建议你使用

ConcurrentTaskExecutor来替代。

?TimerTaskExecutor类

这个实现使用一个TimerTask作为其背后的实现。它和SyncTaskExecutor 的不同在于,方法调用是在一个独立的线程中进行的,虽然在那个线程中

是同步的。

?WorkManagerTaskExecutor类

CommonJ 是BEA和IBM联合开发的一套规范。这些规范并非Java EE的标准,但它是BEA和IBM的应用服务器实现的共同标准

这个实现使用了CommonJ WorkManager作为其底层实现,是在Spring

context中配置CommonJ WorkManager应用的最重要的类。和

SimpleThreadPoolTaskExecutor类似,这个类实现了WorkManager接口,因此可以直接作为WorkManager使用。

23.4.4. 使用TaskExecutor接口

Spring的TaskExecutor实现作为一个简单的JavaBeans使用。在下面的示例中,我们定义一个bean,使用ThreadPoolTaskExecutor来异步打印出一系列字符串。

import org.springframework.core.task.TaskExecutor;

public class TaskExecutorExample {

private class MessagePrinterTask implements Runnable {

private String message;

public MessagePrinterTask(String message) {

this.message = message;

}

public void run() {

System.out.println(message);

}

}

private TaskExecutor taskExecutor;

public TaskExecutorExample(TaskExecutor taskExecutor) {

this.taskExecutor = taskExecutor;

}

public void printMessages() {

for(int i = 0; i < 25; i++) {

taskExecutor.execute(new MessagePrinterTask("Message" + i)); }

}

}

可以看到,无需你自己从池中获取一个线程来执行,你把自己的Runnable类加入到队列中去,TaskExecutor使用它自己的内置规则来决定何时应该执行任务。

为了配置TaskExecutor使用的规则,暴露了简单的bean properties。

class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecut or">

2008-11-14

spring设置动态定时任务

关键字: spring设置动态定时任务

Quartz 在 Spring 中动态设置 cronExpression

什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定)。

这样总不能修改配置文件每定制个定时任务就增加一个trigger 吧,即便允许客户修改配置文件,但总需要重新启动web 服务啊,研究了下Quartz 在Spring 中的动态定时,发现

class="org.springframework.scheduling.quartz.CronTriggerBean" >

0/10 * * * * ?

中cronExpression是关键,如果可以动态设置cronExpression 的值,也就说如果我们可以直接调用CronTriggerBean 中设置cronExpression 的方法,就可以顺利解决问题了。

熟悉1 的朋友可以跳过不看,下面2 、3 是动态定时任务的具体实现。

1 . Quartz 在Spring 中的简单配置

Spring 配置文件:

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailF actoryBean">

class="org.springframework.scheduling.quartz.CronTriggerBean" >

0/10 * * * * ?

class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

在上面的配置中设定了

① targetMethod: 指定需要定时执行scheduleInfoAction 中的simpleJobTest() 方法

② concurrent :对于相同的JobDetail ,当指定多个Trigger 时, 很可能第一个job 完成之前,第二个job 就开始了。指定concurrent 设为false ,多个job 不会并发运行,第二个job 将不会在第一个job 完成之前开始。

③ cronExpression:0/10 * * * * ? 表示每10 秒执行一次,具体可参考附表。

④ triggers :通过再添加其他的ref 元素可在list 中放置多个触发器。

scheduleInfoAction 中的simpleJobTest() 方法

注意:此方法没有参数,如果scheduleInfoAction 有两个方法simpleJobTest() 和simpleJobTest(String argument) ,则spring 只会去执行无参的simpleJobTest ().

public void simpleJobTest() {

log.warn("uh oh, Job is scheduled !'" + "' Success...");

}

2 .Quartz 在Spring 中动态设置cronTrigger 方法一

Spring 配置文件:

class="com.lively.happyoa.jobs.webapp.action.ScheduleInfoAction">

ref="scheduleInfoManager"/>

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailF actoryBean">

class="org.springframework.scheduling.quartz.CronTriggerBean" >

0/10 * * * * ?

class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

scheduleInfoAction 中的reScheduleJob() 方法及相关方法

① reScheduleJob读取数据库,获得自定义定时器调度时间():

private void reScheduleJob() throws SchedulerException, ParseException {

// 运行时可通过动态注入的scheduler 得到trigger

CronTriggerBean trigger = (CronTriggerBean)

scheduler.getTrigger(

"cronTrigger", Scheduler.DEFAULT_GROUP);

String dbCronExpression = getCronExpressionFromDB ();

String originConExpression = trigger.getCronExpression();

// 判断从DB 中取得的任务时间(dbCronExpression) 和现在的quartz

线程中的任务时间(originConExpression) 是否相等

// 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob

if(!originConExpression.equalsIgnoreCase(dbCronExpression)){

trigger.setCronExpression(dbCronExpression);

scheduler.rescheduleJob("cronTrigger",

Scheduler.DEFAULT_GROUP, trigger);

}

// 下面是具体的job 内容,可自行设置

// executeJobDetail();

}

② getCronExpressionFromDB() :从数据库中获得dbCronExpression 的具体代码,由于使用了scheduleInfoManager ,所以要在定义相应的setter 方法

private String getCronExpressionFromDB (){

String sql="from ScheduleInfo scheduleInfo where 1=1 ";

sql=sql+" and https://www.360docs.net/doc/903892206.html,Id = '"+"1" + "'";

List scheduleList =

scheduleInfoManager.queryScheduleInListBySql(sql);

ScheduleInfo scheduleInfo =

(ScheduleInfo)scheduleList.get(0);

String dbCronExpression = scheduleInfo.getCronExpression();

return dbCronExpression;

}

③ 在spring 配置文件的scheduleInfoAction 配置了相应的property (scheduler/scheduleInfoManager), 要为其设置setter 方法

private Scheduler scheduler;

// 设值注入,通过setter 方法传入被调用者的实例scheduler

public void setScheduler(Scheduler scheduler) {

this.scheduler = scheduler;

}

private ScheduleInfoManager scheduleInfoManager;

// 设值注入,通过setter 方法传入被调用者的实例

scheduleInfoManager

public void setScheduleInfoManager(ScheduleInfoManager

scheduleInfoManager){

this.scheduleInfoManager = scheduleInfoManager;

}

3 . Quartz 在Spring 中动态设置cronTrigger 方法二

在上面的2中我们可以看到,尽管已经可以动态进行rescheduleJob了,不过依然需要我们设置一个cronExpression,如果尝试一下拿掉spring 配置中的

0/10 * * * * ?

则容器(如tomcat )启动时会报错。

实际中我们希望tomcat 启动时就可以直接去读数据库,拿到相应的

dbCronExpression ,然后定时执行一个job ,而不希望配置初始的

cronExpression ,观察下面的CronTriggerBean ,考虑到cronExpression需要初始化,如果设定一个类InitializingCronTrigger继承CronTriggerBean ,然后在这个类中做一些读取DB 的初始化工作(设置cronExpression),问题就可以解决了。

Spring 配置文件:

class="com.lively.happyoa.jobs.webapp.action.ScheduleInfoAction">

ref="scheduleInfoManager"/>

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailF actoryBean">

class="com.lively.happyoa.jobs.webapp.action.ScheduleInfoAction.Initi alizingCronTrigger">

ref="scheduleInfoManager"/>

class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

InitializingCronTrigger 中的相关方法

注意:在注入scheduleInfoManager 属性的时候,我们可以去读取DB 任务时间(之所以放在setter 方法中,是因为需要在设置scheduleInfoManager 后进行getCronExpressionFromDB () ,否则,也可以①②逻辑把放在类的构造函数中).

注意InitializingCronTrigger必须extends CronTriggerBean.

public class InitializingCronTrigger extends CronTriggerBean implements Serializable {

private ScheduleInfoManager scheduleInfoManager;

// 设值注入,通过setter 方法传入被调用者的实例scheduleInfoManager

public void setScheduleInfoManager(ScheduleInfoManager scheduleInfoManager){

this.scheduleInfoManager = scheduleInfoManager;

// 因为在getCronExpressionFromDB 使用到了scheduleInfoManager ,所以

// 必须上一行代码设置scheduleInfoManager 后进行getCronExpressionFromDB

String cronExpression = getCronExpressionFromDB (); // ①

// 因为extends CronTriggerBean ,此处调用父类方法初始化cronExpression

setCronExpression(cronExpression); // ②

}

private String getCronExpressionFromDB (){

String sql="from ScheduleInfo scheduleInfo where 1=1 ";

sql=sql+" and https://www.360docs.net/doc/903892206.html,Id = '"+"1" + "'";

List scheduleList =

scheduleInfoManager.queryScheduleInListBySql(sql);

ScheduleInfo scheduleInfo =

(ScheduleInfo)scheduleList.get(0);

String dbCronExpression = scheduleInfo.getCronExpression();

return dbCronExpression;

}

……

}

附表:

"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 触发

至于每个符号看看例子就好了. 很简单了.

SpringBoot企业级开发教程教学大纲

《Spring Boot企业级开发教程》课程教学大纲 (课程英文名称) 课程编号: XXXX 学分:5学分 学时:60学时(其中:讲课学时:38 上机学时:22) 先修课程:Java基础案例教程、Java Web程序设计任务教程、 Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)适用专业:信息及其计算机相关专业 开课部门:计算机系 一、课程的性质与目标 《Spring Boot企业级开发教程》是面向计算机相关专业开设的一门专业的Java 应用开发课程,主要讲解了当前主流的Spring Boot框架以及与第三方技术整合开发实战内容。通过本课程的学习,学生能够理解并掌握Spring Boot 框架的基础知识,同时能够掌握Spring Boot与常用第三方技术的整合实现实际开发中的业务需求,包括实现Web开发、数据访问、缓存管理、安全管理、消息服务、任务管理等。 二、课程的主要内容及基本要求 第1章 Spring Boot开发入门(4学时) [知识点] ?Spring Boot概述 ?环境准备 ?使用Maven方式构建Spring Boot项目 ?使用Spring Initializr方式构建Spring Boot项目 ?单元测试 ?热部署 ?Spring Boot依赖管理

?Spring Boot自动配置 ?Spring Boot执行流程 [重点] ?使用Maven方式构建Spring Boot项目 ?使用Spring Initializr方式构建Spring Boot项目 ?单元测试 ?Spring Boot依赖管理 ?Spring Boot自动配置 ?Spring Boot执行流程 [难点] ?Spring Boot自动配置 ?Spring Boot执行流程 [基本要求] ?了解Spring Boot的发展和优点 ?掌握Spring Boot项目的构建 ?掌握Spring Boot的单元测试和热部署 ?熟悉Spring Boot的自动化配置原理 ?熟悉Spring Boot的执行流程 [实践与练习] 建议完成相关测试题,并安排上机,重点考核如何编写Spring Boot入门程序,并参考教材进行Spring Boot源码分析。 第2章 Spring Boot核心配置与注解(6学时) [知识点] ?application.properties配置文件 ?application.yaml配置文件 ?使用注解@ConfigurationProperties和@Value注入属性 ?两种注解对比分析 ?使用@PropertySource加载配置文件 ?使用@ImportResource加载XML配置文件 ?使用@Configuration编写自定义配置类 ?使用Profile文件进行多环境配置 ?使用@Profile注解进行多环境配置 ?随机值设置以及参数间引用 [重点] ?application.properties配置文件

Spring提供的三种定时任务机制及其比较

Spring提供的三种定时任务机制及其比较 定时任务的需求在众多应用系统中广泛存在,在Spring中,我们可以使用三种不同的定时机制,下面一一描述并加以比较 1. 基于Quartz的定时机制

下面详细解释这个类图中涉及的关键类及其使用场景 1.1. SchedulerFactoryBean 这是Spring中基于Quartz的定时机制入口,只要Spring容器装载了这个类,Quartz定时机制就会启动,并加载定义在这个类中的所有trigger Spring配置范例: [xhtml]view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 1.2. CronTriggerBean 实现了Trigger接口,基于Cron表达式的触发器 这种触发器的好处是表达式与linux下的crontab一致,能够满足非常复杂的定时需求,也容易配置

Spring配置范例: [xhtml]view plaincopy 1. 2. 3. 4. 1.3. SimpleTriggerBean 该类也实现了Trigger接口,基于配置的定时调度 这个触发器的优点在于很容易配置一个简单的定时调度策略 Spring配置范例: [xhtml]view plaincopy 1. 2. 3. 4. 5. 6.3600000 7. 8. 9.86400000 10. 11.

Spring定时器的使用

定时执行任务,这是项目中常用的东西,今天我们来做一个使用Spring定时器进行任务定制的小例子,仅供学习! 1首先要增加相应的JAR。 因为这是一个小例子,使用的JAR包不是很多,用到了spring.jar, quartz-all-1.6.5.jar,quartz-1.5.2.jar,commons-logging.jar, log4j-1.2.14.jar!不用关心版本,从你下载到的Spring中找即可。 定义web.xml配置文件 要在配置文件中定义Spring和Log4j的使用。具体看工程即可。重点关注的是如果你做例子时使用了web-app_2_5.xsd,那么在部分服务器上是跑不起 来的。 Xml代码 1 1 1 1 1 1index.jsp 1 1

1 1 1contextConfigLocation 1/WEB-INF/spring.xml 1 1 1 1log4jConfigLocation 1/WEB-INF/classes/log4j.properties 1 1 1 1 1 1org.springframework.web.util.Log4jConfigListener 1 1 1 1 1 1org.springframework.web.context.ContextLoaderListener 1

SpringBoot实现定时任务

SpringBoot 定时任务@Scheduled实现定时任务 在启动项中加入@EnableScheduling 在定时任务中加入@Component交于Spring管理 使用@Scheduled(fixedDelay = 5000) 5秒跑一次任务 支持支持cron表达式

按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数) 月(0~11) 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 7.年份(1970-2099) 其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午12点 "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触发 有些子表达式能包含一些范围或列表 例如:子表达式(天(星期))可以为“MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT” “*”字符代表所有可能的值 因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天 “/”字符用来指定数值的增量 例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样

【SpringBoot】廿五、SpringBoot中使用Quartz管理定时任务

【SpringBoot】廿五、SpringBoot中使用Quartz管理定 时任务 2020-07-21 15:55:47 定时任务在系统中用到的地方很多,例如每晚凌晨的数据备份,每小时获取第三方平台的Token 信息等等,之前我们都是在项目中规定这个定时任务什么时候启动,到时间了便会自己启动,那么我们想要停止这个定时任务的时候,就需要去改动代码,还得启停服务器,这是非常不友好的事情 直至遇见 Quartz,利用图形界面可视化管理定时任务,使得我们对定时任务的管 理更加方便,快捷 一、Quartz 简介 Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和 J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个 作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。 二、开发前戏 1、引入 maven 依赖 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-quartz 这里引入了 web 的依赖,以及 Quartz 的依赖,其余依赖请根据需求自行引入

Quartz+spring定时器实例用

Spring+Quartz定时器例子如下: 1. javabean类 在Test.QuartzJob中 1.package Test; 2. 3.public class QuartzJob { 4.public void work() 5. { 6. System.out.println("Quartz的任务调度!!!"); 7. } 8. } 1. 2. 7. 8. 9. 10. 11. 13. 14. 15. 16. 17. 18. 19.work 20. 21. 22. 23. 25. 26.

Spring定时任务配置

Spring框架中的定时器如何使用和配置 1.包 ?spring-2.0.6.jar Spring框架的核心包 ?jta.jar 会用到包中的usertransaction,具体什么用此处暂时不论 ?quartz-1.6.0.jar 会用到CronTrigger这个类,通过表达式实现精确的定时?commons-logging-1.1.1.jar 日志管理包 ?commons-collections-3.2.1.jar 集合工具包 2.首先是配置你要定时加载的目标类 第一种方法:xml方式,例如: 第二种方法:基于注解的方式。例如:@Service(smsSendService) 注:此注解用于Service层 3.配置你的定时器详情 解释: p:targetObject-ref:指向你要定时加载的目标类。 p:targetMethod:指向定时加载目标类中需要执行的方法。即定时执行smsSendService类的autoSmsTime()方法。 p:concurrent="false":表示不并发操作。对于相同的JobDetail,当指定多个Trigger时, 很可能第一个job完成之前,第二个job 就开始了。指定concurrent设为false,多个job不会并发运行,第二个job将不会在第一个job完成之前开始。 注意:smsSendService类的autoSmsTime()方法没有参数,如果smsSendService有两个方法autoSmsTime()和autoSmsTime(String argument),则spring只会去执行无参的autoSmsTime().例如: 1 2 3 public void autoSmsTime(){ System.out.println("无参......"); } 4.配置定时器时间间隔

Spring集成Quartz定时任务框架介绍和Cron表达式详解

在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等。 我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量的代码。 使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。 一、增加所依赖的JAR包 1、增加Spring的Maven依赖 org.springframework spring-webmvc 3.0.5.RELEASE 2、增加Quartz的Maven依赖 org.quartz-scheduler quartz 1.8.4 二、增加定时业务逻辑类 publicclass ExpireJobTask { /** Logger */ privatestaticfinal Logger logger = LoggerFactory.getLogger(ExpireJobTask.class); /** * 业务逻辑处理 */ publicvoid doBiz() { // 执行业务逻辑 // ........

Quartz任务调度说明 CronTrigger + Spring

触发器中两个重要的触发器 1,SimpleTrigger :可以精确到毫秒,如果需要让任务只在某个时刻执行一次,或者,在某个时刻开始,然后按照某个时间间隔重复执行 例如: public SimpleTrigger(String name, //名称 String group, //组名 Date startTime, //开始时间 Date endTime, //结束时间(控制权高于重复次数属性)为null 时直到永远 int repeatCount, //重复次数(可能是0) long repeatInterval) //重复间隔(以毫秒为单位) 2,CronTrigger :像日历那样按日程来触发任务。可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。 也可以像SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续. Cron表达式被用来配置CronTrigger实例.Cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:秒分钟小时月中的天天周中的天年 秒---例如:3/5从第3秒开始每隔5秒触发一次 通配符('*')可以被用来表示域中“每个”可能的值 '?'字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。 'L'字符可以在day-of-month及day-of-week中使用,L是last的缩写。如时在day-of-month 中L表示的月的最后一天。在day-of-week中,表示"当月的最后的周XXX",例如:"6L" 或者"FRIL"都表示本月的最后一个周五。 '#'表示表示月中的第几个周几。例如:day-of-week 域中的"6#3" 或者"FRI#3" 表示“月中第三个周五”。 注意:对于单独触发器来说,有些日程需求可能过于复杂而不能用表达式表述,例如:9:00到10:00之间每隔5分钟触发一次,下午1:00到10点每隔20分钟触发一次。 这个解决方案就是创建两个触发器,两个触发器都运行相同的任务。 CronTrigger 例1 –一个简单的每隔5分钟触发一次的表达式 "0 0/5 * * * ?" CronTrigger 例2 –在每分钟的10秒后每隔5分钟触发一次的表达式(例如. 10:00:10 am, 10:05:10等.)。 "10 0/5 * * * ?" CronTrigger 例3 –在每个周三和周五的10:30,11:30,12:30触发的表达式。 "0 30 10-13 ? * WED,FRI" CronTrigger 例4 –在每个月的5号,20号的8点和10点之间每隔半个小时触发一次且不包括10点,只是8:30,9:00和9:30的表达式。

springquartz实现定时任务的配置方法

Spring+Quartz实现定时任务的配置方法 第一步:.导入相关的jar包 (1)spring.jar (2)quartz-1.6.0.jar (3)相关包 commons-collections-3.2.jar ; commons-logging-1.1.1.jar; log4j-1.2.16.jar 第二步:创建一个类来定义工作 定义Quartz工作的第一步是创建一个类来定义工作。要做到这一点,你需要从Spring 的QuartzJobBean中派生子类。 第三步:配置JobDetail

值得注意的是,在这里你并没有直接声明一个TopTenTask Bean,而是声明了一个JobDetailBean。这是使用Quartz时的一个特点。 JobDetailBean是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。 使用Quartz的JobDetail中的另一个特别之处是TopTenTask的timeout属性是间接设置的。JobDetail的jobDataAsMap属性接受一个java.util.Map,其中包含了需要设置给jobClass的各种属性。 在这里,这个map包含了一个键值为timeout。当JobDetailBean实例化时,它会将5注入到EmailReportJob的timeout属性中。 第四步:配置Trigger 工作已经被定义好了,接下来你需要调度这个工作。 Quartz的org.quartz.Trigger类描述了何时及以怎样的频度运行一个Quartz工作。 Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。 SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。 例如,要调度报表工作每24小时运行一次,第一次在1小时之后开始运行,可以按照以下方式进行声明: 3600000 86400000 属性jobDetail装配了将要被调度的工作,在这个例子中是topTenTask Bean。属性repeatInterval告诉触发器以怎样的频度运行这个工作(以毫秒作为单位)。这里,我们

SpringMVC+Nutz框架介绍

SpringMVC+Nutz自主框架介绍 一、框架概况 基于经典技术组合(Spring MVC、Apache Shiro、Bootstrap UI)开发的企业级分布式基础开发平台,实现企业开发常用功能:组织机构、角色用户、权限授权、数据权限、内容管理、微信管理等。 使用的后台技术包括Spring、Spring MVC、Spring Cache、Nutz、Shiro、Jedis、Dubbo、RabbitMQ、Quartz、Elasticsearch、FastDFS、Ehcache、Beetl、Log4j等,前端技术包括Jquery、Bootstrap、Pjax等。 ?模块化可自由拆分(分布式可选择Dubbo/RSF实现) ?集成Shiro权限框架(支持二级缓存,通过Redis实现支持session同步) ?集成Ehcache缓存(Shiro一级缓存) ?集成Jedis(redis的java实现,支持Redis集群模式和单机模式切换) ?集成Email服务(可选择启用) ?集成Quartz定时任务(支持集群部署) ?集成Beetl模板引擎(功能强大便捷) ?支持语言国际化(直接写汉字不需要Unicode转换,一种语言一个文件夹) ?支持方法日志记录(@SLog注解自动记录日志) ?支持文件输出(@SFile注解自动输出文件,比如输出PDF格式) ?支持json输出(@SJson注解自动输出json字符串) ?支持自定义路由(显性转发或隐性转发)

?支持API Token及应用管理(Jwt实现token机制) ?后台管理界面采用Pjax+Bootstrap ?系统模块(单位、角色、用户、菜单等完整的权限体系) ?CMS模块(简易的内容管理功能) ?微信模块(支持多公众号、微信支付等功能) 二、与xx框架对比分析 1、Dao 1)使用NutDao,简化数据库增删改查操作,天然的过滤非法字符,防止sql注入; 2)兼容各类型数据库,只需对自定义SQL部分进行兼容性改造即可快速部署在MySQL、Oracle/达梦、MSSQL等各类数据库上;3)可通过实体类生成各类数据库的表结构、索引、序列或触发器等,支持动态分表,建立空白数据库启动项目时自动初始化表 结构和数据; 4)支持多数据源,并兼容hibernate、mybatis等其他第三方ORM 框架; 2、Service 1)Spring Cache方法缓存,对方法执行结果进行缓存,而非每条表数据,因为大部分业务是不需要用缓存的,比如后台的增删改 查管理;以前项目中经常出现因为缓存嵌套的问题加上缓存更

高级软件工程师第二套试题

一、单项选题(共60题,每题1分) (l)Struts 应用框架是 B 模式的实现。 A) JSP Modell B)MVC C)DAO D)Facade (2)相比Struts 框架,JSP 框架具备_ ___等Struts 框架所不具备的特 点。 A) 页面导航 B)表单验证 C )国际化应用 D)组件时间模型 (3)针对J2EE 企业应用来讲,最简单的 Wed 服务器系统有两个参与者, 服务的接 口和实现, 后者使用Web 服务。 (4)下面对 Web 应用开发中Servlet 组件说法错误的是 _C 。 A) Servlet 是按照接受请求/返回响应的模式工作的 C )在Struts 框架中,Servlet 充当模 型组 件 B) 运行于Servlet 容器中,是被动态加载的 D )在 Struts 框架中,Servlet 充当控制器组 件 ⑸下列关于Struts 框架的说法中,不正确的是 D_ 。 A) Struts 实质是JSPModel2的基础上实现的一个 MVC 框架 B) 在Struts 框架中,视图是 由一组JSP 文件组成 C) 在 Struts 框架中,控制器 是由ActiongServlet 和Action 来实现 D) 在Struts 仅仅可以在服务器端运行,仅仅能 通过ActionForm 中的validate()方法能对提 交的表单 数据进行验 证 ⑹下列选项中不能获 得Locale 实例的有_D __________ 标签的编码类型"method ”属性必须设 B) POST C)multipart/form-data D)true (8) Transaction 接口主要用于管理事务。它的哪个方法用于事务的提交 __C A) wasRollBack()方法 C)commit()方法 B) rollback 方法 D ) wasCommitted()方法 (9) Transaction 接口主要用于管理事务。 它的哪个方法用于事务的回滚 _B_ A) wasRollBack()方法 C)commit()方法 B) rollback 方法 D ) wasCommitted()方法 (10)在Hibernate 主配置文件(hibernate.cfg.xml)中,以下哪个元素为它的根 元素__A- A) vhinernate-configuration> 元 素 C ) 元素 B) 元素 D ) 元素 (11) (11)在Hibernate 主配置文件(hibernate.cfg.xml)中,以下哪个元素来配置 映射文件的 .1,前者提供 A) 服务提供者和服务请求者 B) 服务代理商和服务请求者 C) 服务提供者和服务代理商 D) 服务请求者和服务代理商 A) Locale locale=new Locale("ch","CH"); B) Locale locale=Locale.CHINA; C) Locale locale=request.getLocale(); D) Locale locale=response.getLocale(); (7)如果要创建用于上传文件的表单, 置为 C_ ° A ) GET

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

Spring定时器在SSH框架中的应用 ---Spring调度任务 本课题参考自《Spring in action》。并非应用系统中发生的所有事情都是由用户的动作引 起的。有时候,系统自己也需要发起一些动作。例如,集抄系统每天早上六点把抄表数据传送给营销系统。我们有两种选择:或者是每天由用户手动出发任务,或者让应用系统中按照预定的计划自动执行任务。 在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;

Spring定时器配置(XML和注解)

Spring配置定时器(注解+xml)方式—整理 一、注解方式 1.在Spring的配置文件ApplicationContext.xml,首先添加命名空间 xmlns:task="https://www.360docs.net/doc/903892206.html,/schema/task" https://www.360docs.net/doc/903892206.html,/schema/task https://www.360docs.net/doc/903892206.html,/schema/task/spring-task-3.1.xsd 2.最后是我们的task任务扫描注解 3.spring扫描位置 4.写自己的定时任务 @Component//import https://www.360docs.net/doc/903892206.html,ponent; public class MyTestServiceImpl implements IMyTestService{ @Scheduled(cron="0/5****?")//每5秒执行一次 public void myTest(){ System.out.println("进入测试"); } } 注意:定时器的任务方法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定一个proxytargetclass的某个值为true) 二、XML方式 1.在spring配置文件中创建bean,创建schedule 2.在spring配置文件中创建bean,创建你的triggers 3.在spring配置文件中创建bean,指定定时器作用在那个类那个方法上面

quartz实现多任务动态调度

一、说明 由于最近工作要实现定时任务的执行,而且要求定时周期是不固定的,所以就用到了quartz来实现这个功能; spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。至于原因,则是spring对于quartz的支持实现,org.springframework. scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger,在quartz1.x 系列中org.quartz.CronTrigger是个类,而在quartz2.x系列中org.quartz.CronTrigg er变成了接口,从而造成无法用spring的方式配置quartz的触发器(trigger)。 我使用的quartz版本是2.2.1 。 最终实现的功能: 1)项目启动时,可执行的定时任务启动,按时执行相应的逻辑; 2)可添加新任务,删除任务,更新任务,暂停任务,恢复任务; 二、添加quartz包 我使用Gradle构建项目,加包时只需下面一行即可: compile "org.quartz-scheduler:quartz:2.2.1" 三、配置及使用 1. 配置任务调度器(对应的文件名为quartz-task.xml) ? 1 2 3

java中spring与Quartz 整合定时任务

现在想要获得在特定时间或者指定时间执行相应功能 有两种做法 在applicationContext.xml中写入如下Bean 1000 3600000 true 然后写SampleTask类,如下: package com.css.wam.portlet;

相关文档
最新文档