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

相关推荐

  • 设计教程:成功网站设计的5个步骤

    本文将向您介绍如何设计网站的5个基本步骤,网站设计过程将帮助您成为更高效,更成功的网站设计师。 当今设计行业最重要的因素之一,尤其是自由设计,是一个成功的业务工作流程,用更少的时间做更多事情。为了节省…

    2019年4月11日 个人杂笔
    0378
  • 小编教你php模板教程。

    PHPWind模板是PHPWind论坛系统中的一个核心组件,它负责将用户请求的数据和页面元素进行组合,生成最终的网页内容,使用PHPWind模板可以自定义论坛的外观和布局,使其更符合个人或网站的需求。 下面是关于如何使用P…

    2024年6月28日
    02
  • 聊聊小米三如何刷机。

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

    2024年6月27日
    00
  • 分享使用GHOST备份与还原系统详细步骤(ghost 教程)

    使用GHOST备份与还原系统详细步骤(ghost 教程) Ghost是什么? GHOST运行界面 首先了解一下Ghost是什么东西?ghost是一个分区、硬盘备份还原工具,严格说来它并不是一个专门且来安装系统的工具。它是将一个分区或…

    2022年12月24日 创业分享
    0159
  • 我来说说阿里云速成美站教程。

    阿里云速成美站提供快速搭建网站的服务,通过模板选择、拖拽编辑、一键发布等简单操作,即可创建专业网站。适合中小企业及个人用户使用。 【阿里云·速成美站】是阿里云提供的一款快速建站工具,旨在帮助用户轻松搭…

    2024年6月28日
    00
  • 我的html学习搭建网站教程——DEDECMS程序安装教程

    一、开始安装 1.我们在浏览器中打开http://你的网址/install/index.php ,开始进行安装。(请在安装前,查看install目录下是否有install.lock文件,有的话请删除,同时将index.php.bak重命名为index.php) 2.选中“…

    2017年5月4日 PHP自学教程
    0198
  • 说说闲鱼选品教程是什么。

    同行是最好的学习老师。每天关注几个同行,从他们出售的商品里找灵感,以后他们就是店铺的参谋团。同行能卖的出去商品, 我们也跟着去上架,有很大的概率也能卖出去。闲鱼作为国内最大的二手商品交易平台,拥有过亿…

    2023年10月25日
    01
  • 教你快影怎么剪辑视频-快影剪辑视频教程。

    快影是一款非常受欢迎的视频编辑软件,它的操作简单,功能强大,非常适合初学者使用,下面是一份详细的快影剪辑视频教程: (图片来源网络,侵删) 快影剪辑视频教程 1.1 打开快影应用 你需要在你的手机或电脑上下…

    2024年6月25日
    00

联系我们

QQ:951076433

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