欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SpringBoot2整合ElasticJob框架過程詳解

一、ElasticJob

隆陽ssl適用于網站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

簡介

1、定時任務

在前面的文章中,說過QuartJob這個定時任務,被廣泛應用的定時任務標準。但Quartz核心點在于執(zhí)行定時任務并不是在于關注的業(yè)務模式和場景,缺少高度自定義的功能。Quartz能夠基于數(shù)據(jù)庫實現(xiàn)任務的高可用,但是不具備分布式并行調度的功能。

-> QuartJob定時任務

2、ElasticJob說明基礎簡介

Elastic-Job 是一個開源的分布式調度中間件,由兩個相互獨立的子項目 Elastic-Job-Lite 和 Elastic-Job-Cloud 組成。Elastic-Job-Lite 為輕量級無中心化解決方案,使用 jar 包提供分布式任務的調度和治理。 Elastic-Job-Cloud 是一個 Mesos Framework,依托于Mesos額外提供資源治理、應用分發(fā)以及進程隔離等服務。

功能特點

  • 分布式調度
  • 協(xié)調彈性擴容縮容
  • 失效轉移
  • 錯過執(zhí)行
  • 作業(yè)重觸發(fā)作業(yè)分片一致性,保證同一分片在分布式環(huán)境中僅一個執(zhí)行實例

補刀:人家官網這樣描述的,這里贅述一下,充實一下文章。

基礎框架結構

該圖片來自ElasticJob官網。

SpringBoot2整合ElasticJob框架過程詳解

由圖可知如下內容:

需要Zookeeper組件支持,作為分布式的調度任務,有良好的監(jiān)聽機制,和控制臺,下面的案例也就沖這個圖解來。

3、分片管理

這個概念在ElasticJob中是最具有特點的,實用性極好。

分片概念

任務的分布式執(zhí)行,需要將一個任務拆分為多個獨立的任務項,然后由分布式的服務器分別執(zhí)行某一個或幾個分片項。

場景描述:假設有服務3臺,分3片管理,要處理數(shù)據(jù)表100條,那就可以100%3,按照余數(shù)0,1,2分散到三臺服務上執(zhí)行,看到這里分庫分表的基本邏輯涌上心頭,這就是為何很多大牛講說,編程思維很重要。

個性化參數(shù)

個性化參數(shù)即shardingItemParameter,可以和分片項匹配對應關系,用于將分片項的數(shù)字轉換為更加可讀的業(yè)務代碼。

場景描述:這里猛一讀好像很飄逸,其實就是這個意思,如果分3片,取名[0,1,2]不好看,或者不好標識,可以分別給個別名標識一下,[0=A,1=B,2=C]。

二、定時任務加載

1、核心依賴包

這里使用2.0+的版本。

<dependency>
  <groupId>com.dangdang</groupId>
  <artifactId>elastic-job-lite-core</www.lanboylsy.com artifactId>
  <version>2.1.5</version>
</dependency>
<dependency>
  <groupId>com.dangdang<www.yuanyangyul.com /groupId>
  <artifactId>elastic-job-lite-spring<www.lexuancaizc.cn /artifactId>
  <version>2.1.5</version>
</dependency>

2、核心配置文件

這里主要配置一下Zookeeper中間件,分片和分片參數(shù)。

zookeeper:
 server: 127.0.0.1:2181
 namespace: es-job
job-config:
 cron: 0/10 * * * * ?
 shardCount: 1
 shardItem: 0=A,1=B,2=shentuylzc.cn C,3www.yongxinylzn.cn=D

3、自定義注解

看了官方的案例,沒看到好用的注解,這里只能自己編寫一個,基于案例的加載過程和核心API作為參考。

核心配置類:

com.dangdang.ddframe.job.lite.config.LiteJobConfiguration

根據(jù)自己想如何使用注解的思路,比如我只想注解定時任務名稱和Cron表達式這兩個功能,其他參數(shù)直接統(tǒng)一配置(這里可能是受QuartJob影響太深,可能根本就是想省事...)

@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TaskJobSign www.zhuyngyule.cn{

  @AliasFor("cron"www.feiyuptzc.cn)
  String value(www.yinmao2zhuce.cn) default "";

  @AliasFor("value")
  String cron(www.wujiu5zhuce.cn) default "";

  String jobName(www.shengyunyule.cn) default "";

}

4、作業(yè)案例

