SpringBoot整合Quartz及log4j实例  

  因为之前项目中经常会做一些定时Job的东西,所以在此记录一下,目前项目中已经使用elastic-job,这个能相对比Quartz更加简单方便一些,有助于对任务调度的触发和禁止以及任务执行时间的修改。elastic-job也是基于Quartz以及ZK的,所以在使用时,需要搭建zk环境,一般使用还是根据当下开发环境使用。一下为实例:

1、项目结构

2、所需要使用的依赖pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4.  
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>1.5.8.RELEASE</version>
  9. <relativePath /> <!-- lookup parent from repository -->
  10. </parent>
  11.  
  12. <groupId>com.sto.sycdata</groupId>
  13. <artifactId>syc-data</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <packaging>jar</packaging>
  16.  
  17. <name>sto-pay-order</name>
  18. <url>http://maven.apache.org</url>
  19.  
  20. <properties>
  21. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22. <java.version>1.7</java.version>
  23. </properties>
  24.  
  25. <dependencies>
  26.  
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-web</artifactId>
  30. <exclusions>
  31. <!-- 想要配置log4j2,就要先去除logging包 -->
  32. <exclusion>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-logging</artifactId>
  35. </exclusion>
  36. </exclusions>
  37. </dependency>
  38.  
  39. <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j -->
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-log4j</artifactId>
  43. <version>1.3.8.RELEASE</version>
  44. </dependency>
  45.  
  46. <!-- https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter -->
  47. <dependency>
  48. <groupId>com.alibaba</groupId>
  49. <artifactId>druid-spring-boot-starter</artifactId>
  50. <version>1.1.4</version>
  51. </dependency>
  52.  
  53. <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
  54. <dependency>
  55. <groupId>org.mybatis.spring.boot</groupId>
  56. <artifactId>mybatis-spring-boot-starter</artifactId>
  57. <version>1.3.1</version>
  58. <exclusions>
  59. <!-- 想要配置log4j,就要先去除logging包 -->
  60. <exclusion>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-starter-logging</artifactId>
  63. </exclusion>
  64. <exclusion>
  65. <groupId>org.apache.tomcat</groupId>
  66. <artifactId>tomcat-jdbc</artifactId>
  67. </exclusion>
  68. </exclusions>
  69. </dependency>
  70. <!-- Oracle Driver Begin -->
  71. <dependency>
  72. <groupId>oracle</groupId>
  73. <artifactId>ojdbc14</artifactId>
  74. <version>10.2.0.1.0</version>
  75. </dependency>
  76. <dependency>
  77. <groupId>org.quartz-scheduler</groupId>
  78. <artifactId>quartz-jobs</artifactId>
  79. <version>2.2.3</version>
  80. </dependency>
  81.  
  82. <dependency>
  83. <groupId>org.springframework</groupId>
  84. <artifactId>spring-context-support</artifactId>
  85. </dependency>
  86.  
  87. <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
  88. <dependency>
  89. <groupId>org.quartz-scheduler</groupId>
  90. <artifactId>quartz</artifactId>
  91. <version>2.2.1</version>
  92. </dependency>
  93. </dependencies>
  94.  
  95. <build>
  96. <finalName>syc-data</finalName>
  97. <plugins>
  98. <plugin>
  99. <groupId>org.springframework.boot</groupId>
  100. <artifactId>spring-boot-maven-plugin</artifactId>
  101. </plugin>
  102. </plugins>
  103. </build>
  104.  
  105. </project>

  3、配置文件

  application.properties

  1. #datasource
  2. spring.datasource.druid.one.url=jdbc:oracle:thin:@//127.0.0.1:1521/test
  3. spring.datasource.druid.one.username=root
  4. spring.datasource.druid.one.password=123456
  5. spring.datasource.druid.one.driver-class-name=oracle.jdbc.driver.OracleDriver
  6. spring.datasource.druid.one.initial-size=5
  7. spring.datasource.druid.one.max-active=10
  8. spring.datasource.druid.one.min-idle=5
  9. spring.datasource.druid.one.max-wait=6000
  10. spring.datasource.druid.one.validation-query=SELECT 1 FROM DUAL
  11. spring.datasource.druid.one.test-on-borrow=true
  12. spring.datasource.druid.one.test-on-return=false
  13. spring.datasource.druid.one.test-while-idle=false
  14. spring.datasource.druid.one.remove-abandoned=true
  15. spring.datasource.druid.one.remove-abandoned-timeout=30
  16.  
  17. server.port=-1

  log4j.properties

  1. log4j.rootLogger=info, stdout, file
  2.  
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  5. #log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
  6. log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m%n
  7. log4j.appender.stdout.threshold=debug
  8.  
  9. # SqlMap logging configuration...
  10. log4j.logger.com.sto.sycdata.dao=DEBUG
  11. log4j.logger.com.ibatis=DEBUG
  12. log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=ERROR
  13. log4j.logger.com.ibatis.common.jdbc.ScriptRunner=ERROR
  14. log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=ERROR
  15. log4j.logger.java.sql.Connection=DEBUG
  16. log4j.logger.java.sql.Statement=DEBUG
  17. log4j.logger.java.sql.PreparedStatement=DEBUG
  18. log4j.logger.java.sql.ResultSet=DEBUG
  19.  
  20. #DailyRollingFileAppender \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6
  21. log4j.appender.file=org.apache.log4j.RollingFileAppender
  22. log4j.appender.file.Append=true
  23. log4j.appender.file.MaxFileSize=10MB
  24. log4j.appender.file.MaxBackupIndex=1000
  25. log4j.appender.file.File=E:/log/log222.log
  26. log4j.appender.file.DatePattern='_'yyyy-MM-dd'.log'
  27. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  28. log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m%n
  29. log4j.appender.file.threshold=debug

  4、数据源配置代码:

  1. package com.sto.sycdata.datasource;
  2.  
  3. import javax.sql.DataSource;
  4.  
  5. import org.apache.ibatis.io.VFS;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.mybatis.spring.SqlSessionFactoryBean;
  8. import org.mybatis.spring.annotation.MapperScan;
  9. import org.springframework.beans.factory.annotation.Qualifier;
  10. import org.springframework.boot.context.properties.ConfigurationProperties;
  11. import org.springframework.context.annotation.Bean;
  12. import org.springframework.context.annotation.Configuration;
  13. import org.springframework.context.annotation.Primary;
  14. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  15. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  16.  
  17. import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
  18. import com.sto.sycdata.vfs.SpringBootVFS;
  19.  
  20. @Configuration
  21. @MapperScan(basePackages = DataSourceConfig.MASTERMAPPERPACKAGE, sqlSessionFactoryRef="masterSqlSessionFactory")
  22. public class DataSourceConfig {
  23.  
  24. static final String MASTERMAPPERPACKAGE = "com.sto.sycdata.dao";
  25. static final String MASTERMAPPERLOCATION = "classpath:mapper/*.xml";
  26. static final String MASTERALIASESPACKAGE = "com.sto.sycdata.entity";
  27.  
  28. @Bean(name = "dataSourceOne")
  29. @ConfigurationProperties("spring.datasource.druid.one")
  30. @Primary
  31. public DataSource dataSource() {
  32. return DruidDataSourceBuilder.create().build();
  33. }
  34.  
  35. @Bean(name = "masterTransactionManager")
  36. @Primary
  37. public DataSourceTransactionManager masterTransactionManager(@Qualifier("dataSourceOne") DataSource dataSourceOne) {
  38. return new DataSourceTransactionManager(dataSourceOne);
  39. }
  40.  
  41. @Bean(name = "masterSqlSessionFactory")
  42. @Primary
  43. public SqlSessionFactory masterSqlSessionFactory(@Qualifier("dataSourceOne") DataSource dataSourceOne)
  44. throws Exception {
  45.  
  46. //解决myBatis下 不能嵌套jar文件的问题
  47. VFS.addImplClass(SpringBootVFS.class);
  48.  
  49. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  50. sessionFactory.setDataSource(dataSourceOne);
  51. sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MASTERMAPPERLOCATION));
  52. sessionFactory.setTypeAliasesPackage(MASTERALIASESPACKAGE);
  53. return sessionFactory.getObject();
  54. }
  55. }

  5、解决myBatis下 不能嵌套jar文件的问题

  1. package com.sto.sycdata.vfs;
  2.  
  3. import java.io.IOException;
  4. import java.net.URI;
  5. import java.net.URL;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.List;
  9.  
  10. import org.apache.ibatis.io.VFS;
  11. import org.springframework.core.io.Resource;
  12. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  13. import org.springframework.core.io.support.ResourcePatternResolver;
  14.  
  15. public class SpringBootVFS extends VFS {
  16.  
  17. @Override
  18. public boolean isValid() {
  19. return true;
  20. }
  21.  
  22. @Override
  23. protected List<String> list(URL url, String path) throws IOException {
  24. ClassLoader cl = this.getClass().getClassLoader();
  25. ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
  26. Resource[] resources = resolver.getResources(path + "/**/*.class");
  27. List<Resource> resources1 = Arrays.asList(resources);
  28. List<String> resourcePaths = new ArrayList<String>();
  29. for (Resource resource: resources1) {
  30. resourcePaths.add(preserveSubpackageName(resource.getURI(), path));
  31. }
  32. return resourcePaths;
  33. }
  34.  
  35. private static String preserveSubpackageName(final URI uri, final String rootPath) {
  36. final String uriStr = uri.toString();
  37. final int start = uriStr.indexOf(rootPath);
  38. return uriStr.substring(start, uriStr.length());
  39. }
  40.  
  41. }

  6、实体类:

