1. 程式人生 > >Spring定時器在SSH框架中的應用

Spring定時器在SSH框架中的應用

---Spring排程任務


本課題參考自《Spring in action》。並非應用系統中發生的所有事情都是由使用者的動作引起的。有時候,系統自己也需要發起一些動作。例如,集抄系統每天早上六點把抄表資料傳送給營銷系統。我們有兩種選擇:或者是每天由使用者手動出發任務,或者讓應用系統中按照預定的計劃自動執行任務。

在Spring中有兩種流行配置:Java的Timer類和OpenSymphony的Quartz來執行排程任務。下面以給商丘做的介面集抄900到中間庫的日凍結資料傳輸為例:

1.     Java Timer排程器
首先定義一個定時器任務,繼承java.util.TimerTask類實現run方法

import java.util.TimerTask;

importxj.service.IJdbc1Service;

importxj.service.IJdbc2Service;
publicclass DayDataTimerTask extends TimerTask{

private IJdbc2Service jdbc2Service=null;

private IJdbc1Service jdbc1Service=null;

publicvoid run(){

SimpleDateFormatdf=new SimpleDateFormat("yyyy-MM-ddHH:mm:ss"

);

System.out.println("日凍結轉接任務開始時間:"+df.format(Calendar.getInstance().getTime()));

System.out.println("日凍結轉接任務結束時間:"+df.format(Calendar.getInstance().getTime()));

}

//通過set方法獲取service服務,如果沒有該方法,則為null

publicvoidsetJdbc2Service(IJdbc2Service jdbc2Service) {

this.jdbc2Service = jdbc2Service;

}

publicvoid

setJdbc1Service(IJdbc1Service jdbc1Service) {

this.jdbc1Service = jdbc1Service;

}

}

Run()方法定義了當任務執行時該做什麼。jdbc1Service,jdbc2Service通過依賴注入的方式提供給DayDataTimerTask。如果該任務中沒有service服務的set方法,則取到的該service服務為null。
其次,在Spring配置檔案中宣告 dayDataTimerTask

<!-- 宣告定時器任務 -->

<bean id="dayDataTimerJob"class="xj.action.DayDataTimerTask">

<property name="jdbc1Service">

<ref bean="jdbc1Service"/>

</property>

<property name="jdbc2Service">

<ref bean="jdbc2Service"/>

</property>

</bean>

該宣告將DayDataTimerTask放到應用上下文中,並在jdbc1Service、jdbc2Service屬性中分別裝配jdbc1Service、jdbc2Service。在排程它之前,它不會做任何事情。

<!-- 排程定時器任務 -->

<bean id="scheduledDayDataTimerJob"class="org.springframework.scheduling.timer.ScheduledTimerTask">

<property name="timerTask">

<ref bean="dayDataTimerJob"/>

</property>

<property name="delay">

<value>3000</value>

</property>

<property name="period">

<value>864000000</value>

</property>

</bean>

屬性timerTask告訴ScheduledTimerTask執行哪個TimerTask。再次,該屬性裝配了指向scheduledDayDataTimerJob的一個引用,它就是DayDataTimerTask。屬性period告訴ScheduledTimerTask以怎樣的頻度呼叫TimerTask的run()方法。該屬性以毫秒作為單位,它被設定為864000000,指定這個任務應該每24小時執行一次。屬性delay允許你指定當任務第一次執行之前應該等待多久。在此指定DayDataTimerTask的第一次執行相對於應用程式的啟動時間延遲3秒鐘。

<!-- 啟動定時器 -->

<bean class="org.springframework.scheduling.timer.TimerFactoryBean">

<property name="scheduledTimerTasks">

<list>

<ref bean="scheduledDayDataTimerJob"/>

</list>

</property>

</bean>

SpringTimerFactoryBean負責啟動定時任務。屬性scheduledTimerTasks要求一個需要啟動的定時器任務的列表。在此只包含一個指向scheduledDayDataTimerJob的引用。
    Java Timer只能指定任務執行的頻度,但無法精確指定它何時執行,這是它的一個侷限性。要想精確指定任務的啟動時間,就需要使用Quartz[kwɔ:ts]排程器。
2.Quartz排程器

Quartz排程器不僅可以定義每隔多少毫秒執行一個工作,還允許你排程一個工作在某個特定的時間或日期執行。
首先建立一個工作,繼承QuartzJobBean類實現executeInternal方法

