1. 程式人生 > >elastic-job替換掉原來的spring+quartz的定時任務排程

elastic-job替換掉原來的spring+quartz的定時任務排程

替換的原因:

我想用quartz實現定時任務叢集的時候,遇到過很坑的問題就是所有做叢集的機器都必須保證時間的一致性,要不然有很多機器的專案是起不來的;除此之外,使用quartz很容易造成資料庫死鎖的問題,雖然我已經降低了quartz的資料庫事務級別,但還是有這種情況發生,所以用過一段時間之後,新的專案就用了elastic-job。

版本:

elastic-job有兩個版本:一個是elastic-job-lite,一個是elastic-job-cloud;一般情況下elastic-job-lite就滿足了,我在專案中用的也是這個,elastic-job-cloud是基於mesos的,雖然功能比lite多,但感覺lite就夠用了,如果有對cloud感興趣的同學可以取官網

http://elasticjob.io/看下。

使用:

其實他的使用方法在官網都可以找得到,我的是基於springboot的:

1、在application-properties中配置註冊中心和事件追蹤資料來源

#elastic-job叢集支援   開始*************************************************
#zookpeer註冊中心配置
regCenter.serverList=192.168.40.23:2181
regCenter.namespace=cron-provider

#elastic-job事件追蹤資料庫配置
jobEventConfig.url=jdbc:mysql://192.168.40.23:3306/youjia_cron?useUnicode=true&characterEncoding=UTF-8
jobEventConfig.driverClassName=com.mysql.jdbc.Driver
jobEventConfig.username=kudev_w
jobEventConfig.password=nBVHe1M/Q3TKmtLBPseVnVOeFO7jO1Ww
#elastic-job叢集支援   結束*************************************************

2、配置註冊中心
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 定時任務註冊中心配置
 *
 * @author 高仕立
 * @date 2017/12/18 16:54
 */
@Configuration
@ConditionalOnExpression("'${regCenter.serverList}'.length() > 0")
public class RegistryCenterConfig {

    @Bean(initMethod = "init")
    public ZookeeperRegistryCenter regCenter(@Value("${regCenter.serverList}") final String serverList, @Value("${regCenter.namespace}") final String namespace) {
        return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));
    }
}

3、配置事件追蹤資料來源
import com.dangdang.ddframe.job.event.JobEventConfiguration;
import com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration;
import com.youjia.cron.common.util.EncryptUtils;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 定時器時事件資料來源配置
 *
 * @author 高仕立
 * @date 2017/12/18 16:36
 */
@Configuration
public class JobEventConfig {

    @Bean
    public JobEventConfiguration jobEventConfiguration(@Value("${jobEventConfig.url}") final String url, @Value("${jobEventConfig.driverClassName}") final String driverClassName,
                                                       @Value("${jobEventConfig.username}") final String username, @Value("${jobEventConfig.password}") final String password) {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUsername(username);
        dataSource.setPassword(EncryptUtils.decrypt(password));
        return new JobEventRdbConfiguration(dataSource);
    }
}

4、配置定時任務常量,如果分片為1,部署多臺服務的時候,自動切換為主從

package com.youjia.cron.config.elastic_job;

/**
 * 定時任務常量相關配置類
 *
 * @author 高仕立
 * @date 2017/12/19 10:10
 */
public class JobParamtersConfig {

    /**
     * 測試定時
     */
    public static String test_cron = "0/1 * * * * ?";

    /**
     * 測試作業分片總數
     */
    public static int test_total_count = 2;

    /**
     * 測試分片序列號和引數
     */
    public static String test_shardingItemParameters = "0=A,1=B";
}


5、配置定時任務job
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.youjia.cron.common.constants.SmartLockConstant;
import com.youjia.cron.dao.lock.LodLockApplyMapper;
import com.youjia.cron.dao.lodjoinexamine.LodPreOnlineExample;
import com.youjia.cron.dao.lodjoinexamine.LodPreOnlineMapper;
import com.youjia.cron.model.lock.LodLockApply;
import com.youjia.cron.model.lock.LodLockApplyExample;
import com.youjia.cron.service.lock.third.huohe.HuoheTech;
import com.youjia.found.exception.YJException;
import com.youjia.lodge.model.LodPreOnline;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 測試定時模組
 *
 * @author 高仕立
 * @date 2017/12/14 14:29
 */
@Component
public class TestJob implements SimpleJob {

    private static final Logger logger = LoggerFactory.getLogger(TestJob.class);

    @Override
    public void execute(ShardingContext context) {
        System.out.println("現在的日期是:" + new Date());
    }

}

6、初始化定時任務:

import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
import com.dangdang.ddframe.job.event.JobEventConfiguration;
import com.dangdang.ddframe.job.lite.api.JobScheduler;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
import com.youjia.cron.job.test.TestJob;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * @author 高仕立
 * @date 2017/12/18 16:55
 */
@Configuration
public class SimpleJobConfig {

    @Resource
    private ZookeeperRegistryCenter regCenter;

    @Resource
    private JobEventConfiguration jobEventConfiguration;

    @Bean
    public SimpleJob testJob(){
        return new TestJob();
    }

    /**
     * 初始化測試定時任務
     *
     * @return
     */
    @Bean(initMethod = "init")
    public JobScheduler simpleTestJobScheduler(final SimpleJob testJob) {
        return new SpringJobScheduler(testJob, regCenter, getTestJobConfiguration(), jobEventConfiguration);
    }

    /**
     * 配置測試定時任務
     *
     * @return
     */
    private LiteJobConfiguration getTestJobConfiguration() {

        return LiteJobConfiguration.newBuilder(
                new SimpleJobConfiguration(
                        JobCoreConfiguration.newBuilder(TestJob.class.getCanonicalName(), test_cron, test_total_count)
                                .shardingItemParameters(test_shardingItemParameters).description
                                ("測試定時任務").build(), TestJob.class.getCanonicalName())
        ).overwrite(true).monitorPort(9091).build();
    }


}
完成以上配置之後就可以使用了

監控:

 編譯一下程式碼中的elastic-job下的console模組,會生成一個tar包,解壓之後會生成bin目錄,如果是windows平臺的啟動

start.bat,如果是linux,需要將start.sh的編碼轉換一下才可以執行;

效果圖如下:


相關推薦

elastic-job替換原來spring+quartz定時任務排程

替換的原因: 我想用quartz實現定時任務叢集的時候,遇到過很坑的問題就是所有做叢集的機器都必須保證時間的一致性,要不然有很多機器的專案是起不來的;除此之外,使用quartz很容易造成資料庫死鎖的問題,雖然我已經降低了quartz的資料庫事務級別,但還是有這種情況發生,所

spring+quartz定時任務Quartz Job未例項化導致Spring @Autowired 注入為null

寫在前面 上週組長佈置給我一個任務,在 Java 多資料來源的配置一文中也提到過,大概就是一個從別人的資料庫中查詢出自己需要的資料,然後存到本地的資料庫中的流程。本以為就一個java多資料來源的知識點,最後需求又更新為獨立開發一個子專案來做這件事情,而子專案需

spring + quartz定時任務,以及修改定時任務

blog public schedule col ping ppi string time 找到 spring4+quartz2.2.3,定時任務弄好了,修改定時任務沒折騰起,沒找到合適的解決方案。 最終使用庫spring-context-support 3.2.17.RE

Spring整合quartz定時任務排程的cronExpression配置說明(轉載)

Spring整合quartz定時任務排程 "* * * * * *" 欄位   允許值   允許的特殊字元 秒   

Elastic-Job原始碼解析(三)之分片定時任務執行

通過本篇的閱讀你將學會了解Elastic-Job的定時時機,及如何通過分片方式做一個分散式的定時任務框架。瞭解常用的三種分片策略,及如何自定義分散式分片策略 目錄 Elastic-Job如何通過SpringJobScheduler啟動定時 Ela

spring+quartz定時任務出現重複呼叫

出現問題的原因: 應該都是將quartz配置和spring配置放在了同一個xml檔案中,導致被容器掃描了兩次 如何解決呢? 其實你看了會覺得so easy 將quartz配置單獨放在一個xml檔案中,在web.xml中進行配置即可 1、新建quartz配置x

spring quartz定時任務整合配置(ssm,ssh專案都適用)

  轉自:https://www.tpyyes.com/a/javaweb/2017/0310/79.html spring整合配置quartz定時器任務非常的簡單,本專案是基於ssm maven專案的整合,如果你是ssh專案,請下載spring-context-support-4

Spring-quartz定時任務service注入問題

我自己的解決過程:http://blog.csdn.net/axela30w/article/details/67632242(跟下面兩種稍微不一樣) 第一種解決方案: 一般情況下,quartz的job中使用autowired註解注入的物件為空,這時候我們就要使用s

spring boot 整合quartz 定時任務排程

新增依賴: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <ver

spring quartz 定時任務同時間執行2次的問題

    運用spring   quartz 執行定時任務的時候 同時間 遇到的 執行2次的問題。                任務執行的時候  , 發現   log.info  日誌 輸出了  2次     ,當時沒有 找到 哪裡錯了,  後面發現啟動專案的時候

Quartz定時任務排程cron 表示式時間格式

cron 表示式的格式   Quartz Cron 表示式支援到七個域    月份和星期的名稱是不區分大小寫的。FRI 和 fri是一樣的。  域之間有空格分隔,這和 UNIX cron 一樣。無可爭辯的,我們能寫的最簡單的表示式看起

SSM框架整合 quartz 定時任務排程

maven的pom.xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&

Spring quantz--定時任務排程工具

1.在xml中交給spring管理的一些類 <bean id="cancelOrderJobDetail" class="org.springframework.scheduling.quart

Quartz定時任務排程詳細實現案例

什麼也不說直接上程式碼,程式碼的註釋中有相關的講解。 1、程式碼結構中用到的一些Jar包: log4j-1.2.16.jar quartz-2.2.1.jar quartz-jobs-2.2.1.jar slf4j-api-1.6.6.jar slf4j-log4j12-1

Quartz定時任務排程

一  開發概述        對於具有一定規模的大多數企業來說,存在著這樣一種需求:存在某個或某些任務,需要系統定期,自動地執行,然而,對大多數企業來說,該技術的實現,卻是他們面臨的一大難點和挑戰。  對於大部分企業來說,實現如上功能,挑戰在哪裡? 挑戰一:如何做一個自動服務的系統?      

關於quartz定時任務實現Job介面無法註解為spring bean 的一種解決方案

  通常情況下,我們使用quartz之後,定時任務實現Job介面,並重寫execute()方法: public class QuartzJob1 implements Job { /** * quartz回撥此介面,此介面中為定時任務具體執行內容 *

Spring整合Quartz定時任務 在集群、分布式系統中的應用(Mysql數據庫環境)

foreign log ride bigint post 業務 設置 ade 營業額 Spring整合Quartz定時任務 在集群、分布式系統中的應用(Mysql數據庫環境) 轉載:http://www.cnblogs.com/jiafuwei/p/6145280.

spring boot整合quartz定時任務案例

blank pos jdk com post 4.0 learn int idea 1.運行環境 開發工具:intellij idea JDK版本:1.8 項目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/spr

spring-quartz 定時器 給targetMethod傳遞引數

今天在做一個專案的時候,要給一個定時器任務的執行方法傳遞引數,在網上找了一下資料,可以使用arguments引數:   <bean id="subsidyJobDetail" class="org.springframework.scheduling.quartz