此实体类在本示例中没有用到,只是为了让示例结构看起来完整,后期可根据自己的具体情况决定实体的使用。

  1. package com.sto.sycdata.entity;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Test implements Serializable{
  6.  
  7. private String id;
  8. private String name;
  9.  
  10. public String getId() {
  11. return id;
  12. }
  13.  
  14. public void setId(String id) {
  15. this.id = id;
  16. }
  17.  
  18. public String getName() {
  19. return name;
  20. }
  21.  
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. }

  7、service接口:

  1. package com.sto.sycdata.service;
  2.  
  3. public interface TestService {
  4. int queryCount();
  5. }

  8、实现类:

  1. package com.sto.sycdata.service.impl;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5.  
  6. import com.sto.sycdata.dao.TestDao;
  7. import com.sto.sycdata.service.TestService;
  8.  
  9. @Service
  10. public class TestServiceImpl implements TestService {
  11.  
  12. @Autowired
  13. private TestDao testDao;
  14.  
  15. @Override
  16. public int queryCount() {
  17. return testDao.queryCount();
  18. }
  19.  
  20. }

  9、dao接口:

  1. package com.sto.sycdata.dao;
  2.  
  3. public interface TestDao {
  4.  
  5. int queryCount();
  6.  
  7. }

  10、mapper文件TestDao.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4.  
  5. <mapper namespace="com.sto.sycdata.dao.TestDao">
  6.  
  7. <select id="queryCount" resultType="java.lang.Integer">
  8. <![CDATA[
  9. select count(1) from dual
  10. ]]>
  11. </select>
  12.  
  13. </mapper>

  11、需要定时执行的任务调度实例:

  1. package com.sto.sycdata.schedula;
  2.  
  3. import com.sto.sycdata.service.TestService;
  4. import org.apache.log4j.Logger;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Component;
  7.  
  8. @Component
  9. @SuppressWarnings("all")
  10. public class TestTask {
  11.  
  12. private static Logger logger = Logger.getLogger(TestTask.class);
  13.  
  14. @Autowired
  15. private TestService testService;
  16.  
  17. public void run(){
  18. logger.info("定时任务开始执行");
  19. int i = testService.queryCount();
  20. System.out.println("*************************"+ i);
  21. logger.info("定时任务执行结束");
  22. }
  23. }

  12、Quartz核心配置类:

  1. package com.sto.sycdata.config;
  2.  
  3. import com.sto.sycdata.schedula.TestTask;
  4. import org.springframework.beans.factory.annotation.Qualifier;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
  8. import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
  9. import org.springframework.scheduling.quartz.SchedulerFactoryBean;
  10.  
  11. @Configuration
  12. public class ScheduledConfiguration {
  13.  
  14. @Bean(name = "testTaskFactoryBean")
  15. public MethodInvokingJobDetailFactoryBean payOrderPushFactoryBean(TestTask testTask) {
  16. MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
  17. bean.setTargetObject(testTask);
  18. bean.setTargetMethod("run");
  19. bean.setConcurrent(false);
  20. return bean;
  21. }
  22.  
  23. @Bean(name = "testTaskPushTrigger")
  24. public CronTriggerFactoryBean payOrderPushTrigger(@Qualifier("testTaskFactoryBean") MethodInvokingJobDetailFactoryBean testTaskPushFactoryBean) {
  25. CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
  26. trigger.setJobDetail(testTaskPushFactoryBean.getObject());
  27. trigger.setCronExpression("0/3 * * * * ?");
  28. return trigger;
  29. }
  30.  
  31. @Bean
  32. public SchedulerFactoryBean payOrderschedulerFactoryBean(@Qualifier("testTaskPushTrigger") CronTriggerFactoryBean testTaskPushTrigger) {
  33. SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
  34. schedulerFactoryBean.setTriggers(testTaskPushTrigger.getObject());
  35. return schedulerFactoryBean;
  36. }
  37.  
  38. }

  13、测试验证:

  1.  

