一、新建quartz工程新建java工程IsmpQuartz,在buildpath中加入用戶庫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包" />

黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Quartz簡明教程

系統 1896 0

<!--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-->

Quartz簡明教程


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論