Java教程:什么是分布式任务调度?怎样实现任务调度?

通常任务调度的程序是集成在应用中的,比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序,由于采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度,如下图:

Java教程:什么是分布式任务调度?怎样实现任务调度?

不管是任务调度程序集成在应用程序中,还是单独构建的任务调度系统,如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建,这样就可以具有分布式系统的特点,并且提高任务的调度处理能力:

1、并行任务调度

并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。

如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。

2、高可用

若某一个实例宕机,不影响其他实例来执行任务。

3、弹性扩容

当集群中增加实例就可以提高并执行任务的处理效率。

4、任务管理与监测

对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。

5、避免任务重复执行

当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次。

public static void main(String[] args) {        //任务执行间隔时间    final long timeInterval = 1000;    Runnable runnable = new Runnable() {        public void run() {            while (true) {                //TODO:something                try {                    Thread.sleep(timeInterval);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    };    Thread thread = new Thread(runnable);    thread.start();}

上面的代码实现了按一定的间隔时间执行任务调度的功能。

Jdk也为我们提供了相关支持,如Timer、ScheduledExecutor,下边我们了解下。

Timer方式实现:

public static void main(String[] args){      Timer timer = new Timer();      timer.schedule(new TimerTask(){        @Override          public void run() {             //TODO:something        }      }, 1000, 2000);  //1秒后开始调度,每2秒执行一次}

Timer 的优点在于简单易用,每个Timer对应一个线程,因此可以同时启动多个Timer并行执行多个任务,同一个Timer中的任务是串行执行。

ScheduledExecutor方式实现:

public static void main(String [] agrs){    ScheduledExecutorService service = Executors.newScheduledThreadPool(10);    service.scheduleAtFixedRate(            new Runnable() {                @Override                public void run() {                    //TODO:something                    System.out.println("todo something");                }            }, 1,            2, TimeUnit.SECONDS);}

Java 5 推出了基于线程池设计的 ScheduledExecutor,其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。

Timer 和 ScheduledExecutor 都仅能提供基于开始时间与重复间隔的任务调度,不能胜任更加复杂的调度需求。比如,设置每月第一天凌晨1点执行任务、复杂调度任务的管理、任务间传递数据等等。

第三方Quartz方式实现,项目地址:https://github.com/quartz-scheduler/quartz

Quartz 是一个功能强大的任务调度框架,它可以满足更多更复杂的调度需求,Quartz 设计的核心类包括 Scheduler, Job 以及 Trigger。其中,Job 负责定义需要执行的任务,Trigger 负责设置调度策略,Scheduler 将二者组装在一起,并触发任务开始执行。Quartz支持简单的按时间间隔调度、还支持按日历调度方式,通过设置CronTrigger表达式(包括:秒、分、时、日、月、周、年)进行任务调度。

下边是一个例子代码:

public static void main(String [] agrs) throws SchedulerException {    //创建一个Scheduler    SchedulerFactory schedulerFactory = new StdSchedulerFactory();    Scheduler scheduler = schedulerFactory.getScheduler();    //创建JobDetail    JobBuilder jobDetailBuilder = JobBuilder.newJob(MyJob.class);    jobDetailBuilder.withIdentity("jobName","jobGroupName");    JobDetail jobDetail = jobDetailBuilder.build();    //创建触发的CronTrigger 支持按日历调度        CronTrigger trigger = TriggerBuilder.newTrigger()                .withIdentity("triggerName", "triggerGroupName")                .startNow()                .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))                .build();    scheduler.scheduleJob(jobDetail,trigger);    scheduler.start();}public class MyJob implements Job {    @Override    public void execute(JobExecutionContext jobExecutionContext){        System.out.println("todo something");    }}

通过以上内容我们学习了什么是任务调度,任务调度所解决的问题,以及任务调度的多种实现方式。

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/262128.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年5月1日 11:24
下一篇 2023年5月2日 12:57

相关推荐

  • 聊聊小米三如何刷机。

    小米三刷机需先解锁Bootloader,然后通过MiFlash工具刷入官方或第三方ROM。注意备份数据,确保电量充足,按教程操作避免变砖。 (图片来源网络,侵删) 小米三刷机步骤 小米三(Mi 3)作为一款经典的智能手机,虽然…

    2024年6月27日
    02
  • 我来分享SEO优化的六不要。

    SEO优化的六不要 一不要:不要盲目寻找参考教程 当初世面上有许多各种各样的新手教程,这些教程的程度错落不齐,有高手写的,也有半桶水的人写的,而且里面内容许多都是大同小异的,那些并不真正懂优化的人写的教程…

    2022年10月31日
    025
  • 教你网站搭建教程网盘资源下载_网站搭建教程网盘资源下载不了。

    谁有dreamweaver网页建设全程教程 首先,创建一个文件夹作为站点的根目录(例如,mysite)。 dreamweaver制作网页教程:在硬盘驱动器中创建一个文件夹(不在Dreamweaver中),然后根据需要命名。这是您的根文件夹。在…

    2024年6月14日
    03
  • 我来说说直通车省油宝教程是什么。

    用户要注意建立满4个计划,点击绿色按钮,清空原计划,再点击确定,省油宝推广手段开启,进入物品推营页面,软件会自动的选勾店主店铺内的销量靠前,较为有优势的50款物品,为这些物品添加关键词和出价,进行推营。…

    2023年10月26日
    01
  • seo优化教程,让推广获得成功

    相信很多想要学习seo优化教程的朋友在网上也看过不少的视频或者攻略了,要想成为一名资深的seo优化人士是不容易的,下面就让我们一起来了解一下seo优化教程的相关资讯吧。 seo优化教程 seo优化教程 SEO:汉语翻译过…

    2022年5月22日
    0154
  • 今日分享自己创作网站教程,如何建立自己的网站教程视频。

    建立自己的网站是一个有趣且富有挑战性的过程,无论你是想要分享你的想法,还是想要建立一个商业网站,都可以按照以下步骤进行。 1. 确定你的目标:你需要明确你的网站的目标,你想要通过网站实现什么?是为了分享…

    2024年6月28日
    03
  • 我来分享seo优化有哪些教程。

    公司网站,或者说企业网站,特别是小型公司企业网站,通过seo优化技术,达成目标关键词排名的概率较大,更为容易。另外,达成海量的长尾词排名的难度会更高。 通过相关seo教程,对网站进行seo优化,核心点在于重点…

    2023年1月16日
    01
  • 我来教你URL和301重定向优化SEO优化系列教程。

    URL是搜索引擎抓取网站的入口。URL的长短和复杂程度影响网站的抓取和收录,也会影响排名。具体如何优化URL和301重定向,才能更利于搜索引擎快速抓取收录呢? URL首选域 URL首选域是在几个URL中选取最佳URL的过程,这…

    2023年6月20日
    02

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息