将Quartz与Spring集成

在Java应用程序中调度作业时,Quartz是第一个考虑的工具。
Quartz是由最流行的RDBMS支持的作业调度程序。 这真的很方便,并且很容易与spring集成。
为了创建石英模式,您必须下载石英发行版并解压缩位于crystal-2.2.3 / docs / dbTables /中的文件夹。

根据您使用的数据库选择石英模式。 在我们的例子中,我们将使用本地h2数据库,因此将使用tables_h2.sql模式。
为了避免任何手动的SQL操作,我将使用Spring Boot数据库初始化功能。

让我们从gradle文件开始。

group 'com.gkatzioura'
version '1.0-SNAPSHOT'apply plugin: 'java'sourceCompatibility = 1.8buildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")}
}apply plugin: 'idea'
apply plugin: 'spring-boot'repositories {mavenCentral()
}dependencies {compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.3.3.RELEASE'compile group: 'org.springframework', name: 'spring-context-support', version: '4.2.4.RELEASE'compile group: 'org.springframework', name:'spring-jdbc', version: '4.2.4.RELEASE'compile group: 'org.quartz-scheduler', name: 'quartz', version: '2.2.3'compile group: 'ch.qos.logback', name: 'logback-core', version:'1.1.3'compile group: 'ch.qos.logback', name: 'logback-classic',version:'1.1.3'compile group: 'org.slf4j', name: 'slf4j-api',version:'1.7.13'compile group: 'com.h2database', name: 'h2', version:'1.4.192'testCompile group: 'junit', name: 'junit', version: '4.11'
}

除了石英,spring和h2依赖关系之外,我们还添加了spring-jdbc依赖关系,因为我们希望通过spring初始化数据库。

我们还将添加一个application.yml文件

spring:datasource:continueOnError: true
org:quartz:scheduler:instanceName: spring-boot-quartz-demoinstanceId: AUTOthreadPool:threadCount: 5
job:startDelay: 0repeatInterval: 60000description: Sample jobkey: StatisticsJob

由于架构创建语句(如果不存在则缺少创建),我将spring.datasource.continueOnError设置为false。 根据您的实施,解决方法将有所不同。

应用类别

package com.gkatzioura.springquartz;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;/*** Created by gkatzioura on 6/6/16.*/
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication();ApplicationContext ctx = springApplication.run(Application.class,args);}
}

H2数据源配置由石英支持

package com.gkatzioura.springquartz.config;import org.h2.jdbcx.JdbcDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/*** Created by gkatzioura on 6/6/16.*/
@Configuration
public class QuartzDataSource {//Since it a test database it will be located at the temp directoryprivate static final String TMP_DIR = System.getProperty("java.io.tmpdir");@Beanpublic DataSource dataSource() {JdbcDataSource ds = new JdbcDataSource();ds.setURL("jdbc:h2:"+TMP_DIR+"/test");return ds;}}

在我们的情况下,我们希望每分钟发送一次“垃圾邮件”电子邮件,因此我们定义了一个简单的电子邮件服务

package com.gkatzioura.springquartz.service;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;/*** Created by gkatzioura on 6/7/16.*/
@Service
public class EmailService {private static final Logger LOGGER = LoggerFactory.getLogger(EmailService.class);public void sendSpam() {LOGGER.info("Should send emails");}}

我还将实现一个SpringBeanJobFactory

package com.gkatzioura.springquartz.quartz;import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;/*** Created by gkatzioura on 6/7/16.*/
public class QuartzJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {private transient AutowireCapableBeanFactory beanFactory;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {beanFactory = applicationContext.getAutowireCapableBeanFactory();}@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {final Object job = super.createJobInstance(bundle);beanFactory.autowireBean(job);return job;}
}

QuartzJobFactory将创建作业实例,并将使用应用程序上下文来注入定义的任何依赖项。

下一步是定义我们的工作

package com.gkatzioura.springquartz.job;import com.gkatzioura.springquartz.service.EmailService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;/*** Created by gkatzioura on 6/6/16.*/
public class EmailJob implements Job {@Autowiredprivate EmailService cronService;@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {cronService.sendSpam();}
}

最后一步是添加石英配置

package com.gkatzioura.springquartz.config;import com.gkatzioura.springquartz.job.EmailJob;
import com.gkatzioura.springquartz.quartz.QuartzJobFactory;
import org.quartz.SimpleTrigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;import javax.sql.DataSource;
import java.util.Properties;/*** Created by gkatzioura on 6/7/16.*/
@Configuration
public class QuartzConfig {@Value("${org.quartz.scheduler.instanceName}")private String instanceName;@Value("${org.quartz.scheduler.instanceId}")private String instanceId;@Value("${org.quartz.threadPool.threadCount}")private String threadCount;@Value("${job.startDelay}")private Long startDelay;@Value("${job.repeatInterval}")private Long repeatInterval;@Value("${job.description}")private String description;@Value("${job.key}")private String key;@Autowiredprivate DataSource dataSource;@Beanpublic org.quartz.spi.JobFactory jobFactory(ApplicationContext applicationContext) {QuartzJobFactory sampleJobFactory = new QuartzJobFactory();sampleJobFactory.setApplicationContext(applicationContext);return sampleJobFactory;}@Beanpublic SchedulerFactoryBean schedulerFactoryBean(ApplicationContext applicationContext) {SchedulerFactoryBean factory = new SchedulerFactoryBean();factory.setOverwriteExistingJobs(true);factory.setJobFactory(jobFactory(applicationContext));Properties quartzProperties = new Properties();quartzProperties.setProperty("org.quartz.scheduler.instanceName",instanceName);quartzProperties.setProperty("org.quartz.scheduler.instanceId",instanceId);quartzProperties.setProperty("org.quartz.threadPool.threadCount",threadCount);factory.setDataSource(dataSource);factory.setQuartzProperties(quartzProperties);factory.setTriggers(emailJobTrigger().getObject());return factory;}@Bean(name = "emailJobTrigger")public SimpleTriggerFactoryBean emailJobTrigger() {SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();factoryBean.setJobDetail(emailJobDetails().getObject());factoryBean.setStartDelay(startDelay);factoryBean.setRepeatInterval(repeatInterval);factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT);return factoryBean;}@Bean(name = "emailJobDetails")public JobDetailFactoryBean emailJobDetails() {JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();jobDetailFactoryBean.setJobClass(EmailJob.class);jobDetailFactoryBean.setDescription(description);jobDetailFactoryBean.setDurability(true);jobDetailFactoryBean.setName(key);return jobDetailFactoryBean;}
}

我们所做的是使用定义的QuartzJobFactory创建调度程序工厂bean,并注册了作业运行所需的触发器。 在我们的案例中,我们实现了一个简单的触发器,每分钟运行一次。

您可以在github上找到源代码

翻译自: https://www.javacodegeeks.com/2016/06/integrating-quartz-spring.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下md5sum的使用

在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。1、使用md5sum来产生指纹(报文摘要)命令如下:md5su…

深入理解Python中的元类(metaclass)

注:本文原稿来自stackoverflow,原文链接,目前已收获5k高赞。 一、类也是对象 在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组…

6个步骤卸载wine

今天在ubuntu下装了个wine,感觉界面很难看,跟ubuntu风格不协调。所以我把它卸载了。 根据网上找的资料,我是按如下步骤卸载: 1.终端运行sudo apt-get remove wine,运行发现系统还有wine的图标残留,于是 2…

OpenStack基础知识-virtualenv工具详解

1、virtualenv介绍 virtualenv通过创建一个单独的虚拟化python运行环境,将我们所需的依赖安装进去,不同项目之间相互不干扰,从而解决不同的项目之间依赖不同,造成的冲突问题 2、安装virtualenv 通过pip命令,安装virtua…

java中的五种排序方法_用Java排序的五种有用方法

java中的五种排序方法Java排序快速概述: 正常的列表: private static List VEGETABLES Arrays.asList("apple", "cocumbers", "blackberry");Collections.sort(VEGETABLES);output: apple, blackberry, cocumbers反向排…

压缩vmware中的ubuntu系统(虚拟机瘦身大法)

压缩vmware中的ubuntu系统&#xff08;虚拟机瘦身大法&#xff09; 前提:你的虚拟机大小 < 你放置虚拟机的磁盘的剩余空间 1.在Termial(终端)里 运行"sudo vmware-toolbox"(需要root权限) 2.选择“shrink”选项卡 3.选中“/”&#xff0c;点击“shrink”按钮 4.完…

P2619 [国家集训队2]Tree I

P2619 [国家集训队2]Tree I 链接 分析&#xff1a; 为了确定白边选入的数量&#xff0c;所以给白边加一个权值&#xff0c;二分这个值&#xff0c;然后最小生成树。可以发现白边的数量虽这个值的增大而减小&#xff0c;满足单调性。 有一个问题&#xff1a;如果在二分过程中给白…

程序化JCMD访问

在线提出的问题表明&#xff0c;开发人员偶尔希望通过其Java应用程序访问通常从针对该应用程序外部运行JConsole &#xff0c; VisualVM或JDK命令行工具获得的信息类型。 以下是这类问题的一些示例&#xff1a; 如何以编程方式获取jmap直方图&#xff1f; 以编程方式从Java应…

Ubuntu瘦身与扩容运动

Ubuntu瘦身与扩容运动 2009-11-26 18:18:24| 分类&#xff1a; 计算机 | 标签&#xff1a; |字号大中小 订阅 Ubuntu瘦身与扩容运动 2009年08月14日 星期五 12:25大家都知道系统用久了就会慢慢变得臃肿,速度当然也就会有一些影响,所以当那些加速系统的方法不在奏效的时候…

认识jQuery

一、JavaScript库 把一些浏览器兼容性的代码或者需要常用的函数装在一个js文件里,封装了很多js代码的一个js文件就是一个库 二、jQuery 是一个JavaScript库&#xff0c;免费开源的&#xff0c;体积小&#xff0c;链式编程&#xff0c;隐式迭代&#xff0c;很多优点jQuery 的功能…

Axis2 WebService(配置、发布、调用)

from:http://www.lifeba.org/arch/java_axis2_webservice.html 准备工作 1、下载&#xff1a;axis2-1.5.4-bin.zip,axis2-1.5.4-war.zip 下载地址&#xff1a;http://axis.apache.org/axis2/java/core/ 2、环境变量设置 AXIS2_HOME E:\research\axis2-1.5.4-bin\axis2-1.5.4 J…

SmartPDA图片

转载于:https://www.cnblogs.com/xyyshishuaige/p/9098613.html

基于国家标准的 EndNote 输出样式模板

发表于 2013-05-26作者 Haoxian Zeng浏览 983 次from:http://cnzhx.net/blog/endnote-output-style-cnzhx/1EndNote 相当于一个数据库&#xff0c;将添加/导入的文献存档。需要引用文献的时候就从中选择一个插入到文档中&#xff0c;EndNote 会自动给你编号、在文档末尾建立相应…

工厂设计模式解决什么问题_使用工厂模式解决设计问题

工厂设计模式解决什么问题工厂设计模式是面向对象环境中最常用的模式之一。 再次来自“创意设计”模式类别&#xff0c;即有关对象创建的所有信息。 在某些情况下&#xff0c;对象的创建很复杂&#xff0c;可能需要某种程度的抽象&#xff0c;以便客户端代码不了解这些复杂性和…

shiro 认证思路

转载于:https://www.cnblogs.com/hwgok/p/9101232.html

Java 9对可选的补充

哇&#xff0c;人们对Java 9的Stream API增添了 真正的兴趣。 想要更多&#xff1f; 让我们看一下…… 可选的 可选::流 这不需要任何解释&#xff1a; Stream<T> stream();想到的第一个词是&#xff1a; 终于 &#xff01; 最后&#xff0c;我们可以轻松地从可选值流…

Matlab功率谱估计

(2012-03-16 12:22:15) 随机信号处理 * 随机变量分布特征量 均值mean 协方差矩阵cov 相关系数矩阵corrcoef [R, P] corrcoef(X)&#xff0c;P值用于检验相关性&#xff0c;越小越相关&#xff0c;0.05以下为显著相关。 * 相关函数估计 相关函数估计xcorr [c,lags] xcorr(…

OO第三次博客作业——规格

OO第三次博客作业——规格 一、调研结果&#xff1a; 规格的历史&#xff1a; 引自博文链接&#xff1a;http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世界&#xff0c;而软件的特点是构造世界。软件的最底层就是0&#xff0c;1&#xff0c;两个…

EndNote使用技巧之一--参考文献的导入

2012-11-20 11:54:15| 分类&#xff1a; 学术相关 | 标签&#xff1a; |字号大中小 订阅 一、怎样给课题组的其他人员共享我的library? 打开要共享的libirary→点击file→send to→compressed lirary→在 Send to Compressed Library 窗口确认储存路径与文件名&#xf…

5.29

查看linux系统中空闲内存/物理内存使用/剩余内存 free -m top命令 是Linux下常用的性能 分析工具 ps -eL |wc -l 查看进程数 ulimit -a 查看资源限制 echo DDS_ROOT 查看DDS设置的环境变量 tcpdump -i eth0 src 192.168.2.204 查看源IP204的eth0网卡的数据包接收情况 用vi进入…