Quartz的使用與持久化(springboot整合)

一、什么是Quartz

點(diǎn)擊查看quartz_demo_github

Quartz是OpenSymphony開(kāi)源組織在Job scheduling領(lǐng)域又一個(gè)開(kāi)源項(xiàng)目,它可以與J2EE與J2SE應(yīng)用程序相結(jié)合也可以單獨(dú)使用。Quartz可以用來(lái)創(chuàng)建簡(jiǎn)單或?yàn)檫\(yùn)行十個(gè),百個(gè),甚至是好幾萬(wàn)個(gè)Jobs這樣復(fù)雜的程序。Jobs可以做成標(biāo)準(zhǔn)的Java組件或 EJBs碎绎。

這個(gè)是百度百科給的解釋, 好像解釋的也不是很清楚;
Quartz是對(duì)定時(shí)器的封裝, 里面用他可以實(shí)現(xiàn)各種需求的定時(shí)任務(wù), 因?yàn)樗袕?qiáng)大的cron表達(dá)式; 并且可以對(duì)定時(shí)任務(wù)進(jìn)行持久化;

二、整合Quartz

1.創(chuàng)建springboot項(xiàng)目,

這里要求會(huì)用springboot項(xiàng)目, 如果還不會(huì),可以百度下,也可以去B站找相關(guān)教學(xué)視頻;

2.添加Quartz依賴

<!--springboot-quartz-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
<!--Quartz 使用的連接池  這里Quartz在持久化任務(wù)時(shí)使用該jar-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

3.編寫配置類

package cn.cooplan.quartz;

import org.quartz.Scheduler;
import org.quartz.ee.servlet.QuartzInitializerListener;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import java.io.IOException;
import java.util.Properties;

/**
 * Qartz配置, 搭配quartz.properties文件自定義配置, 該處目的使定時(shí)任務(wù)持久化
 */
@Configuration
public class SchedulerConfig {

    /**
     * 讀取quartz.properties 文件
     * 將值初始化
     * @return
     */
    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }

    /**
     * 將配置文件的數(shù)據(jù)加載到SchedulerFactoryBean中
     * @return
     * @throws IOException
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setQuartzProperties(quartzProperties());
        return schedulerFactoryBean;
    }

    /**
     * 初始化監(jiān)聽(tīng)器
     * @return
     */
    @Bean
    public QuartzInitializerListener executorListener(){
        return new QuartzInitializerListener();
    }

    /**
     * 獲得Scheduler 對(duì)象
     * @return
     * @throws IOException
     */
    @Bean
    public Scheduler scheduler() throws IOException {
        return schedulerFactoryBean().getScheduler();
    }
}

4.編寫quartz.properties配置文件

# 實(shí)例化ThreadPool時(shí)抗果,使用的線程類為SimpleThreadPool
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# threadCount和threadPriority將以setter的形式注入ThreadPool實(shí)例
# 并發(fā)個(gè)數(shù)
org.quartz.threadPool.threadCount = 5
# 優(yōu)先級(jí)
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 5000
#持久化使用的類
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#數(shù)據(jù)庫(kù)中表的前綴
org.quartz.jobStore.tablePrefix = QRTZ_
#數(shù)據(jù)源命名
org.quartz.jobStore.dataSource = qzDS
#qzDS 數(shù)據(jù)源
org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL = jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8
org.quartz.dataSource.qzDS.user = root
org.quartz.dataSource.qzDS.password = root
org.quartz.dataSource.qzDS.maxConnections = 10

5.創(chuàng)建Quartz持久化數(shù)據(jù)的表

這些都是固定的表, 復(fù)制粘貼就好了,以下sql適用于Mysql數(shù)據(jù)庫(kù);
其他數(shù)據(jù)庫(kù)sql, 請(qǐng)從Quartz的jar包:org/quartz/impl/jdbcjobstore路徑下尋找sql文件

1.qrtz_blob_triggers : 以Blob 類型存儲(chǔ)的觸發(fā)器筋帖。
2.qrtz_calendars:存放日歷信息, quartz可配置一個(gè)日歷來(lái)指定一個(gè)時(shí)間范圍冤馏。
3.qrtz_cron_triggers:存放cron類型的觸發(fā)器日麸。
4.qrtz_fired_triggers:存放已觸發(fā)的觸發(fā)器。
5.qrtz_job_details:存放一個(gè)jobDetail信息逮光。
6.qrtz_job_listeners:job監(jiān)聽(tīng)器代箭。
7.qrtz_locks: 存儲(chǔ)程序的悲觀鎖的信息(假如使用了悲觀鎖)。
8.qrtz_paused_trigger_graps:存放暫停掉的觸發(fā)器涕刚。
9.qrtz_scheduler_state:調(diào)度器狀態(tài)嗡综。
10.qrtz_simple_triggers:簡(jiǎn)單觸發(fā)器的信息。
11.qrtz_trigger_listeners:觸發(fā)器監(jiān)聽(tīng)器杜漠。
12.qrtz_triggers:觸發(fā)器的基本信息极景。

DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;

CREATE TABLE QRTZ_JOB_DETAILS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
    IS_DURABLE VARCHAR(1) NOT NULL,
    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);

CREATE TABLE QRTZ_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    NEXT_FIRE_TIME BIGINT(13) NULL,
    PREV_FIRE_TIME BIGINT(13) NULL,
    PRIORITY INTEGER NULL,
    TRIGGER_STATE VARCHAR(16) NOT NULL,
    TRIGGER_TYPE VARCHAR(8) NOT NULL,
    START_TIME BIGINT(13) NOT NULL,
    END_TIME BIGINT(13) NULL,
    CALENDAR_NAME VARCHAR(200) NULL,
    MISFIRE_INSTR SMALLINT(2) NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
        REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);

CREATE TABLE QRTZ_SIMPLE_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    REPEAT_COUNT BIGINT(7) NOT NULL,
    REPEAT_INTERVAL BIGINT(12) NOT NULL,
    TIMES_TRIGGERED BIGINT(10) NOT NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_CRON_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    CRON_EXPRESSION VARCHAR(200) NOT NULL,
    TIME_ZONE_ID VARCHAR(80),
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  (          
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    STR_PROP_1 VARCHAR(512) NULL,
    STR_PROP_2 VARCHAR(512) NULL,
    STR_PROP_3 VARCHAR(512) NULL,
    INT_PROP_1 INT NULL,
    INT_PROP_2 INT NULL,
    LONG_PROP_1 BIGINT NULL,
    LONG_PROP_2 BIGINT NULL,
    DEC_PROP_1 NUMERIC(13,4) NULL,
    DEC_PROP_2 NUMERIC(13,4) NULL,
    BOOL_PROP_1 VARCHAR(1) NULL,
    BOOL_PROP_2 VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_BLOB_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    BLOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_CALENDARS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    CALENDAR_NAME  VARCHAR(200) NOT NULL,
    CALENDAR BLOB NOT NULL,
    PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);

CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_GROUP  VARCHAR(200) NOT NULL, 
    PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_FIRED_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    ENTRY_ID VARCHAR(95) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    INSTANCE_NAME VARCHAR(200) NOT NULL,
    FIRED_TIME BIGINT(13) NOT NULL,
    SCHED_TIME BIGINT(13) NOT NULL,
    PRIORITY INTEGER NOT NULL,
    STATE VARCHAR(16) NOT NULL,
    JOB_NAME VARCHAR(200) NULL,
    JOB_GROUP VARCHAR(200) NULL,
    IS_NONCONCURRENT VARCHAR(1) NULL,
    REQUESTS_RECOVERY VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);

CREATE TABLE QRTZ_SCHEDULER_STATE
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    INSTANCE_NAME VARCHAR(200) NOT NULL,
    LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
    CHECKIN_INTERVAL BIGINT(13) NOT NULL,
    PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);

CREATE TABLE QRTZ_LOCKS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    LOCK_NAME  VARCHAR(40) NOT NULL, 
    PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);


commit;

6.先了解下cron表達(dá)式

cron表達(dá)式生成器
這里先了解下, 下面就直接貼dome代碼了

