1. 程式人生 > >Quartz與Spring的整合-Quartz中的job如何自動注入spring容器託管的物件

Quartz與Spring的整合-Quartz中的job如何自動注入spring容器託管的物件

我們要達到這樣的效果

public class CancelUnpaidOrderTask implements Job {
@Autowired
private AppOrderService orderService;

@Override
public void execute(JobExecutionContext ctx) throws JobExecutionException {
...
}

但是Job物件的例項化過程是在Quartz中進行的,AppOrderService是在Spring容器當中的,那麼如何將他們關聯到一起呢。 好在Quartz提供了JobFactory介面,讓我們可以自定義實現建立Job的邏輯。

public interface JobFactory {

    Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException;

}

那麼我們通過實現JobFactory 介面,在例項化Job以後,在通過ApplicationContext 將Job所需要的屬性注入即可

在Spring與Quartz整合時 用到的是org.springframework.scheduling.quartz.SchedulerFactoryBean這個類。原始碼如下,我們只看最關鍵的地方。

//
Get Scheduler instance from SchedulerFactory. try { this.scheduler = createScheduler(schedulerFactory, this.schedulerName); populateSchedulerContext(); if (!this.jobFactorySet && !(this.scheduler instanceof RemoteScheduler)) { // Use AdaptableJobFactory as default for a local Scheduler, unless when
// explicitly given a null value through the "jobFactory" bean property. this.jobFactory = new AdaptableJobFactory(); } if (this.jobFactory != null) { if (this.jobFactory instanceof SchedulerContextAware) { ((SchedulerContextAware) this.jobFactory).setSchedulerContext(this.scheduler.getContext()); } this.scheduler.setJobFactory(this.jobFactory); } }

其中紅色標記的是重點,如果我們不指定jobFactory,那麼Spring就使用AdaptableJobFactory。我們在來看一下這個類的實現

package org.springframework.scheduling.quartz;

import java.lang.reflect.Method;

import org.quartz.Job;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.spi.JobFactory;
import org.quartz.spi.TriggerFiredBundle;

import org.springframework.util.ReflectionUtils;


public class AdaptableJobFactory implements JobFactory {
public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException {
return newJob(bundle);
}

public Job newJob(TriggerFiredBundle bundle) throws SchedulerException {
try {
Object jobObject = createJobInstance(bundle);
return adaptJob(jobObject);
}
catch (Exception ex) {
throw new SchedulerException("Job instantiation failed", ex);
}
}

protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// Reflectively adapting to differences between Quartz 1.x and Quartz 2.0...
Method getJobDetail = bundle.getClass().getMethod("getJobDetail");
Object jobDetail = ReflectionUtils.invokeMethod(getJobDetail, bundle);
Method getJobClass = jobDetail.getClass().getMethod("getJobClass");
Class jobClass = (Class) ReflectionUtils.invokeMethod(getJobClass, jobDetail);
return jobClass.newInstance();
}

protected Job adaptJob(Object jobObject) throws Exception {
if (jobObject instanceof Job) {
return (Job) jobObject;
}
else if (jobObject instanceof Runnable) {
return new DelegatingJob((Runnable) jobObject);
}
else {
throw new IllegalArgumentException("Unable to execute job class [" + jobObject.getClass().getName() +
"]: only [org.quartz.Job] and [java.lang.Runnable] supported.");
}
}

}

其他的我們都不管,我們就看紅色的地方,這裡是建立了一個Job,那我們就在這裡去給Job的屬性進行注入就可以了,讓我們寫一個類繼承它,然後複寫這個方法進行對Job的注入。

public class MyJobFactory extends AdaptableJobFactory {//這個物件Spring會幫我們自動注入進來,也屬於Spring技術範疇.
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;

protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//呼叫父類的方法
Object jobInstance = super.createJobInstance(bundle);
//進行注入,這屬於Spring的技術,不清楚的可以檢視Spring的API.
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}

接下來把他配置到Spring當中去

<bean id="jobFactory" class="com.gary.operation.jobdemo.demo1.MyJobFactory"></bean>

然後在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory設定成我們自己的。

<bean name="MyScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  <!-- 其他屬性省略 -->
  <property name="jobFactory" ref="jobFactory"></property>
</bean>

這樣就完成了Spring對Job的注入功能,其實很簡單,原理就是在我們擴充套件JobFactory建立job的方法,在建立完Job以後進行屬性注入。

相關推薦

QuartzSpring整合-Quartzjob如何自動注入spring容器託管物件

我們要達到這樣的效果 public class CancelUnpaidOrderTask implements Job { @Autowired private AppOrderService orderService; @Override public void

QuartzSpring整合 Job如何自動注入Spring容器託管物件

package org.springframework.scheduling.quartz; import java.lang.reflect.Method; import org.quartz.Job; import org.quartz.Scheduler; import org.quartz.S

Spring quartz Job不能依賴註入,Spring整合quartz Job任務不能註入

nbsp too upd ticket enter java代碼 rec onf 2.3 Spring quartz Job不能依賴註入,Spring整合quartz Job任務不能註入 Spring4整合quartz2.2.3中Job任務使用@Autowired不能註入

Spring整合Quartz定時任務 在集群、分布式系統的應用(Mysql數據庫環境)

foreign log ride bigint post 業務 設置 ade 營業額 Spring整合Quartz定時任務 在集群、分布式系統中的應用(Mysql數據庫環境) 轉載:http://www.cnblogs.com/jiafuwei/p/6145280.

spring整合quartz實現動態定時任務的前臺網頁配置管理

在實際專案應用中經常會用到定時任務,可以通過quartz和spring的簡單配置即可完成,但如果要改變任務的執行時間、頻率,廢棄任務等就需要改變配置甚至程式碼需要重啟伺服器,這裡介紹一下如何通過quartz與spring的組合實現動態的改變定時任務的狀態的一個實

spring整合quartz定時器的專案,如何關閉不斷輸出的batch acquisition of 0 triggers ?

不斷輸出的batch acquisition of 0 triggers太鬧心了,嚴重影響了除錯效率,不能忍,經過查閱資料得出關閉方法。希望幫助更多的小夥伴。解決方法:在pom.xml中看看使用的是哪個

初識quartz 並分析 項目spring整合quartz的配置【原創+轉載】

text lca 目的 並發 目錄結構 public 項目 功能 基於 初識quartz 並分析 項目中spring整合quartz的配置【原創+轉載】2018年01月29日 12:08:07 守望dfdfdf 閱讀數:114 標簽: quartz 更多個人分類: 工具 軟

Spring整合quartz實現定時動態任務

comm 通過 app 定時器 表示 時間 con 任務 images 在Spring中使用Quartz有兩種方式實現:第一種是任務類繼承QuartzJobBean,第二種則是在配置文件裏定義任務類和要執行的方法,類和方法可以是普通類。很顯然,第二種方式遠比第一種方式來的靈

Spring整合quartz關閉,關閉Tomcat Servlet容器時內存泄漏

read 還在 iss 出錯 appears 定時器線程 span img tro 出錯信息 22-Sep-2017 06:19:51.064 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBas

spring整合Quartz定時器

() void java類 info throws tex execute new protect 第一種:為普通java類中的某個方法配置跑批任務 1.定義要跑批的類和方法: package com.xy.utils.quartz; import org.joda.t

Spring整合Quartz框架實現定時任務跑批(Maven完整版)

觸發器 delay cut www 方法 lin job 定時任務 任務調度 Quartz 介紹Quartz is a full-featured, open source job scheduling service that can be integrated with

Spring整合quartz定時任務排程的cronExpression配置說明(轉載)

Spring整合quartz定時任務排程 "* * * * * *" 欄位   允許值   允許的特殊字元 秒   

Spring整合Quartz的3種方式

1.使用xml配置方式 Maven依賴 <properties> <!-- spring版本號 --> <spring.version>4.2.2.RELEASE</spring.version>

Spring整合Quartz框架實現分散式定時任務

1、叢集使用定時任務的問題:    目前大部分在叢集中處理定時任務的方式不是正真的分散式處理方式,而是一種偽分散式,這種方式存在一個明顯的缺陷就是當叢集中機器宕機, 那麼整個定時任務就會掛掉或者不能一次性跑完,會對業務產生嚴重的影響。   而且在叢集環境中,

Spring整合Quartz案例使用JDBC儲存方式

目錄 建立資料庫表 配置資料庫連線池 建立工作類 工作類中呼叫的業務類  工作類 配置JobDetail和Trigger,並交給Scheduler註冊 測試 Quartz叢集中如何工作 Quartz叢集環境下配置 quartz.properties

Spring整合Quartz案例使用RAM儲存方式

spring整合quartz有兩種任務儲存方式,RAM儲存方式和JDBC儲存方式,企業開發使用的JDBC儲存方式。 先從RAM儲存方式開始說起  目錄 Jar包依賴 quartz-config.xml 建立jobDetail 依賴org.springframewor

[java]spring整合quartz定時任務

quartz適合單系統定時任務,分散式不適合,廢話少說開始 使用 1. <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz<

spring整合quartz

引入maven依賴 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&

Spring整合Quartz實現動態定時器

一、版本說明  spring3.1以下的版本必須使用quartz1.x系列,3.1以上的版本才支援quartz 2.x,不然會出錯。  原因:spring對於quartz的支援實現,org.springframework.scheduling.quartz.CronTri

Spring整合Quartz分散式排程

前言 為了保證應用的高可用和高併發性,一般都會部署多個節點;對於定時任務,如果每個節點都執行自己的定時任務,一方面耗費了系統資源,另一方面有些任務多次執行,可能引發應用邏輯問題,所以需要一個分散式的排程系統,來協調每個節點執行定時任務。 Spring整合Quartz Q