importorg.quartz.JobExecutionContext;

importorg.quartz.JobExecutionException;

importorg.springframework.dao.DataIntegrityViolationException;

importorg.springframework.scheduling.quartz.QuartzJobBean;

importxj.service.IJdbc1Service;

import xj.service.IJdbc2Service;

publicclass DayDataQuartzTask extends QuartzJobBean{

private IJdbc2Service jdbc2Service=null;

private IJdbc1Service jdbc1Service=null;

protectedvoidexecuteInternal(JobExecutionContext context) throwsJobExecutionException{

SimpleDateFormatdf=new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");

System.out.println("日凍結轉接任務開始時間:"+df.format(Calendar.getInstance().getTime()));

System.out.println("日凍結轉接任務結束時間:"+df.format(Calendar.getInstance().getTime()));

}

//通過set方法獲取service服務,如果沒有該方法,則為null

publicvoidsetJdbc2Service(IJdbc2Service jdbc2Service) {

this.jdbc2Service = jdbc2Service;

}

publicvoid setJdbc1Service(IJdbc1Servicejdbc1Service) {

this.jdbc1Service = jdbc1Service;

}

}


在Spring配置檔案中按照以下方式宣告這個工作:

<!-- 定時啟動任務 Quartz-->

<!宣告工作-->

<bean id="dayDataJob"class="org.springframework.scheduling.quartz.JobDetailBean">

<property name="jobClass">

<value>xj.action.DayDataQuartzTask</value>

</property>

<property name="jobDataAsMap">

<map>

<entry key="jdbc1Service">

<ref bean="jdbc1Service"/>

</entry>

<entry key="jdbc2Service">

<ref bean="jdbc2Service"/>

</entry>

</map>

    </property>

</bean>

Quartz的org.quartz.Trigger類描述了何時及以怎樣的頻度執行一個Quartz工作。Spring提供了兩個觸發器SimpleTriggerBean和CronTriggerBean。SimpleTriggerBean與scheduledTimerTasks類似。指定工作的執行頻度,模仿scheduledTimerTasks配置。

<!-- 排程Simple工作 -->

<bean id="simpleDayDataJobTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean">

<property name="jobDetail">

<ref bean="dayDataJob"/>

</property>

<property name="startDelay">

<value>1000</value>

</property>

<property name="repeatInterval">

<value>86400000</value>

</property>

</bean>

<!排程cron工作-->

<bean id="dayDataJobTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">

<property name="jobDetail">

<ref bean="dayDataJob"/>

</property>

<property name="cronExpression">

<value>0 30 2 * * ?</value>

</property>

</bean>

一個cron表示式有6個或7個由空格分隔的時間元素。從左至右,這些元素的定義如下:1、秒(0-59);2、分(0-59);3、小時(0-23);4、月份中的日期(1-31);5、月份(1-12或JAN-DEC);6、星期中的日期(1-7或SUN-SAT);7、年份(1970-2099)。

每一個元素都可以顯式地規定一個值(如6),一個區間(如9-12),一個列表(如9,11,13)或一個萬用字元(如*)。“月份中的日期”和“星期中的日期”這兩個元素互斥,應該通過設定一個問號(?)來表明你不想設定的那個欄位。

我們在此定義該任務在每天凌晨兩點半開始啟動。

<!啟動工作-->

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

<property name="triggers">

<list>

<refbean="simpleDayDataJobTrigger"/>

<ref bean="dayDataJobTrigger"/>

</list>

</property>

</bean>

屬性triggers接受一組觸發器,在此只裝配包含simpleDayDataJobTrigger bea和dayDataJobTriggerbean的一個引用列表。

相關推薦

Spring定時SSH框架應用

---Spring排程任務 本課題參考自《Spring in action》。並非應用系統中發生的所有事情都是由使用者的動作引起的。有時候,系統自己也需要發起一些動作。例如,集抄系統每天早上六點把抄表資料傳送給營銷系統。我們有兩種選擇:或者是每天由使用者手動出發任務,或者

spring框架定時的配置及應用

首先我們來簡單瞭解下定時器:  1. 定時器的作用             在實際的開發中,如果專案中需要定時執行或者需要重複執行一定的工作,定時器

spring定時時間表達式 Quartz時間表達式的設定

Quartz中時間表達式的設定-----corn表示式 時間格式: <!-- s m h d m w(?) y(?) -->,   分別對應: 秒>分>小時>日>月>周>年,  舉例: 1.每天什麼時候執行:   

