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感興趣的同學可以取官網
使用:
其實他的使用方法在官網都可以找得到,我的是基於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定時任務排程
一 開發概述 對於具有一定規模的大多數企業來說,存在著這樣一種需求:存在某個或某些任務,需要系統定期,自動地執行,然而,對大多數企業來說,該技術的實現,卻是他們面臨的一大難點和挑戰。 對於大部分企業來說,實現如上功能,挑戰在哪裡? 挑戰一:如何做一個自動服務的系統?
springboot開發之定時器quartz 定時任務排程(壓縮版,抽取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