溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何快速上手使用SpringBoot-ElasticJob封裝

發(fā)布時間:2021-09-28 09:31:36 來源:億速云 閱讀:143 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)如何快速上手使用SpringBoot-ElasticJob封裝,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

elastic-job-spring-boot

1 簡介

Elastic-Job是一個分布式調(diào)度解決方案,由兩個相互獨立的子項目Elastic-Job-LiteElastic-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è)和注冊中心。

1.1 使用場景

由于項目為微服務,單模塊可能在兩個實例以上的數(shù)量,定時器就會出現(xiàn)多實例同時執(zhí)行的情況。 一般定時器缺少管理界面,無法監(jiān)控定時器是否執(zhí)行成功。 市面上常見的解決方案為定時器加鎖的操作,或者采用第3方分布式定時器。 分布式定時器有多種方案,比如阿里內(nèi)部的ScheduledX,當當網(wǎng)的Elastic job,個人開源的xxl-job等。

1.2 功能列表

  • 分布式調(diào)度協(xié)調(diào)

  • 彈性擴容縮容

  • 失效轉(zhuǎn)移

  • 錯過執(zhí)行作業(yè)重觸發(fā)

  • 作業(yè)分片一致性,保證同一分片在分布式環(huán)境中僅一個執(zhí)行實例

  • 自診斷并修復分布式不穩(wěn)定造成的問題

  • 支持并行調(diào)度

  • 支持作業(yè)生命周期操作

  • 豐富的作業(yè)類型

  • Spring整合以及命名空間提供

  • 運維平臺

1.3 概念

分片:任務的分布式執(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遍歷ID0-4結(jié)尾的數(shù)據(jù);服務器B遍歷ID5-9結(jié)尾的數(shù)據(jù)。

歷史軌跡:Elastic-Job提供了事件追蹤功能,可通過事件訂閱的方式處理調(diào)度過程的重要事件,用于查詢、統(tǒng)計和監(jiān)控。

1.4 封裝elasticjob

由于當當網(wǎng)Elastic job處于1年間未更新階段,相關(guān)jar處于可以使用階段功能不全??紤]到使用場景為多項目使用,將elastic-job-lite-spring簡單封裝便于使用。

2.使用說明:

2.1 添加依賴

ps:實際version版本請使用最新版

<dependency>
  <groupId>com.purgeteam</groupId>
  <artifactId>elasticjob-spring-boot-starter</artifactId>
  <version>0.1.1.RELEASE</version>
</dependency>

2.2 配置

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

2.3 定時器實現(xiàn)方法編寫

創(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

2.4 配置定時器

2.4.1 創(chuàng)建Configuration類

ZookeeperRegistryCenterJobEventConfiguration注入。 創(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 ...;
  }
2.4.2 簡化Configuration類

當然也可以用下面的@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);
    }

}
2.4.3 注解方式配置(推薦方式)

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()
        ));
    }
}

總結(jié)

分布式job可以解決多個項目同一個定時器都執(zhí)行的問題,配合elastic-job控制臺可以直觀監(jiān)控定時器執(zhí)行情況等。

如何快速上手使用SpringBoot-ElasticJob封裝

看完上述內(nèi)容,你們對如何快速上手使用SpringBoot-ElasticJob封裝有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI