SpringBoot使用SchedulingConfigurer实现多个定时任务多机器部署问题(推荐)

下面将详细讲解如何使用SchedulingConfigurer实现多个定时任务多机器部署的方法。

什么是SchedulingConfigurer

SchedulingConfigurer是Spring框架中的一个接口,用于配置定时任务的线程池和任务注册中心等。通过实现该接口,我们可以自定义定时任务的配置信息。

实现多个定时任务多机器部署的步骤

下面是实现多个定时任务多机器部署的详细步骤:

1. 实现SchedulingConfigurer接口

@Configuration
@EnableScheduling
public class ScheduledConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                //定时任务的业务逻辑代码
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //定时任务的执行时间
            }
        });
        //注册其他定时任务...
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10);
    }
}

2. 配置定时任务执行时间

定时任务的执行时间可以通过Trigger接口的nextExecutionTime方法进行配置。我们可以根据自己的业务需求来选择不同的执行方式,例如:

固定时间间隔执行任务

new Trigger() {
    @Override
    public Date nextExecutionTime(TriggerContext triggerContext) {
        //当前时间
        Date currentTime = new Date();
        //下一次执行时间,固定间隔5秒
        Date nextExecutionTime = new Date(currentTime.getTime() + 5000);
        return nextExecutionTime;
    }
}

根据cron表达式执行任务

new CronTrigger("0/10 * * * * ?");

3. 部署多个实例

如果需要在多台机器上部署定时任务,需要确保每台机器上的任务执行时间是一致的,并且不会出现重复执行的情况。为了解决这个问题,我们可以使用Redis作为任务注册中心,使用RedisLock来保证任务在多台机器上的唯一性。

@Configuration
@EnableScheduling
public class ScheduledConfig implements SchedulingConfigurer {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                //获取分布式锁
                DistributedLock lock = new RedisLock(stringRedisTemplate, "task-lock");
                if (lock.tryLock()) {
                    try {
                        //定时任务的业务逻辑代码
                    } finally {
                        //释放分布式锁
                        lock.unlock();
                    }
                }
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //当前时间
                Date currentTime = new Date();
                //下一次执行时间,固定间隔5秒
                Date nextExecutionTime = new Date(currentTime.getTime() + 5000);
                return nextExecutionTime;
            }
        });
        //注册其他定时任务...
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10);
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        return new StringRedisTemplate(factory);
    }
}

上面的代码中,我们使用RedisLock来获取分布式锁,保证在多台机器上只有一个任务能够执行。同时,我们使用Redis作为任务注册中心,确保任务的执行时间是一致的。

示例说明

下面我们通过两个示例说明如何使用SchedulingConfigurer实现多个定时任务多机器部署的方法。

示例一:使用固定时间间隔执行任务

我们定义一个定时任务,在每隔5秒钟执行一次,并打印当前任务的执行时间。

@Configuration
@EnableScheduling
public class ScheduledConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                System.out.println("当前时间:" + new Date());
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //当前时间
                Date currentTime = new Date();
                //下一次执行时间,固定间隔5秒
                Date nextExecutionTime = new Date(currentTime.getTime() + 5000);
                return nextExecutionTime;
            }
        });
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10);
    }
}

示例二:使用cron表达式执行任务

我们定义一个定时任务,在每分钟的0秒、10秒、20秒、30秒、40秒和50秒执行一次,并打印当前任务的执行时间。

@Configuration
@EnableScheduling
public class ScheduledConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                System.out.println("当前时间:" + new Date());
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //使用crontab表达式
                String cron = "0/10 * * * * ?";
                CronTrigger trigger = new CronTrigger(cron);
                return trigger.nextExecutionTime(triggerContext);
            }
        });
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10);
    }
}

