javascript
将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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的将Quartz与Spring集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓 科学 上网(安卓手机科学上网)
- 下一篇: 安装双系统linux和win10(安装双