這里打印一些基本參數(shù),對照配置和注解,一目了然。

@Component
@TaskJobSign(cron = www.anxing4zc.cn"0/5 * * * * ?",jobName =www.jucaiyle.cn "Hello-Job")
public class HelloJob implements SimpleJob {

  private static final Logger LOG = LoggerFactory.getLogger(HelloJob.class.getName()) ;

  @Override
  public void execute(ShardingContext shardingContext) {
    LOG.info("當前線程: "+Thread.currentThread().getId());
    LOG.info("任務分片:"+shardingContext.getShardingTotalCount());
    LOG.info("當前分片:"+shardingContext.getShardingItem());
    LOG.info("分片參數(shù):"+shardingContext.getShardingParameter());
    LOG.info("任務參數(shù):"+shardingContext.getJobParameter());
  }
}

5、加載定時任務

既然自定義注解,那加載過程自然也要自定義一下,讀取自定義的注解,配置化,加入容器,然后初始化,等著任務執(zhí)行就好。

@Configuration
public class ElasticJobConfig {

  @Resource
  private ApplicationContext applicationContext ;
  @Resource
  private ZookeeperRegistryCenter zookeeperRegistryCenter;

  @Value("${job-config.cron}") private String cron ;
  @Value("${job-config.shardCount}"www.jucaiylzc.cn) private int shardCount ;
  @Value("${job-config.shardItem}") private String shardItem ;
  
  /**
   * 配置任務監(jiān)聽器
   */
  @Bean
  public ElasticJobListener elasticJobListener() {
    return new TaskJobListener();
  }
  /**
   * 初始化配置任務
   */
  @PostConstruct
  public void initTaskJob() {
    Map<String, SimpleJob> jobMap = this.applicationContext.getBeansOfType(SimpleJob.class);
    Iterator iterator = jobMap.entrySet().iterator();
    while (iterator.hasNext()) {
      // 自定義注解管理
      Map.Entry<String, SimpleJob> entry = (Map.Entry)iterator.next();
      SimpleJob simpleJob = entry.getValue();
      TaskJobSign taskJobSign = simpleJob.getClass().getAnnotation(TaskJobSign.class);
      if (taskJobSign != null){
        String cron = taskJobSign.cron() ;
        String jobName = taskJobSign.jobName() ;
        // 生成配置
        SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(
                        JobCoreConfiguration.newBuilder(jobName, cron, shardCount)
                        .shardingItemParameters(shardItem).jobParameter(jobName).build(),
                        simpleJob.getClass().getCanonicalName());
        LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(
                        simpleJobConfiguration).overwrite(true).build();
        TaskJobListener taskJobListener = new TaskJobListener();
        // 初始化任務
        SpringJobScheduler jobScheduler = new SpringJobScheduler(
                        simpleJob, zookeeperRegistryCenter,
                        liteJobConfiguration, taskJobListener);
        jobScheduler.init();
      }
    }
  }
}

絮叨一句:不要疑問這些API是怎么知道,看下官方文檔的案例,他們怎么使用這些核心API,這里就是照著寫過來,就是多一步自定義注解類的加載過程。當然官方文檔大致讀一遍還是很有必要的。

補刀一句:如何快速學習一些組件的用法,首先找到官方文檔,或者開源庫Wiki,再不濟ReadMe文檔(如果都沒有,酌情放棄,另尋其他),熟悉基本功能是否符合自己的需求,如果符合,就看下基本用法案例,熟悉API,最后就是研究自己需要的功能模塊,個人經驗來看,該過程是彎路最少,坑最少的。

6、任務監(jiān)聽

用法非常簡單,實現(xiàn)ElasticJobListener接口。

@Component
public class TaskJobListener implements ElasticJobListener {
  private static final Logger LOG = LoggerFactory.getLogger(TaskJobListener.class);

  private long beginTime = 0;

  @Override
  public void beforeJobExecuted(ShardingContexts shardingContexts) {
    beginTime = System.currentTimeMillis();
    LOG.info(shardingContexts.getJobName()+"===>開始...");
  }

  @Override
  public void afterJobExecuted(ShardingContexts shardingContexts) {
    long endTime = System.currentTimeMillis();
    LOG.info(shardingContexts.getJobName()+
    "===>結束...[耗時:"+(endTime - beginTime)+"]");
  }
}

