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

相关推荐

  • 我来说说阿里云速成美站教程。

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

    2024年6月28日
    00
  • 我来教你网站结构优化SEO优化系列教程。

    网站结构优化在决定网站内部页面的重要性方面,起着非常关键的作用。例如,合理的内部链接可以对重要页面进行突出和权重传递,清晰的网站结构也可以帮助用户快速获取所需信息:反之,如果网站结构混乱,用户访问就…

    2023年6月20日
    01
  • 我的PHP学习第二十二天之MySQL基础

    MySQL客户端下,操作MySQL的步骤 第一步:连接到MySQL数据库服务器       mysql –uroot -root 第二步:选择要操作的数据库(当前数据库)   use db_name 第三步:设置字符集   set names gbk 第四步:执行SQL语句:增…

    2016年5月14日 PHP自学教程
    0234
  • 教你SEO教程:网站seo优化的基础有哪些。

    很多朋友在拿到一个网站的时候都不知道该网站基础优化是否做到位,只知道排名有没有,因此往往一部分就忽略了网站基础优化,今天小编跟大家聊聊seo教程,网站seo优化的基础有哪些。 网站seo主要做以下8点的基础设置…

    2023年6月19日
    01
  • 我来说说Alma Linux的官方文档和教程在哪里可以找到。

    AlmaLinux 的官方文档和教程可以在其官方网站上找到,以下是详细的信息: (图片来源网络,侵删) AlmaLinux 官方网站 1. 官方网站地址 AlmaLinux 的官方网站地址是 https://almalinux.org/,在这里你可以找到最新…

    2024年6月26日
    00
  • 小编教你酷狗音乐发现好友怎么关闭-酷狗音乐关闭发现好友的教程。

    酷狗音乐发现好友功能可以帮助用户找到与自己兴趣相投的音乐朋友,但如果您觉得这个功能对您来说并不实用,可以按照以下步骤关闭: (图片来源网络,侵删) 1、打开酷狗音乐APP 在您的手机桌面上找到酷狗音乐的图标…

    2024年6月26日
    01
  • 说说inpaint去水印教程。

    使用Inpaint去水印,首先打开Inpaint软件,导入带水印的图片。选择工具栏中的“魔术棒”工具,涂抹在水印区域。点击“处理图像”,等待几秒后,水印将被去除。保存无水印图片即可。 在Windows中,可以使用Paint.NET软件…

    2024年6月27日
    04
  • 小编教你php模板教程。

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

    2024年6月28日
    02

联系我们

QQ:951076433

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