Java定時 spring定時及cron表示式(quartz時間表達式)

 spring定時器及cron表示式(quartz中時間表達式) 在Spring中有兩種流行配置:Java的Timer類和OpenSymphony的Quartz。 1.Java Timer定時 首先繼承java.util.TimerTask類實現run方法 i

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

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

Spring 定時應用及表示式解釋

先看applicationContext.xml下面的beans <!-- Trigger --> <bean id="autoJob" class="com.spring.app.AutoJob" /> <bean id="auto

SSH框架NoSuchMethodError: antlr.collections.AST.getLine()的解決方案

重啟 ges etl loading clip comm err () method 問題: 當配置好SSH框架後,使用Hibernate的Query功能時發生如下異常: NoSuchMethodError: antlr.collections.AST.getLine()

ssh框架文保存數據庫MySQL亂碼

nco encoding -- 檢查 character spa utf8 cal rip 檢查後臺獲取前端頁面數據打印到console控制臺無亂碼:tomcat配置沒有問題; 檢查MySQL數據庫編碼設置:字符集:utf8 -- UTF-8 Unicode,排序規則:ut

Spring定時註解配置

springmvc imp blog oca -c ann type conf utf-8 spring-task.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.s

spring定時時間設置規則

ref 結束 第一個 可選 -h quartz days 只需要 數值 單純針對時間的設置規則org.springframework.scheduling.quartz.CronTriggerBean允許你更精確地控制任務的運行時間,只需要設置其cronExpression

自定義spring定時

() spl public == integer service upd imei second package com.wjz.quartz; import java.util.concurrent.Executors; public class QuartzDem

Spring.net介紹及MVC應用

text name default 轉變 業務層 核心 解耦 inf star Spring.net兩大核心內容: IOC(控制反轉) 傳統的面相對象思維模式是對象A依賴對象B,對象B的實例化和調用都在對象A中發生,一旦對象B中發生變化,對象A也要隨之變化,這樣使得

java定時無法自動註入的問題解析(原來Spring定時可以這樣註入service)

nco 方法註入 數據庫的操作 div end pub spring定時器 ext 發現 近些日子在做一個項目,在項目中需要用到spring的定時任務,但是在操作數據庫的時候發現總是不能正確的進行數據的插入,經過查看才發現:是因為service層不能夠通過普通的方法註入到a

SSH框架hibernate 出現 user is not mapped 問題

eat and lis pub dao col 自己 return alc SSH框架中hibernate 出現 user is not mapped 問題 在做SSH框架整合時,在進行DAO操作時。這裏就只調用了chekUser()方法。運行時報 us

定時setTimeout/setInterval變量報錯:not defined 的解決方法

span cor .com ldo href log bug 上下 指正 首先聲明本人資質尚淺,如有錯誤,歡迎指正、共同提高。 -------------------------------------------------------------------------

Spring 定時schedule實現

執行 掃描 clearing process obj after ice wait code 註解方式: 核心類摘要: 1.ScheduledAnnotationBeanPostProcessor 2.ScheduledTaskRegistrar 3.TaskSchedul

一篇文章搞定你的spring定時

Cron表示式是一個字串,字串以5或6個空格隔開,分開工6或7個域,每一個域代表一個含義,Cron有如下兩種語法 格式: Seconds Minutes Hours DayofMonth Month DayofWeek Year 或 Seconds Minutes Hours DayofMo

動態代理在RPC框架應用

例項 1.第一個例項取自黃勇的輕量級分散式 RPC 框架demo(https://gitee.com/huangyong/rpc) ,由於實現中通訊框架使用了Netty,所以在分析中會有部分Netty程式碼的資訊,不過不用擔心,即使不懂Netty,講解的過程中會盡量避免,並會突出反射與動態代理在

Spring定時-註解

1、配置applicationContent.xml 加入 xmlns:task="http://www.springframework.org/schema/task"  xsi:schemaLocation中新增     &nb

spring定時使用註解@Scheduled執行任務,fixedDelay、fixedRate和cron區別

 註解@Scheduled 可以作為一個觸發源新增到一個方法中,例如,以下的方法將以一個固定延遲時間5秒鐘呼叫一次執行,這個週期是以上一個呼叫任務的 完成時間 為基準,在上一個任務完成之後,5s後再次執行: