<!--StartFragment-->
一、 新建 quartz 工程
新建 java 工程 IsmpQuartz ,在 build path 中加入用戶庫 quartz15 (我們使用 quartz1.5 版本),其中有 commons-beanutils.jar 、 commons-collections-3.1.jar 、 commons-digester-1.7.jar 、 commons-logging.jar 、 quartz-1.5.0.jar 、 log4j-1.2.11.jar 六個 jar 包。
二、 配置 log4j
在 src 目錄下新建 log4j.properties ,內容:
# Create stdout appender
log4j.rootLogger= error, stdout
# Configure the stdout appender to go to the Console
log4j.appender.stdout= org.apache.log4j.ConsoleAppender
# Configure stdout appender to use the PatternLayout
log4j.appender.stdout.layout= org.apache.log4j.PatternLayout
# Pattern output the caller's filename and line #
log4j.appender.stdout.layout.ConversionPattern= %5p [%t] (%F/ : %L) - %m%n
# Print messages of level INFO or above for examples
log4j.logger.ydtf.quartz=info,stdout
注意最后一句,我們定義一個名為 ydtf.quartz 的 logger (日志器),其日志級別定為 info (及以上), appender (輸出方式)為 stdout (即控制臺),這樣以 ydtf.quartz 包下的類名來獲取 logger (日志器)時,只有 info 以上級別(包括 error )才可以使用 log4j 。
對于根日志器,我們過濾了 error 以下級別的輸出,因為 quartz 自己輸出的 info 級別和 debug 級別的信息實在太多,我們不得不過濾掉。
此外,需要注意對于 stdout 這樣的輸出方式,我們專門為它設計了一個輸出模板:
%5p 表示輸出占 5 個字符的優先級,即 error 、 info 等字樣
[%t] 表示輸出線程名并用中括號括住 , 即 [xxxx.class] 等字樣
(%F/:%L) 表示輸出“類名:行號”信息,并用圓括號括住
%m%n 表示輸出信息內容,最后以回車符結束
* 注,如果 log4j 出現重復輸出的情況,比如下面,每次消息都打印兩次:
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:585pt; height:50pt'> <v:imagedata src="file://localhost/Users/kmyhy/Library/Caches/TemporaryItems/msoclip/0/clip_image001.png" mce_src="file://localhost/Users/kmyhy/Library/Caches/TemporaryItems/msoclip/0/clip_image001.png" o:title="" /> </v:shape><![endif]-->
這并不是工作線程被同時執行了兩次,而是 log4j 對一條信息進行了重復輸出。請在 log4j.properties 的最后加上此句:
log4j.additivity.ydtf.quartz=false
即可消除重復輸出問題。
三、 書寫工作線程
新建類 SyncServiceConsumeJob, 實現 Job 接口:
package ydtf.quartz;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class SyncServiceConsumeJob implements Job{
static Log logger = LogFactory. getLog (SyncServiceConsumeJob. class );
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobDetail jobDetail = context.getJobDetail();
// The name is defined in the job definition
String jobName = jobDetail.getName();
// The directory to scan is stored in the job map
JobDataMap dataMap = jobDetail.getJobDataMap();
String doSth = dataMap.getString( "DO_SOMETHING" );
// Log the time the job started
logger .info(jobName + " " +doSth+ " at " + new Date());
}
}
四、 書寫調度器
調度器是一個主線程,由他來啟動 Scheduler 實例(由 quartz 實現,它會啟動指定的工作線程):
package ydtf.quartz;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
public class SimpleScheduler {
static Log logger = LogFactory. getLog (SimpleScheduler. class );
public static void main(String[] args) {
SimpleScheduler simple = new SimpleScheduler();
simple.startScheduler();
}
public void startScheduler() {
Scheduler scheduler = null ;
try {
// Get a Scheduler instance from the Factory
scheduler = StdSchedulerFactory. getDefaultScheduler ();
// Start the scheduler
scheduler.start();
logger .info( "Scheduler started at " + new Date());
} catch (SchedulerException ex) {
// deal with any exceptions
logger .error(ex);
}
}
}
五、 配置 quartz 的工作方式 quartz.properties
在 src 目錄下新建 quartz.properties 文件如下:
#===============================================================
#Configure Main Scheduler Properties
#===============================================================
org.quartz.scheduler.instanceName = QuartzScheduler # 指定調度器實例名
org.quartz.scheduler.instanceId = AUTO # 指定實例 id 自動分配
#===============================================================
#Configure ThreadPool
#===============================================================
org.quartz.threadPool.threadCount = 1 # 線程的線程數 1 ,即單線程
org.quartz.threadPool.threadPriority = 5 # 線程優先級 1-10 之間
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool# 線程池實現類
#===============================================================
#Configure JobStore
#===============================================================
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore#Job 存儲在內存中
#===============================================================
#Configure Plugins
#===============================================================
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin# 該插件使用 quartz_jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.validating= false
六、 配置 job , quartz_jobs.xml
<? xml version = '1.0' encoding = 'gbk' ?>
< quartz >
< job >
< job-detail >
< name > SyncServiceConsumeJob </ name >
< group > DEFAULT </ group >
< description >
同步業務執行消息
</ description >
< job-class >
ydtf.quartz.SyncServiceConsumeJob
</ job-class >
< volatility > false </ volatility >
< durability > false </ durability >
< recover > false </ recover >
< job-data-map allows-transient-data = "true" >
< entry >
< key > DO_SOMETHING </ key >
< value > 同步業務執行消息 </ value >
</ entry >
</ job-data-map >
</ job-detail >
< trigger >
< simple >
< name > Trigger1 </ name >
< group > DEFAULT </ group >
< job-name > SyncServiceConsumeJob </ job-name >
< job-group > DEFAULT </ job-group >
< start-time > 2009-08-27T1:00:00 </ start-time >
<!-- 每 10 秒無限循環 -->
< repeat-count > -1 </ repeat-count >
< repeat-interval > 10000 </ repeat-interval >
</ simple >
</ trigger >
</ job >
</ quartz >
七、 以 run as java application 方式運行 SimpleScheduler 。
總結:
1、 導入 quartz 所需的包( 6 個)
2、 配置 log4j.properties
3、 編寫 job 類
4、 編寫 Scheduler 類
5、 配置 quartz.properties
6、 配置 quartz_jobs.xml
<!--EndFragment-->
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