絮叨一句:before和after執(zhí)行前后,中間執(zhí)行目標方法,標準的AOP切面思想,所以底層水平決定了對上層框架的理解速度,那本《Java編程思想》上的灰塵是不是該擦擦?

三、動態(tài)添加

1、作業(yè)任務

有部分場景需要動態(tài)添加和管理定時任務,基于上面的加載流程,在自定義一些步驟就可以。

@Component
public class GetTimeJob implements SimpleJob {

  private static final Logger LOG = LoggerFactory.getLogger(GetTimeJob.class.getName()) ;

  private static final SimpleDateFormat format =
      new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;

  @Override
  public void execute(ShardingContext shardingContext) {
    LOG.info("Job Name:"+shardingContext.getJobName());
    LOG.info("Local Time:"+format.format(new Date()));
  }
}

2、添加任務服務

這里就動態(tài)添加上面的任務。

@Service
public class TaskJobService {

  @Resource
  private ZookeeperRegistryCenter zookeeperRegistryCenter;

  public void addTaskJob(final String jobName,final SimpleJob simpleJob,
              final String cron,final int shardCount,final String shardItem) {
    // 配置過程
    JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(
                          jobName, cron, shardCount)
                          .shardingItemParameters(shardItem).build();
    JobTypeConfiguration jobTypeConfiguration = new SimpleJobConfiguration(jobCoreConfiguration,
                          simpleJob.getClass().getCanonicalName());
    LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(
                          jobTypeConfiguration).overwrite(true).build();
    TaskJobListener taskJobListener = new TaskJobListener();
    // 加載執(zhí)行
    SpringJobScheduler jobScheduler = new SpringJobScheduler(
        simpleJob, zookeeperRegistryCenter,
        liteJobConfiguration, taskJobListener);
    jobScheduler.init();
  }

}

補刀一句:這里添加之后,任務就會定時執(zhí)行,如何停止任務又是一個問題,可以在任務名上做一些配置,比如在數(shù)據(jù)庫生成一條記錄[1,job1,state],如果調度到state為停止狀態(tài)的任務,直接截胡即可。

3、測試接口

@RestController
public class TaskJobController {

  @Resource
  private TaskJobService taskJobService ;

  @RequestMapping("/addJob")
  public String addJob(@RequestParam("cron") String cron,@RequestParam("jobName") String jobName,
             @RequestParam("shardCount") Integer shardCount,
             @RequestParam("shardItem") String shardItem) {
    taskJobService.addTaskJob(jobName, new GetTimeJob(), cron, shardCount, shardItem);
    return "success";
  }
}

四、源代碼地址

GitHub

·地址https://github.com/cicadasmile/middle-ware-parentGitEE

·地址https://gitee.com/cicadasmile/middle-ware-parent

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網站欄目:SpringBoot2整合ElasticJob框架過程詳解
本文來源:http://aaarwkj.com/article32/gjodsc.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供品牌網站建設搜索引擎優(yōu)化、用戶體驗、網站維護、微信小程序商城網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
亚洲国产日韩中文字幕| 国产中文字二暮区2021综合| 国产精品97久久97久久久久| 日本加勒比在线播放一区| 国产免费av高清在线| 青青成线在人线免费啪| 国语精品对白交换日韩| 插美女逼免费视频导航| 激情五月综合开心五月| 亚洲欧美成人免费视频| 91精品国产自产在线蜜臀| 国语少妇高潮对白在线| 亚洲国产精品久久久久国产精品| 日本黄色美女日本黄色| 自拍偷拍亚洲精品第一页| 亚洲最大色网在线观看| 久久综合伊人欧美精品| 天堂在线av免费观看| 麻豆久久av免费观看| 亚洲男人的天堂社区av| 国产精彩在线视频成人在线| 日本一区二区三区高清| 欧美激情中文字幕日韩精品| 亚洲成人免费电影久久| 在线观看视频网站一卡二卡| 手机在线看国产后入| 闫国产一区二区三区色噜噜| 成年人免费在线观看国产| 国内精品老年人视频网站| 亚洲综合香蕉在线视频| 精品国产一区二区三区不卡| 91大神九色在线观看| 女人被爽到高潮呻吟免费看| 日韩成人手机视频在线观看 | 人妻乱人伦中文字幕在线| 日本区一区二区三啪啪| 久久久精品国产亚洲av色哟哟| 国产三级视频在线2022| 国产91一区二区三区在线精品 | 国产亚洲中文久久网久久| 国产青草视频免观看视频|