cron表達(dá)式是一共有7位, 最簡(jiǎn)單的例如: * * * * * * * (每秒執(zhí)行一次) 每個(gè)中間用空格隔開(kāi), 每個(gè)依次代表著: 秒 分 時(shí) 天 月 周 年 ->
{秒數(shù)} {分鐘} {小時(shí)} {日期} {月份} {星期} {年份(可為空)}

cron表達(dá)式.jpg

表達(dá)式舉例
"0 0 12 * * ?" 每天中午12點(diǎn)觸發(fā)
"0 15 10 ? * *" 每天上午10:15觸發(fā)
"0 15 10 * * ?" 每天上午10:15觸發(fā)
"0 15 10 * * ? *" 每天上午10:15觸發(fā)
"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發(fā)
"0 * 14 * * ?" 在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā)
"0 0/5 14 * * ?" 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
"0 0/5 14,18 * * ?" 在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)
"0 0-5 14 * * ?" 在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發(fā)
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發(fā)
"0 15 10 15 * ?" 每月15日上午10:15觸發(fā)
"0 15 10 L * ?" 每月最后一日的上午10:15觸發(fā)
"0 15 10 ? * 6L" 每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? * 6#3" 每月的第三個(gè)星期五上午10:15觸發(fā)

7.一個(gè)簡(jiǎn)單的定時(shí)器例子

a).編寫job實(shí)現(xiàn)類

Job實(shí)現(xiàn)類, 就是定時(shí)任務(wù)的主要邏輯編輯區(qū)

package cn.cooplan.quartz.job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 簡(jiǎn)單的執(zhí)行任務(wù), 打印時(shí)間和你好
 * 實(shí)現(xiàn)接口Job 從寫方法execute
 * 該方法就是你定時(shí)器執(zhí)行任務(wù)的邏輯
 */
public class HiJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String nowTime = simpleDateFormat.format(new Date());
       //這里為了演示, 只進(jìn)行打印
        System.out.println(nowTime + ":你好");
    }
}
b).創(chuàng)建定時(shí)任務(wù)-->創(chuàng)建JobDetail, Trigger, Scheduler

Quartz的三大核心JobDetail, Trigger, Scheduler
JobDetail: 主要加載定時(shí)邏輯實(shí)現(xiàn)的類
Trigger: 主要制定定時(shí)任務(wù)執(zhí)行的規(guī)則
Scheduler:用來(lái)創(chuàng)建定時(shí)任務(wù), 調(diào)度任務(wù). 任務(wù)的增刪改都是由他完成;

package cn.cooplan.quartz.scheduler;

import cn.cooplan.quartz.job.HiJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

/**
 * 使用cron表達(dá)式來(lái)控制任務(wù)
 * 3秒后 每秒執(zhí)行一次
 */
public class CronScheduler {

    public static void cronScheduler() throws SchedulerException {
        /*
         * JobBuilder.newJob(HiJob.class)  --> 創(chuàng)建執(zhí)行的job實(shí)現(xiàn)類
         * withIdentity("j1", "1") 創(chuàng)建該JobDetail 的名字和所在分組 第一個(gè)參數(shù)是名字, 第二個(gè)參數(shù) 分組
         * build()創(chuàng)建對(duì)象
         */
        JobDetail build = JobBuilder.newJob(HiJob.class).withIdentity("j1", "1").build();

        Date date = new Date();
        long startTime = date.getTime() + 3000;

        /*
         * TriggerBuilder.newTrigger() 創(chuàng)建一個(gè)Trigger
         * startAt(new Date(startTime)) 執(zhí)行時(shí)間, 3秒后執(zhí)行
         * withIdentity("t1", "1") Trigger所在的名字和分組,
         * 第一個(gè)參數(shù)是名字, 第二個(gè)參數(shù) 分組,因?yàn)楹蚸ob是倆個(gè)對(duì)象, 名字 分組可以跟job重復(fù)
         * withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")) cron表達(dá)式初始化, 每秒執(zhí)行一次
         * build()創(chuàng)建對(duì)象
         */
        CronTrigger c = TriggerBuilder.newTrigger()
                .startAt(new Date(startTime))
                .withIdentity("t1", "1")
                .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
                .build();
       //創(chuàng)建SchedulerFactory對(duì)象  注意是new的是StdSchedulerFactory Std開(kāi)頭
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        //獲得Scheduler
        Scheduler scheduler = schedulerFactory.getScheduler();
        //設(shè)置調(diào)度 的job 和trigger
        scheduler.scheduleJob(build, c);
        //開(kāi)啟調(diào)度
        scheduler.start();
    }

}
效果圖.jpg

