您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)如何快速上手使用SpringBoot-ElasticJob封裝,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
Elastic-Job
是一個分布式調(diào)度解決方案,由兩個相互獨立的子項目Elastic-Job-Lite
和Elastic-Job-Cloud
組成。Elastic-Job-Lite
定位為輕量級無中心化解決方案,使用jar包的形式提供分布式任務的協(xié)調(diào)服務。 基于quartz
定時任務框架為基礎的,因此具備quartz
的大部分功能 使用zookeeper
做協(xié)調(diào),調(diào)度中心,更加輕量級 支持任務的分片 支持彈性擴容,可以水平擴展, 當任務再次運行時,會檢查當前的服務器數(shù)量,重新分片,分片結(jié)束之后才會繼續(xù)執(zhí)行任務 失效轉(zhuǎn)移,容錯處理,當一臺調(diào)度服務器宕機或者跟zookeeper
斷開連接之后,會立即停止作業(yè),然后再去尋找其他空閑的調(diào)度服務器,來運行剩余的任務 提供運維界面,可以管理作業(yè)和注冊中心。
由于項目為微服務,單模塊可能在兩個實例以上的數(shù)量,定時器就會出現(xiàn)多實例同時執(zhí)行的情況。 一般定時器缺少管理界面,無法監(jiān)控定時器是否執(zhí)行成功。 市面上常見的解決方案為定時器加鎖的操作,或者采用第3方分布式定時器。 分布式定時器有多種方案,比如阿里內(nèi)部的ScheduledX
,當當網(wǎng)的Elastic job
,個人開源的xxl-job
等。
分布式調(diào)度協(xié)調(diào)
彈性擴容縮容
失效轉(zhuǎn)移
錯過執(zhí)行作業(yè)重觸發(fā)
作業(yè)分片一致性,保證同一分片在分布式環(huán)境中僅一個執(zhí)行實例
自診斷并修復分布式不穩(wěn)定造成的問題
支持并行調(diào)度
支持作業(yè)生命周期操作
豐富的作業(yè)類型
Spring整合以及命名空間提供
運維平臺
分片:任務的分布式執(zhí)行,需要將一個任務拆分為多個獨立的任務項,然后由分布式的服務器分別執(zhí)行某一個或幾個分片項。 例如:有一個遍歷數(shù)據(jù)庫某張表的作業(yè),現(xiàn)有2臺服務器。為了快速的執(zhí)行作業(yè),那么每臺服務器應執(zhí)行作業(yè)的50%
。 為滿足此需求,可將作業(yè)分成2片,每臺服務器執(zhí)行1片。作業(yè)遍歷數(shù)據(jù)的邏輯應為:服務器A遍歷ID以奇數(shù)結(jié)尾的數(shù)據(jù);服務器B遍歷ID以偶數(shù)結(jié)尾的數(shù)據(jù)。 如果分成10片,則作業(yè)遍歷數(shù)據(jù)的邏輯應為:每片分到的分片項應為ID%10,而服務器A被分配到分片項0,1,2,3,4
;服務器B被分配到分片項5,6,7,8,9
,直接的結(jié)果就是服務器A遍歷ID
以0-4
結(jié)尾的數(shù)據(jù);服務器B遍歷ID
以5-9
結(jié)尾的數(shù)據(jù)。
歷史軌跡:Elastic-Job
提供了事件追蹤功能,可通過事件訂閱的方式處理調(diào)度過程的重要事件,用于查詢、統(tǒng)計和監(jiān)控。
elasticjob
由于當當網(wǎng)Elastic job
處于1年間未更新階段,相關(guān)jar處于可以使用階段功能不全??紤]到使用場景為多項目使用,將elastic-job-lite-spring
簡單封裝便于使用。
ps:實際version版本請使用最新版
<dependency> <groupId>com.purgeteam</groupId> <artifactId>elasticjob-spring-boot-starter</artifactId> <version>0.1.1.RELEASE</version> </dependency>
ps: 需要mysql
,zookeeper
支持,請?zhí)崆按罱ê谩?/p>
配置bootstrap.yml
或者application.yml
。
加入以下配置:
spring: elasticjob: datasource: # job需要的記錄數(shù)據(jù)源 url: jdbc:mysql://127.0.0.1:3306/batch_log?useUnicode=true&characterEncoding=utf-8&verifyServerCertificate=false&useSSL=false&requireSSL=false driver-class-name: com.mysql.cj.jdbc.Driver username: root password: Rtqw123OpnmER regCenter: # 注冊中心 serverList: 127.0.0.1:2181 namespace: elasticJobDemo
創(chuàng)建定時器類(唯一不同的地方在于將@Scheduled
改為實現(xiàn)SimpleJob
接口即可) 定時器實現(xiàn)方法編寫在execute
方法里。
@Slf4j @Component public class MySimpleJob implements SimpleJob { // @Scheduled(cron = "0 0/1 * * * ?") @Override public void execute(ShardingContext shardingContext) { log.info(String.format("Thread ID: %s, 作業(yè)分片總數(shù): %s, " + "當前分片項: %s.當前參數(shù): %s," + "作業(yè)名稱: %s.作業(yè)自定義參數(shù): %s", Thread.currentThread().getId(), shardingContext.getShardingTotalCount(), shardingContext.getShardingItem(), shardingContext.getShardingParameter(), shardingContext.getJobName(), shardingContext.getJobParameter() )); // 分片大致如下:根據(jù)配置的分片參數(shù)執(zhí)行相應的邏輯 switch (context.getShardingItem()) { case 0: // do something by sharding item 0 break; case 1: // do something by sharding item 1 break; case 2: // do something by sharding item 2 break; // case n: ... } } }
log:Thread ID: 66, 作業(yè)分片總數(shù): 1, 當前分片項: 0.當前參數(shù): Beijing,作業(yè)名稱: PropertiesSimpleJob.作業(yè)自定義參數(shù): test
將ZookeeperRegistryCenter
和JobEventConfiguration
注入。 創(chuàng)建JobScheduler
@Bean(initMethod = "init")
。 在mySimpleJobScheduler
方法里先通過ElasticJobUtils#getLiteJobConfiguration
獲取LiteJobConfiguration
對象。 創(chuàng)建SpringJobScheduler
對象返回即可。
@Configuration public class MyJobConfig { // job 名稱 private static final String JOB_NAME = "MySimpleJob"; // 定時器cron參數(shù) private static final String CRON = "0 0/1 * * * ?"; // 定時器分片 private static final int SHARDING_TOTAL_COUNT = 1; // 分片參數(shù) private static final String SHARDING_ITEM_PARAMETERS = "0=Beijing,1=Shanghai,2=Guangzhou"; // 自定義參數(shù) private static final String JOB_PARAMETERS = "parameter"; @Resource private ZookeeperRegistryCenter regCenter; @Resource private JobEventConfiguration jobEventConfiguration; @Bean(initMethod = "init") public JobScheduler mySimpleJobScheduler(final MySimpleJob mySimpleJob) { LiteJobConfiguration liteJobConfiguration = ElasticJobUtils .getLiteJobConfiguration(mySimpleJob.getClass(), JOB_NAME, CRON, SHARDING_TOTAL_COUNT, SHARDING_ITEM_PARAMETERS, JOB_PARAMETERS); // 參數(shù):1.定時器實例,2.注冊中心類,3.LiteJobConfiguration, // 3.歷史軌跡(不需要可以省略) return new SpringJobScheduler(mySimpleJob, regCenter, liteJobConfiguration, jobEventConfiguration); } }
ElasticJobUtils#getLiteJobConfiguration
參數(shù)簡介:
/** * 獲取 {@link LiteJobConfiguration} 對象 * * @param jobClass 定時器實現(xiàn)類 * @param jobName 定時器名稱 * @param cron 定時參數(shù) * @param shardingTotalCount 作業(yè)分片總數(shù) * @param shardingItemParameters 當前參數(shù) 可以為null * @param jobParameters 作業(yè)自定義參數(shù) 可以為null * @return {@link LiteJobConfiguration} */ public static LiteJobConfiguration getLiteJobConfiguration( final Class<? extends SimpleJob> jobClass, final String jobName, final String cron, final int shardingTotalCount, final String shardingItemParameters, final String jobParameters) { ... return ...; }
當然也可以用下面的@Configuration
實現(xiàn)簡化,配置bootstrap.yml
或者application.yml
。
spring: elasticjob: scheduled: jobConfigMap: // 為map集合 PropertiesSimpleJob: // 定時器key名稱 jobName: PropertiesSimpleJob // job名稱 cron: 0 0/1 * * * ? // cron表達式 shardingTotalCount: 2 // 分片數(shù)量 shardingItemParameters: 0=123,1=332 // 分片參數(shù) jobParameters: test // 自定義參數(shù)
注入SpringJobSchedulerFactory
,在propertiesSimpleJobScheduler
方法里調(diào)用gerSpringJobScheduler
方法即可。
@Configuration public class PropertiesSimpleJobConfig { @Resource private SpringJobSchedulerFactory springJobSchedulerFactory; @Bean(initMethod = "init") public JobScheduler propertiesSimpleJobScheduler(final PropertiesSimpleJob job) { // 參數(shù):1.定時器實例,2.配置名稱,3.是否開啟歷史軌跡 return springJobSchedulerFactory.getSpringJobScheduler(job,"PropertiesSimpleJob", true); } }
ps:這個注解包含了上述方式,簡化定時器注入。
繼承SimpleJob
實現(xiàn)方法execute
。
在AnnotationSimpleJob
類上加入注解@ElasticJobScheduler
即可。 下面為完整注解。
@Slf4j @ElasticJobScheduler( name = "AnnotationSimpleJob", // 定時器名稱 cron = "0/8 * * * * ?", // 定時器表達式 shardingTotalCount = 1, // 作業(yè)分片總數(shù) 默認為1 shardingItemParameters = "0=Beijing,1=Shanghai,2=Guangzhou", // 分片序列號和參數(shù)用等號分隔 不需要參數(shù)可以不加 jobParameters = "123", // 作業(yè)自定義參數(shù) 不需要參數(shù)可以不加 isEvent = true // 是否開啟數(shù)據(jù)記錄 默認為true ) public class AnnotationSimpleJob implements SimpleJob { @Override public void execute(ShardingContext shardingContext) { log.info(String.format("Thread ID: %s, 作業(yè)分片總數(shù): %s, " + "當前分片項: %s.當前參數(shù): %s," + "作業(yè)名稱: %s.作業(yè)自定義參數(shù): %s", Thread.currentThread().getId(), shardingContext.getShardingTotalCount(), shardingContext.getShardingItem(), shardingContext.getShardingParameter(), shardingContext.getJobName(), shardingContext.getJobParameter() )); } }
分布式job可以解決多個項目同一個定時器都執(zhí)行的問題,配合elastic-job控制臺可以直觀監(jiān)控定時器執(zhí)行情況等。
看完上述內(nèi)容,你們對如何快速上手使用SpringBoot-ElasticJob封裝有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。