zoukankan      html  css  js  c++  java
  • 使用轻量级Spring @Scheduled注解执行定时任务

         WEB项目中需要加入一个定时执行任务,可以使用Quartz来实现,由于项目就一个定时任务,所以想简单点,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解来实现了定时任务。在这里做个备注。

    spring配置文件  xmlns中加入一段:

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

    然后xsi:schemaLocation多加下面的内容:

    http://www.springframework.org/schema/task  
    http://www.springframework.org/schema/task/spring-task-3.1.xsd  

    配置文件中启动TASK注解:

    <task:annotation-driven/>  
    <context:annotation-config/> 
    <context:component-scan base-package="com.xx.xx"/>

    编写JAVA代码:

    @Component
    public class ScheduledTaskManager {
        /**
         * cron表达式:* * * * * *(共6位,使用空格隔开,具体如下)
         * cron表达式:*(秒0-59) *(分钟0-59) *(小时0-23) *(日期1-31) *(月份1-12或是JAN-DEC) *(星期1-7或是SUN-SAT)
         */
    
        /**
         * 定时卡点计算。每天凌晨 02:00 执行一次
         */
        @Scheduled(cron = "0 0 2 * * *")
        public void autoCardCalculate() {
            System.out.println("定时卡点计算... " + new Date());
        }
    
        /**
         * 心跳更新。启动时执行一次,之后每隔1分钟执行一次
         */
        @Scheduled(fixedRate = 1000*60*1)
        public void heartbeat() {
            System.out.println("心跳更新... " + new Date());
        }
    
    }

    @Scheduled有两种方式:cron表达式和fixedRate

    两种都可以定时每隔一段时间执行,个人觉得两种方式区别是fixedTate方式是应用启动时候会先执行一次,cron表达式能配置更加复杂的情况。

    个人使用中出现了2个问题:

    1.项目启动时候会报出No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined异常信息:

      解决:这个错误问题其实是debug级别输出,就是不影响定时任务的使用,在网上看到别人有这样解释

      Spring的定时任务调度器会尝试获取一个注册过的 task scheduler来做任务调度,它会尝试通过BeanFactory.getBean的方法来获取一个注册过的scheduler bean,获取的步骤如下:  

      a.尝试从配置中找到一个TaskScheduler Bean  

      b.寻找ScheduledExecutorService Bean  

      c.使用默认的scheduler  

      前两步,如果找不到的话,就会以debug的方式抛出异常,

      分别是:  logger.debug("Could not find default TaskScheduler bean", ex);

      logger.debug("Could not find default ScheduledExecutorService bean", ex);

       所以,日志中打印出来的两个异常,根本不是什么错误信息,也不会影响定时器的使用,只不过是spring的自己打印的一些信息罢了

      如果想去掉这个输出,可以在log4j配置文件中增加一行即可:

    log4j.logger.org.springframework.scheduling = INFO

    2.发现定时任务每次执行都会执行两次

      这个问题后来发现是由于Spring的配置文件被加载了两次造成的,listener和DispatcherServlet都会初始化spring配置文件,所有注释掉listener即可

        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:config/application-context.xml</param-value>
        </context-param>
        
        <!-- Spring监听器 -->
        <!--
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        -->
        
        
        <!-- servlet设置,将所有请求接到org.springframework.web.servlet.DispatcherServlet进行处理 -->
        <servlet>
            <servlet-name>spring</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:config/application-context.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
  • 相关阅读:
    oracle a:=100 和 b=:c 区别
    Oracle为表或字段添加备注
    oracle删除表字段和oracle表增加字段
    oracle数据库的一个表中,怎么设置字段的默认值
    VS2015密钥
    C# 调用WebApi
    OCX ClassId查看
    C++ 调用类的函数
    如何做一个标记为安全的ACTIVEX控件
    Java内存通道
  • 原文地址:https://www.cnblogs.com/lylife/p/5977574.html
Copyright © 2011-2022 走看看