文章首发于个人博客:https://yeyouluo.github.io

  • 0 预备知识:cron表达式

    见 《5 参考》一节。

    1 环境

    eclipse mars2 + Maven3.3.9

    2 开发步骤

    项目码云地址

    2.1 建立一个maven工程

    POM如下:

     <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yeyouluo.spring.timer</groupId>
    <artifactId>spring-timer-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version> <properties>
    <spring.version>4.2.6.RELEASE</spring.version>
    <slf4j.version>1.7.2</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
    </properties>
    <dependencies>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
    </dependency>
    <!-- common-logging 实际调用slf4j -->
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
    </dependency>
    <!-- java.util.logging 实际调用slf4j -->
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>${slf4j.version}</version>
    </dependency>
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>${log4j.version}</version>
    </dependency>
    <dependency>
    <groupId>org.lazyluke</groupId>
    <artifactId>log4jdbc-remix</artifactId>
    <version>0.2.7</version>
    </dependency>
    <!-- spring核心包 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-messaging</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-core</artifactId>
    <version>4.2.5.RELEASE</version>
    </dependency> </dependencies> <packaging>jar</packaging>
    </project>

    POM.xml

    pom文件中可能加入了很多没有使用的jar,比如和mybatis、druid、mysql-connector相关的jar,以备后用。

    2.2 添加配置文件

    ①log4j.properties

     log4j.rootLogger=INFO, Console, RollingFile
    #Console
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n #RollingFile
    log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.RollingFile.File=logs/log.log
    log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

    log4j.xml

    ②spring-base.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:task="http://www.springframework.org/schema/task"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="readDBTask" class="com.yeyouluo.spring.timer.service.ReadDBTask"></bean> <task:scheduled-tasks>
    <task:scheduled ref="readDBTask" method="doSomething" cron="0/3 * * * * ?"/>
    </task:scheduled-tasks> </beans>

    spring-base.xml

    注意引入命名空间
    xmlns:task=”http://www.springframework.org/schema/task“ 和
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.0.xsd

    2.3 创建定时任务ReadDBTask

     package com.yeyouluo.spring.timer.service;
    import org.apache.log4j.Logger;
    public class ReadDBTask {
    public static Logger log = Logger.getLogger(ReadDBTask.class);
    public void doSomething() {
    log.info("********");
    log.info("定时任务执行。");
    }
    }

    ReadDBTask.java

    2.4 添加启动函数Main

     package com.yeyouluo.spring.timer.start;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class Main { public static Logger logger = LoggerFactory.getLogger(Main.class);
    public static final String config = "spring-base.xml"; public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(config);
    logger.info("spring timer started");
    if( ctx != null ) {
    ctx.start();
    }
    }
    }

    Main.java

    3 流程分析

    在启动函数Main.java右键 –> run as –> Java Application。
    结果为:每3秒在控制台输出如下:
    2017-10-16 15:03:54,885 [main] INFO [com.yeyouluo.spring.timer.start.Main] - spring timer started
    2017-10-16 15:03:57,002 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - **
    2017-10-16 15:03:57,003 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - 定时任务执行。
    2017-10-16 15:04:00,001 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - **
    2017-10-16 15:04:00,001 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - 定时任务执行。
    2017-10-16 15:04:03,001 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - **
    2017-10-16 15:04:03,001 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - 定时任务执行。
    2017-10-16 15:04:06,002 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - **
    2017-10-16 15:04:06,002 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - 定时任务执行。

    • 从入口函数开始,加载spring配置文件spring-base.xml。
    • spring-base.xml定义了 ,指向定时任务类com.yeyouluo.spring.timer.service.ReadDBTask的doSomething方法。
    • 执行doSomething方法中的逻辑。

    4 拓展:打成jar部署到单独的服务器上

    目标:用java命令拉起程序。
    步骤:
    ①将依赖jar提取出来,放入D:\timer\lib
    ②maven打包程序,将生成的jar放入D:\timer\lib
    ③在D:\timer\lib下新建一个文件start.cmd,内容如下:
    java -Djava.ext.dirs=D:\timer\lib -Xms1024m -Xmx1024m com.yeyouluo.spring.timer.start.Main
    ④双击start.cmd。
    结果:

    部署在Linux上是一样的操作,仅仅是替换启动文件类型为.sh,并且内容中的路径改为Linux的路径。
    如果是部署在Linux服务器上,还可以编写如下文件:
    stop.sh
    jps | grep Main | awk '{print $1}' | xargs kill -9
    注:通过kill进程的方式实现,不优雅。尤其要注意还没有其他名称为Main的进程,防止误杀。

    clean-log.sh
    rm -f logs/*

    5 参考

spring cron 定时任务的更多相关文章

  1. spring的定时任务配置

    本文来源于:http://myspace1916.iteye.com/blog/1570707 也可参考:http://www.oschina.net/question/8676_9032 (个人只是 ...

  2. Spring的定时任务配置2(转)

    spring的定时任务配置分为三个步骤: 1.定义任务 2.任务执行策略配置 3.启动任务 1.定义任务 <!--要定时执行的方法--> <bean id="testTas ...

  3. Spring的定时任务配置(转)

    spring的定时任务配置分为三个步骤: 1.定义任务 2.任务执行策略配置 3.启动任务 1.定义任务 <!--要定时执行的方法--> <bean id="testTas ...

  4. spring 配置定时任务

    spring的定时任务配置分为三个步骤:1.定义任务2.任务执行策略配置3.启动任务1.定义任务 <!--要定时执行的方法--> <bean id="testTaskJob ...

  5. Spring Boot定时任务应用实践

    在Spring Boot中实现定时任务功能,可以通过Spring自带的定时任务调度,也可以通过集成经典开源组件Quartz实现任务调度. 一.Spring定时器 1.cron表达式方式 使用自带的定时 ...

  6. spring cron表达式及解析过程

    1.cron表达式 cron表达式是用来配置spring定时任务执行时间的字符串,由5个空格分隔成的6个域构成,格式如下: {秒}  {分}  {时}  {日}  {月}  {周} 每一个域的含义解释 ...

  7. spring 实现定时任务

    spring实现定时任务超级简单.比使用quartz简单,比使用timer强大.如下是一个简单的springboot任务,启用了定时任务 @SpringBootApplication@Componen ...

  8. 【Spring】Spring的定时任务注解@Scheduled原来如此简单

    1 简介 定时任务的实现非常多,JDK的Timer.Spring提供的轻量级的Scheduled Task.QuartZ和Linux Cron等,还有一些分布式的任务调度框架.本文主要介绍Schedu ...

  9. Spring Task定时任务的配置和使用详解

    spring中使用定时任务 1.基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.or ...

随机推荐

  1. 使用logrotate分割tomcat日志

    转:https://www.52os.net/articles/using-logrotate-manage-tomcat-logs.html July 28, 2014 日志是Linux系统中最重要 ...

  2. linux_思想

    linux有哪些重要的思想? 1. 做的越多错的越多 2. 纸包不住火 3. 操作重要文件前备份,操作后查看结果 4. 看到命令输出结果,可能命令有个选择直接获得对应值 5. 先定行,再定列

  3. linkin大话面向对象--封装和隐藏

    软件开发追求的境界:高内聚,低耦合 高内聚:尽可能把模块的内部数据,功能实现细节隐藏在模块内部独立完成,不允许外部直接干预 低耦合:仅暴露少量的方法给外部使用 到底为什么要对一个雷或者对象实现良好的封 ...

  4. MySQL中查询表及索引大小的方法

    查询MySQL表的大小及索引大小可以通过系统库information_schema中的TABLES表来实现. 该表常用的一些字段: TABLE_SCHEMA:数据库名TABLE_NAME:表名ENGI ...

  5. 错误:java.lang.NoClassDefFoundError: com/project/common/exception/ServiceException 的解决

    问题: 项目编译通过,启动报错误信息java.lang.NoClassDefFoundError: com/project/common/exception/ServiceException. 解决方 ...

  6. Android 使用EventBus发送消息接收消息

    基本使用 自定义一个类 public class LoginEvent { private String code;//是否成功 public LoginEvent(String code) { th ...

  7. VisionPro学习笔记:用IEEE1394相机抓取图像

    1)找到采集卡: CogFrameGrabber1394DCAMs cameras = new CogFrameGrabber1394DCAMs(); 2)列举相连接的相机: ICogFrameGra ...

  8. 重拾Python(2):如何安装第三方库(Windows)

    使用python进行数据分析或者数据处理时,往往需要使用一些库,而使用库之前必须安装它.Anaconda内置了很多常用的第三方库,可以满足绝大部分需求,比如numpy.pandas.matplotli ...

  9. Nginx Https配置不带www跳转www

    把 morethink.cn和www.morethink.cn合并到一个server上去,使用301永久重定向. 然后将 https://morethink.cn 转到 https://www.mor ...

  10. linux中的&&和||(linux中=和==效果是一样的)

    1. 命令1 && 命令2 命令1执行成功在执行命令2 2. 命令1 || 命令2 命令1执行失败后在执行命令2 我觉得这完全就是判断呀.