上面的示例代码中,我们通过使用SchedulingConfigurer来实现了多个定时任务多机器部署的功能,并且分别通过固定时间间隔和cron表达式两种方式来执行定时任务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot使用SchedulingConfigurer实现多个定时任务多机器部署问题(推荐) - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • SQL 在自增列插入指定数据的操作方法

    以下是关于SQL在自增列插入指定数据的操作方法的完整攻略,包含两个示例说明: 1. 使用SET IDENTITY_INSERT语句 在插入数据时,可以使用SET IDENTITY_INSERT语句来允许插入指定的自增列值。首先,需要将目标表的IDENTITY_INSERT属性设置为ON,然后插入指定的自增列值,最后将IDENTITY_INSERT属性设置为O…

    other 2023年10月19日
    00
  • flycotablayout从头到脚

    以下是FlycoTabLayout从头到脚的完整攻略,包括步骤、示例和注意事项: FlycoTabLayout从头到脚攻略 FlycoTabLayout是一个Android TabLayout库,它提供了多种样式和自定义选项。以下是详细的攻略: 步骤 以下是使用FlycoTabLayout步骤: 添加依赖项。 在项目的build.gradle文件中添加以下依…

    other 2023年5月7日
    00
  • Elasticsearch配置文件示例示范

    下面是关于“Elasticsearch配置文件示例示范”的完整攻略: 什么是Elasticsearch配置文件 Elasticsearch是一款开源的全文搜索引擎,其配置文件是一个YAML格式的文件,被称为elasticsearch.yml。此配置文件中包含了与Elasticsearch实例有关的各种设置。 如何修改Elasticsearch配置文件 找到E…

    other 2023年6月25日
    00
  • Spring的自动装配Bean的三种方式

    Spring的自动装配Bean的三种方式 在Spring框架中,自动装配是一种方便的方式,用于将依赖关系注入到Bean中。Spring提供了三种主要的自动装配方式,分别是:构造函数自动装配、属性自动装配和基于注解的自动装配。 1. 构造函数自动装配 构造函数自动装配是通过构造函数来实现依赖注入的方式。Spring容器会根据构造函数的参数类型和名称来自动装配相…

    other 2023年8月6日
    00
  • iOS如何定义名为任意的变量详解

    当涉及到iOS中如何定义名为任意的变量时,以下是一个完整的攻略,其中包含两个示例说明。 … 变量定义 在iOS开发中,可以使用以下语法来定义一个变量: var variableName: DataType var关键字用于声明一个变量。 variableName是你给变量起的名字。 DataType是变量的数据类型。 以下是一个示例,展示了如何定义一个整…

    other 2023年8月10日
    00
  • 微信小程序自定义导航栏及其封装的全过程

    下面我将为您详细讲解“微信小程序自定义导航栏及其封装的全过程”的完整攻略。 导航栏简介 微信小程序中,导航栏一般分为两种类型:系统默认导航栏和自定义导航栏。默认导航栏的样式和功能都是微信小程序自带的,而自定义导航栏则是开发者可以根据自己的喜好自由定义的,同时自定义导航栏也具有更强的灵活性和可扩展性。 自定义导航栏实现步骤 以下是实现自定义导航栏的具体步骤: …

    other 2023年6月25日
    00
  • Redis使用RedisTemplate模板类的常用操作方式

    RedisTemplate是Spring框架提供的一个用于操作Redis的模板类,它提供了丰富的API,可以方便地进行Redis的操作。常用的操作方式包括: 连接Redis服务器 在使用Redis时,首先需要创建RedisTemplate对象,并设置连接工厂。连接工厂分为JedisConnectionFactory和LettuceConnectionFact…

    other 2023年6月27日
    00
  • C语言数据结构之单向链表详解分析

    C语言数据结构之单向链表详解分析 什么是单向链表? 单向链表是一种常见的数据结构,它由一系列节点(或称单元)组成,每个节点都包含两个数据域:数据和指针。其中,数据用于存储具体的数据信息,指针则用于指向下一个节点。这样,一个链表就可以看做是由一个一个节点链接而成的数据结构。而单向链表中的指针只能指向下一个节点,因此被称为单向链表。 如何使用单向链表? 单向链表…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部