SpringBoot整合Quartz及log4j实例的更多相关文章

  1. SpringBoot整合Quartz定时任务 系统job Spring Boot教程 调度任务

    原文地址:https://www.cnblogs.com/allalongx/p/8477368.html 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduli ...

  2. SpringBoot整合Quartz定时任务

    记录一个SpringBoot 整合 Quartz 的Demo实例 POM.XML文件 <!-- 定时器任务 quartz需要导入的坐标 --> <dependency> < ...

  3. SpringBoot整合Quartz作为调度中心完整实用例子

    因为想要做一个类似于调度中心的东西,定时执行一些Job(通常是一些自定义程序或者可执行的jar包),搭了一个例子,总结了前辈们的相关经验和自己的一些理解,如有雷同或不当之处,望各位大佬见谅和帮忙指正. ...

  4. SpringBoot整合Quartz定时任务(持久化到数据库)

    背景 最近在做项目,项目中有个需求:需要使用定时任务,这个定时任务需要即时生效.查看Quartz官网之后发现:Quartz提供两种基本作业存储类型: RAMJobStore :RAM也就是内存,默认情 ...

  5. SpringBoot整合Quartz定时任务 的简单实例 2

    (1)什么是Quartz?(2)Quartz的特点:(3)Quartz专用词汇说明:(4)Quartz任务调度基本实现原理: 接下来看下具体的内容: (1)什么是Quartz? Quartz是一个完全 ...

  6. SpringBoot整合Quartz定时任务 的简单实例

    POM.XML文件 <!-- 定时器任务 quartz需要导入的坐标 --> <dependency> <groupId>org.quartz-scheduler& ...

  7. springboot整合Quartz实现动态配置定时任务

    前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 & ...

  8. 【spring-boot】 springboot整合quartz实现定时任务

    在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用s ...

  9. SpringBoot整合Quartz

    1.引入quzrtz <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId> ...

随机推荐

  1. Java三大特性与实战

    三大特性: 封装,集成,多态 编程思想 类和对象: 方法的重载 this关键字 static关键字 静态代码块 package import Object 抽象类 接口 lambda表达式 字符串St ...

  2. ECS7天实践进阶训练营Day5:使用ECS自建云端下载服务器

    一.概述 CCAA是服务器离线下载解决方案包,其组件中包含了Aria2提供了离线下载功能,能支持HTTP/HTTPS/FTP/BT/磁力链下载等常用离线下载模式及断点续传等功能.ccaa_web支撑于 ...

  3. ZoneJS 的原理与应用

    目录 序言 Zone 是什么 ZoneJS 的原理 ZoneJS 的应用场景 参考 1. 序言 ZoneJS 是 Angular 团队受到 Dart 的 Zone 的启发,为 Angular v2 及 ...

  4. 使用 VMware Workstation Pro 让 PC 提供云桌面服务——学习笔记(二)

    实验效果: 这次希望的效果是能够用远程桌面来实现 . 这里参考了博客 https://www.cnblogs.com/wwang/archive/2011/01/06/1928933.html 操作步 ...

  5. golang 标准库

    前言 不做文字搬运工,多做思路整理 就是为了能速览标准库,只整理我自己看过的...... 最好能看看英文的 标准库 fmt strconv string 跳转 golang知识库总结

  6. eclipse中 sec/test/resource 文件夹消失怎么设置?

    右键改包--->build path --->Configure bulid path 按 add Folder 搞定.....

  7. Virtuoso 中如何优化 Library Manager 的显示

    https://www.cnblogs.com/yeungchie/ 主要从 cds.lib 文件去入手. 假设现在想把 Virtuoso 预装的库整理到 preload 分类(库)中. 首先创建一个 ...

  8. git存储用户名和密码

    git config --global credential.helper store 输入一次用户名和密码后,git会自动记录用户名密码

  9. 一张图带你玩转docker

  10. c++线性表和数组的区别

    在传统C语言程序中,描述顺序表的存储表示有两种方式:静态方式.动态方式 顺序表的静态存储表示: #define maxSize 100 typedefintT; typedefstruct{ T da ...