Java中JOB介紹與Spring中JOB的配置
在實際的開發中,如果專案中需要定時執行或者需要重複執行一定的工作,定時器顯現的尤為重要。
當然如果我們不瞭解定時器就會用執行緒去實現,例如:
package org.lzstone.action
public class FinanceAction extends Thread{
private Date date;
public void run{
try{
while(true){
Thread.sleep((int)(Math.random()*1000));
date = new Date();
//定時執行任務
}
}catch(Exception e){
e.printStackTrace();
}
}
}
自己實現定時器的工作很複雜,如果實現不好佔用記憶體過多,系統就此Over,所以處理定時執行或者重複執行的任務,定時器是很好的選擇
2.java中常見的定時器
1)藉助Java.util.Timer來實現
2)OpenSymphony社群提供的Quartz來實現
3.介紹Timer
利用Timer開發定時任務是主要分為兩個步驟:
1)建立定時任務類
示例程式碼:
package org.lzstone.action
import java.util.TimeTask
public class LzstoneTimeTask extends TimeTask{
public void run(){
//執行的定時器任務
}
}
2)執行定時任務,執行定時任務分為兩種方式:
2.1)程式直接啟動
示例程式碼:
package org.lzstone.action
public class LzstoneMain{
.......
public void run(){
//執行定時器的任務
//建立例項
Timer timer = new Timer();
引數:
new LzstoneTimeTask()- 所要安排的任務。
0- 執行任務前的延遲時間,單位是毫秒。
1*1000- 執行各後續任務之間的時間間隔,單位是毫秒。
timer.schedule(new LzstoneTimeTask(),0,1*1000);
}
}
2.2)web監聽方式
示例程式碼:
package org.lzstone.action
public class LzstoneMain implements ServletContextListener{
private Timer timer = null;
//初始化監聽器,建立例項,執行任務
public void contextInitialized(ServletContextEvent event){
timer = new Timer();
timer.schedule(new LzstoneTimeTask(),0,1*1000);
}
//銷燬監聽器,停止執行任務
public void contextDestroyed(ServletContextEvent event){
//注意,在此計時器呼叫的計時器任務的 run 方法內呼叫此方法,就可以絕對確保正在執行的任務是此計時器所執行的最後一個任務。
timer.cancel();
}
}
web.xml配置
<listener>
<listener-class>
org.lzstone.action.LzstoneMain
</listener-class>
</listener>
4. 介紹Quartz
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源專案,可以用來建立簡單或者複雜的定時任務,利用Quartz開發定時任務的步驟與Timer類
似。
利用Quartz開發定時任務是主要分為兩個步驟:
1)建立定時任務類
示例程式碼:
package org.lzstone.action
public class LzstoneTimeTask implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException{
//執行的定時器任務
}
}
2)執行定時任務,執行定時任務分為兩種方式:
2.1)程式直接啟動,建立任務排程器及配置相應的任務計劃
示例程式碼:
package org.lzstone.action
public class LzstoneMain{
private static Scheduler sched;
public static void run() throws Exception{
//建立LzstoneTimeTask的定時任務
JobDetail jobDetail = new JobDetail("lzstoneJob",sched.DEFAULT_GROUP,LzstoneTimeTask.class);
//目標 建立任務計劃
CronTrigger trigger = new CronTrigger("lzstoneTrigger","lzstone","0 0 12 * * ?");
//0 0 12 * * ? 代表每天的中午12點觸發
sched = new org.quartz.impl.StdSchedulerFactory().getScheduler();
sched.scheduleJob(jobDetail,trigger);
sched.start();
}
//停止
public static void stop() throws Exception{
sched.shutdown();
}
}
//執行
public class Main{
.............
public void run(){
LzstoneMain.run();
}
............
}
2.2)web監聽方式
示例程式碼:
package org.lzstone.action
public class LzstoneMainListener implements ServletContextListener{
private Timer timer = null;
//初始化監聽器,建立例項,執行任務
public void contextInitialized(ServletContextEvent event){
LzstoneMain.run();
}
//銷燬監聽器,停止執行任務
public void contextDestroyed(ServletContextEvent event){
LzstoneMain.stop();
}
}
web.xml配置
<listener>
<listener-class>
org.lzstone.action.LzstoneMainListener
</listener-class>
</listener>
5.對比
Timer方式實現定時器,原理簡單,實現方便,在執行簡單的任務比較方便,不足之處是無法確定執行時間,並且依賴性比較強,必須繼承指定的類
Quartz方式實現定時器,方便,清晰指定啟動時間,定時引數比較靈活,容易實現比較複雜的定時任務,不足之處是需要實現特定介面,載入其框架
兩種方式各有優缺點,在特定場合可以根據其特點選擇使用。
6.Spring定時任務
Spring定時任務對Timer與Quartz都提供了支援,並且實現步驟基本一樣
首先配置Spring對Timer的支援
1.1 建立定時任務類
package org.lzstone.action
import java.util.TimeTask
public class LzstoneTimeTask extends TimeTask{
public void run(){
//執行的定時器任務
}
}
1.2 註冊定時任務類,配置任務計劃與任務排程器
在專案的WEB-INF下面建立TimerConfig.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean>
<!--註冊定時執行任務實體-->
<bean id="lzstoneTimeTask" class="org.lzstone.action.LzstoneTimeTask"/>
<!--註冊定時器資訊-->
<bean id="taskInfo" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!--第一次執行任務前需要等待的時間,這裡設定為3秒-->
<property name="delay">
<value>3000</value>
</property>
<!--設定任務的執行週期 這裡設定為4秒-->
<property name="period">
<value>4000</value>
</property>
<!--設定具體執行的任務 這裡設定為lzstoneTimeTask-->
<property name="timerTask">
<ref local="lzstoneTimeTask"/>
</property>
</bean>
<!--配置定時器任務的排程器-->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<!--註冊定時器列表-->
<property name="scheduledTimerTasks">
<list>
<ref local="taskInfo"/>
........
</list>
</property>
</bean>
</beans>
1.3 web專案中的啟動設定
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/TimerConfig.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
配置Spring對Quartz的支援
2.1 建立定時任務類
package org.lzstone.action
public class LzstoneQuartzTask{
public void execute(){
//執行的定時器任務
}
}
2.2 註冊定時任務類,配置任務計劃與任務排程器
在專案的WEB-INF下面建立QuartzConfig.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean>
<!--註冊定時執行任務實體-->
<bean id="lzstoneQuartzTask" class="org.lzstone.action.LzstoneQuartzTask"/>
<!--註冊定時器資訊-->
<bean id="taskInfo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--指定要執行的定時任務類 這裡是LzstoneQuartzTask-->
<property name="targetObject">
<ref local="lzstoneQuartzTask"/>
</property>
<!--指定定時器任務類要執行的方法名稱 這裡是execute-->
<property name="targetMethod">
<value>execute</value>
</property>
</bean>
<!--配置定時器任務的排程器-->
<bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!--宣告要執行的實體-->
<property name="jobDetail">
<ref local="taskInfo"/>
</property>
<!--設定執行時間-->
<property name="cronExpression">
<value>0 0 12 * * ?</value>
</property>
</bean>
<!--註冊監聽器-->
<bean id="registerQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--註冊定時器實體 集合-->
<property name="triggers">
<list>
<ref local="quartzTrigger"/>
</list>
</property>
</bean>
</beans>
2.3 web專案中的啟動設定
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/QuartzConfig.xml</param-value>
</context-param>
相關推薦
Java中JOB介紹與Spring中JOB的配置
1定時器的作用 在實際的開發中,如果專案中需要定時執行或者需要重複執行一定的工作,定時器顯現的尤為重要。 當然如果我們不瞭解定時器就會用執行緒去實現,例如: package org.lzstone.action public class FinanceAction extends Thread{
定時器的實現、java定時器介紹與Spring中定時器的配置
1定時器的作用 在實際的開發中,如果專案中需要定時執行或者需要重複執行一定的工作,定時器顯現的尤為重要。 當然如果我們不瞭解定時器就會用執行緒去實現,例如: package org.lzstone.action public class FinanceAction exte
定時器的實現、java定時器Timer和Quartz介紹與Spring中定時器的配置
欄位 允許值 允許的特殊字元 秒 0-59 , - * / 分 0-59 , - * / 小時 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - *
java中的代理模式與spring中的AOP
1.java的代理模式 代理(proxy)是一種設計模式,是屬於23種常見設計模式中的一種。談到設計模式,我們首先想到的是設計模式的幾大原則,其中談論最多的還是單一職責和開閉原則,代理模式實現了對目標物件其他的訪問方式,即通過代理物件(proxy)訪問目標物件
Tomcat與Spring中的事件機制詳解
Tomcat與Spring中的事件機制詳解 引言 最近在看tomcat原始碼,原始碼中出現了大量事件訊息,可以說整個tomcat的啟動流程都可以通過事件派發機制串起來,研究透了tomcat的各種事件訊息,基本上對tomcat的啟動流程也就有了一個整體的認識。在這一基礎上,聯想到之前在看spr
JavaBean,POJO的簡單理解 ,JavaBean與Spring中bean的區別
本文是我查閱多篇部落格總結下來的,不過有些概念可能理解還不夠準確,歡迎大家糾錯改正。 Java的一個特性,資料與行為相分離。資料就是成員變數,行為就是setter和getter方法 JavaBean是Java中開發的可以跨平臺的重要元件,在JSP中常用來 封裝業務邏輯
spring mvc中applicationContext.xml與spring-mvc.xml的關係
前言 本文參考了: 值得注意的是,【【Spring】淺談ContextLoaderListener及其上下文與DispatcherServlet的區別】中闡述了contextLoaderListener和dispatcherServlet的關係, co
Quartz與Spring整合 Job如何自動注入Spring容器託管的物件
package org.springframework.scheduling.quartz; import java.lang.reflect.Method; import org.quartz.Job; import org.quartz.Scheduler; import org.quartz.S
傳統javabean與spring中的bean的區別
用處不同:傳統javabean更多地作為值傳遞引數,而spring中的bean用處幾乎無處不在,任何元件都可以被稱為bean。 寫法不同:傳統javabean作為值物件,要求每個屬性都提供getter和setter方法;但spring中的bean只需為接受設值注入的屬性提供
webservice之cxf實現[web專案中基於maven與spring整合]
webservice現開發的已實現元件不少,使用過的就有xfire及cxf. cxc基於maven與spring整合過程如下: STEP 1. 依賴包新增 在pom.xml檔案的標籤中增加如下(版本號依個人需要調整): <depende
java中的final與C++中的const的區別
(1)final在java中定義常量,可作用於基本型別或者類型別,若是作用於類型別,則此類型別不能作為父類被繼承,也就是說它的下面不能有子類,這樣的類叫做原子類。 C++中的const定義常量,(2)Java中的final如果是對於基本型別,那和C++ const是
Mockito與Spring中@Autowired與@InjectMocks組合
@InjectMocks @Autowired private TestClass testClass; @Mock private TestClassPropert
Spring框架中context-param與servlet中init-param的contextConfigLocation的區別
積累,小白也可成為大神 最近在使用spring這一個框架做定時任務的時候,發現一個問題。當我們不在瀏覽器中呼叫一下我們的介面,是不會自動執行定時檔案的,這個原因是什麼呢?剛開始的時候,使我費解了很長事件,不知道問題出現再哪裡。但是當冷靜下來思考一下的時
Windows中 RabbitMQ安裝與環境變量配置
-s 雙擊 來安 環境 style lang 頁面 files 基礎上 RabbitMQ是一個在AMQP基礎上完整的,可復用的企業消息系統。他遵循Mozilla Public License開源協議。 1:安裝RabbitMQ需要先安裝Erlang語言開發包。下載地址 h
javaScript中的onclick與jquery中的click區別
mce 上下 要點 let 怎樣 報錯 ron n) 屬性 來來來,先看一個例子: html部分,定義幾個按鈕 <div class="carousel-btn"> <button class="btn"></button>
Win10環境中安裝Python2與python3,並配置TensorFlow環境
安裝前需要知道的知識是: 1.TensorFlow只支援Python3版本 2.Python2與Python3他們預設的.exe執行檔案,名字均為:python.exe。要使他們共存必須要對他們的名字修改,否則,在win10命令框中,輸入Python命令時,會報錯“不是內部指令”。 3.安裝
虛擬機器下ubuntu中檔案實現與windows中檔案共享
第一步 在Ubuntu選單上選擇VM->install VMware tools。然後出現VMware tools的安裝壓縮包檔案VMwareTools-9.2.0-799703.tar.gz。 第二步 可以先將該壓縮檔案複製到主資料夾下,然後解壓tar.gz
c中的const與c++中的const
c中的const是一個偽只讀識別符號。 #include <stdio.h> #include <stdlib.h> int main() { const int a = 10; int *p = &a; *p = 20;
記錄一下我的windows上的phpstorm中的thinkphp5與xdebugger的除錯配置問題
常規教程不多說 1.下載對應的xdebbger並放在適當位置 2.配置phpstorm中的server,如埠等 3.配置php.ini檔案 此處有兩個重點: 1是php.ini
撩課-Java-Intellij Idea介紹與安裝
idea介紹: IDEA 全稱 IntelliJ IDEA,是java語言開發整合環境 IntelliJ在業界被公認為最好的java開發工具之一 IDEA是JetBrains公司的產品 優點: 智慧程式碼助手、重構、J2EE支援、 各類版本工具(git、svn、github等)