8.數(shù)據(jù)庫(kù)的表用了哪些?

用到的表.jpg

qrtz_cron_triggers :放置啟動(dòng)過(guò)CronTrigger的參數(shù)
qrtz_fired_triggers :存放已觸發(fā)的觸發(fā)器, 每執(zhí)行一次更新一次 FIRED_TIME, SCHED_TIME字段
qrtz_job_details :存放一個(gè)jobDetail信息
qrtz_triggers :觸發(fā)器的基本信息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驾茴,隨后出現(xiàn)的幾起案子盼樟,更是在濱河造成了極大的恐慌,老刑警劉巖锈至,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晨缴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡峡捡,警方通過(guò)查閱死者的電腦和手機(jī)击碗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門筑悴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人延都,你說(shuō)我怎么就攤上這事雷猪。” “怎么了晰房?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)射沟。 經(jīng)常有香客問(wèn)我殊者,道長(zhǎng),這世上最難降的妖魔是什么验夯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任猖吴,我火速辦了婚禮,結(jié)果婚禮上挥转,老公的妹妹穿的比我還像新娘海蔽。我一直安慰自己,他們只是感情好绑谣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布党窜。 她就那樣靜靜地躺著,像睡著了一般借宵。 火紅的嫁衣襯著肌膚如雪幌衣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天壤玫,我揣著相機(jī)與錄音豁护,去河邊找鬼。 笑死欲间,一個(gè)胖子當(dāng)著我的面吹牛楚里,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猎贴,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼班缎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嘱能?” 一聲冷哼從身側(cè)響起吝梅,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惹骂,沒(méi)想到半個(gè)月后苏携,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对粪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年右冻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了装蓬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纱扭,死狀恐怖牍帚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乳蛾,我是刑警寧澤暗赶,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站肃叶,受9級(jí)特大地震影響蹂随,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜因惭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一岳锁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹦魔,春花似錦激率、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至剥险,卻和暖如春聪蘸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背表制。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工健爬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人么介。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓娜遵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親壤短。 傳聞我的和親對(duì)象是個(gè)殘疾皇子设拟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文是根據(jù) Quartz定時(shí)器官方文檔翻譯的,只翻譯了第1到第10課久脯,如有翻譯不精確的地方纳胧,請(qǐng)讀者指正,互相學(xué)習(xí)帘撰,...
    ChinaXieShuai閱讀 8,313評(píng)論 1 19
  • 概述 了解Quartz體系結(jié)構(gòu) Quartz對(duì)任務(wù)調(diào)度的領(lǐng)域問(wèn)題進(jìn)行了高度的抽象跑慕,提出了調(diào)度器、任務(wù)和觸發(fā)器這3個(gè)...
    張晨輝Allen閱讀 2,220評(píng)論 2 11
  • 一點(diǎn)知識(shí) 在JAVA開(kāi)發(fā)領(lǐng)域,目前可以通過(guò)以下幾種方式進(jìn)行定時(shí)任務(wù): Timer:jdk中自帶的一個(gè)定時(shí)調(diào)度類核行,可...
    雅倩蘭爸爸閱讀 3,836評(píng)論 1 28
  • 在微服務(wù)環(huán)境下牢硅,定時(shí)任務(wù)也需要獨(dú)立為一個(gè)服務(wù)。這里使用spring+quartz搭建定時(shí)任務(wù)開(kāi)發(fā)環(huán)境芝雪。 在Co...
    天熱蚊子多閱讀 2,689評(píng)論 1 6
  • 1.引言 Quartz是一個(gè)開(kāi)源的任務(wù)調(diào)度框架减余。基于定時(shí)惩系、定期的策略來(lái)執(zhí)行任務(wù)是它的核心功能位岔,比如2018年除夕夜...
    木子道閱讀 2,421評(píng)論 0 1