您的位置:首页 > 编程语言 > Java开发

spring MVC定时器注解配置说明

2017-04-19 10:48 477 查看
一、spring-servlet.xml配置

1、<beans> 标签加上命名空间和 schemaLocation:

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd ">

2、 配置任务调度驱动和bean

<task:executor id="executor" pool-size="5" />

<task:scheduler id="scheduler" pool-size="10" />

<!-- 开启这个配置,识别@Scheduled注解 -->

<task:annotation-driven executor="executor" scheduler="scheduler" />

附:我的springMVC-servlet.xml配置文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
">

<!-- 启动扫描的controller,多个包可用','隔开, 扫描包下面的子包,可用.*  -->
<!--  Spring容器优先加载由ServletContextListener(对应applicationContext.xml)产生的父容器,而SpringMVC(对应mvc_dispatcher_servlet.xml)产生的是子容器。子容器Controller进行扫描装配时装配的@Service注解的实例是没有经过事务加强处理,即没有事务处理能力的Service,而父容器进行初始化的Service是保证事务的增强处理能力的。如果不在子容器中将Service exclude掉,此时得到的将是原样的无事务处理能力的Service,因为在多上下文的情况下,如果同一个bean被定义两次,后面一个优先。 -->
<context:component-scan base-package="com.med.web.controller, com.hpe.web.*,com.hpe.web.dao.impl,com.hpe.web.controller,com.hpe.web.service, com.hpe.task">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- 启用spring mvc 注解 -->
<context:annotation-config />

<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="10" />
<!-- 开启这个配置,识别@Scheduled注解   -->
<task:annotation-driven executor="executor" scheduler="scheduler" />

<!--  主要作用于@Controller,激活该模式
下面是一种简写形式,完全可以手动配置替代这种简写形式;
它会自动注册 DefaultAnnotationHandlerMapping 与 AnnotationMethodHandlerAdapter 两个bean, 完成请求和注解POJO的映射
是spring MVC为@Controllers分发请求所必须的   -->
<mvc:annotation-driven/>

<!-- jsp页面解析器,当Controller返回XXX字符串时,先通过拦截器,然后该类就会在/WEB-INF/views/目录下,查找XXX.jsp文件-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

<!-- don't handle the static resource 将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。而<mvc:resources />更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。 -->
<!--  <mvc:default-servlet-handler /> -->

<!-- SpringMVC上传文件专用 -->
<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<property name="maxUploadSize" value="3221225472"></property>
<property name="maxInMemorySize" value="4096"></property>
</bean>

<!-- 全局配置
<mvc:interceptors>
<bean class="com.capinfo.common.interceptor.PermissionInterceptor"></bean>
</mvc:interceptors>
-->

<!--
配置/WEB-INF/views/目录里面的jsp文件不被DispatcherServlet处理,可以直接通过浏览器访问。
view-name - /WEB-INF/views/里面的jsp文件名(不许后缀即可)
path -  访问地址

<mvc:view-controller path="/header" view-name="header"/>      -->

<!-- 用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到spring bean对象
<bean class="com.capinfo.common.SpringContextHolder" lazy-init="false" />
-->
<!-- 对静态资源文件的访问  方案一 (二选一)
<mvc:default-servlet-handler/>
-->
<!-- 对静态资源文件的访问  方案二 (二选一)
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
<mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/>
<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>  -->

<!-- 全局异常处理 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 异常提示页面
<property name="exceptionMappings">
<props>
<prop key="com.capinfo.user.exception.LoginException">loginError</prop>
</props>
</property>  -->
<property name="defaultErrorView">
<value>error</value>
</property>
<property name="defaultStatusCode">
<value>500</value>
</property>
<property name="warnLogCategory">
<value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>
</property>
</bean>

</beans>


二、代码注解配置说明:

  注解@Scheduled 可以作为一个触发源添加到一个方法中,例如,以下的方法将以一个固定延迟时间5秒钟调用一次执行,这个周期是以上一个调用任务的完成时间为基准,在上一个任务完成之后,5s后再次执行:

    

    如果需要以固定速率执行,只要将注解中指定的属性名称改成fixedRate即可,以下方法将以一个固定速率5s来调用一次执行,这个周期是以上一个任务开始时间为基准,从上一任务开始执行后5s再次调用:

    对于固定延迟和固定速率的任务,可以指定一个初始延迟表示该方法在第一被调用执行之前等待的毫秒数:

    如果简单的定期调度不能满足,那么cron表达式提供了可能。例如,下面的方法将只会在工作日执行:

代码片段
@Scheduled(cron = "0 07 * * * ?")
public void readXmlToDB() throws SQLException {
log.info("begin to read xml file data, save data to database...");
 

cron表达式规则:

* 字段 允许值 允许的特殊字符

秒 0-59 , - * /

分 0-59 , - * /

小时 0-23 , - * /

日期 1-31 , - * ? / L W C

月份 1-12 或者 JAN-DEC , - * /

星期 1-7 或者 SUN-SAT , - * ? / L C #

年(可选) 留空, 1970-2099 , - * /

- 区间

* 通配符

? 你不想设置那个字段

1 Seconds (0-59)

2 Minutes (0-59)

3 Hours (0-23)

4 Day of month (1-31)

5 Month (1-12 or JAN-DEC)

6 Day of week (1-7 or SUN-SAT)

7 Year (1970-2099)

取值:可以是单个值,如6;

也可以是个范围,如9-12;

也可以是个列表,如9,11,13

也可以是任意取值,使用*

CRON表达式 示例:

"0 0 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分每分钟一次触发

"0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发

"0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发

"0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发

"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发

"0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发

"0 * * * * ?" 每分钟(0点0时0分)触发一次

"0 0 * * * ?" 每小时(0点0时0分)触发一次

fixedDelay = 5000 每秒触发一次 这个周期是以上一个调用任务的完成时间为基准,在上一个任务完成之后,5s后再次执行

fixedRate = 5000 每3秒触发一次 固定速率执行,以上一个任务开始时间为基准,从上一任务开始执行后5s再次调用

initialDelay=3000 启动后延迟3秒后开始首次触发

    还可以通过使用zone属性来指定cron表达式被调用的时区。

 

注意:

  1、spring的注解@Scheduled  需要写在实现方法上;

  2、定时器的任务方法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定一个proxytargetclass的某个值为true),不能指向任何的参数;

  3、如果该方法需要与应用程序上下文的其他对象进行交互,通常是通过依赖注入来实现;

  4、实现类上要有组件的注解@Component。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: