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

SpringBoot2中怎么整合ElasticJob框架

這篇文章將為大家詳細講解有關(guān)SpringBoot2中怎么整合ElasticJob框架,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

10年積累的成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有輪臺免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一、ElasticJob簡介

1、定時任務(wù)

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

-> QuartJob定時任務(wù)

2、ElasticJob說明

  • 基礎(chǔ)簡介

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

  • 功能特點

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

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

  • 基礎(chǔ)框架結(jié)構(gòu)

該圖片來自ElasticJob官網(wǎng)。

SpringBoot2中怎么整合ElasticJob框架

由圖可知如下內(nèi)容:

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

3、分片管理

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

  • 分片概念

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

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

  • 個性化參數(shù)

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

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

二、定時任務(wù)加載

1、核心依賴包

這里使用2.0+的版本。

<dependency>
    <groupId>com.dangdang</groupId>
    <artifactId>elastic-job-lite-core</artifactId>
    <version>2.1.5</version>
</dependency>
<dependency>
    <groupId>com.dangdang</groupId>
    <artifactId>elastic-job-lite-spring</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=C,3=D

3、自定義注解

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

核心配置類:

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

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

@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TaskJobSign {
    @AliasFor("cron")
    String value() default "";
    @AliasFor("value")
    String cron() default "";
    String jobName() default "";
}

4、作業(yè)案例

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

@Component
@TaskJobSign(cron = "0/5 * * * * ?",jobName = "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("任務(wù)分片:"+shardingContext.getShardingTotalCount());
        LOG.info("當前分片:"+shardingContext.getShardingItem());
        LOG.info("分片參數(shù):"+shardingContext.getShardingParameter());
        LOG.info("任務(wù)參數(shù):"+shardingContext.getJobParameter());
    }
}

5、加載定時任務(wù)

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

@Configuration
public class ElasticJobConfig {
    @Resource
    private ApplicationContext applicationContext ;
    @Resource
    private ZookeeperRegistryCenter zookeeperRegistryCenter;
    @Value("${job-config.cron}") private String cron ;
    @Value("${job-config.shardCount}") private int shardCount ;
    @Value("${job-config.shardItem}") private String shardItem ;
    /**
     * 配置任務(wù)監(jiān)聽器
     */
    @Bean
    public ElasticJobListener elasticJobListener() {
        return new TaskJobListener();
    }
    /**
     * 初始化配置任務(wù)
     */
    @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();
                // 初始化任務(wù)
                SpringJobScheduler jobScheduler = new SpringJobScheduler(
                                                simpleJob, zookeeperRegistryCenter,
                                                liteJobConfiguration, taskJobListener);
                jobScheduler.init();
            }
        }
    }
}

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

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

6、任務(wù)監(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()+
        "===>結(jié)束...[耗時:"+(endTime - beginTime)+"]");
    }
}

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

三、動態(tài)添加

1、作業(yè)任務(wù)

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

@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、添加任務(wù)服務(wù)

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

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

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

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";
    }
}

關(guān)于SpringBoot2中怎么整合ElasticJob框架就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

文章標題:SpringBoot2中怎么整合ElasticJob框架
網(wǎng)頁路徑:http://aaarwkj.com/article6/igigig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、、域名注冊、Google、外貿(mào)網(wǎng)站建設(shè)、建站公司

廣告

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

外貿(mào)網(wǎng)站建設(shè)
亚洲女同在线免费观看| 久久成人av一区二区三区| 久久精品国产一区二区三区91| 很黄无遮挡在线免费网站| 亚洲成人精品夫妻av| 黄色av一本二本在线观看| 中文字幕日本乱码精品久久| 周妍希浴室视频色哟哟| 一区二区三区国产精品乱码| 亚洲国产99在线精品一区| 亚洲中文有码在线播放| 午夜两性做爰免费视频| 性生活视频在线观看免费| 一区二区三区国产不卡| 少妇按摩高潮呻吟av| 日韩亚洲av在线免费观看| 日韩欧美另类精品在线| 国产精品精品久久久久久| av成人黄色片在线播放| 久久超碰一区二区三区| 丁香婷婷深情五月亚洲天堂| 亚洲一品道在线观看| 性生活真实视频免费看| 日本精品动漫一区二区三区| 少妇诱惑一区二区三区| 国产精品盗摄一区二区三区| 草草在线成年免费视频| 亚洲午夜一区二区不卡| 少妇人妻偷人精品系列| 激情亚洲欧美日韩精品| 久久这里只有精品视频六| 日韩一区二区高清视频在线观看| 手机av在线 中文字幕| 国产精品一区二区综合亚洲| 人妻少妇被猛烈进入中文字幕91| 欧美三级视频一区二区三区| 久久国产亚洲欧美日韩精品| 欧美日韩69av网| 欧美一区二区三区情色| 国外男女性生活在线视频| 韩国黄色三级一区二区|