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日

相关文章

  • 一文彻底理解JavaScript原型与原型链

    下面就是详细讲解“一文彻底理解JavaScript原型与原型链”的完整攻略: 一、JavaScript中的原型 JavaScript中的原型(prototype)是指每个函数都有一个prototype属性,它是一个指向对象的指针。prototype指针所指向的对象被称为原型对象。 1.1 构造函数与原型 当一个函数用来作为构造函数时,它所创建的对象都有一个隐…

    other 2023年6月26日
    00
  • BRC20之后又有ORC20谁将是王者?

    BRC20之后又有ORC20谁将是王者?攻略 1. 了解BRC20和ORC20的基本概念 在讨论哪个标准将成为王者之前,我们需要先了解BRC20和ORC20的基本概念。 BRC20:BRC20是Binance智能链(Binance Smart Chain)上的代币标准,类似于以太坊上的ERC20标准。它定义了代币的基本功能和接口,使得代币可以在Binance…

    other 2023年8月18日
    00
  • Vue-router 报错NavigationDuplicated的解决方法

    下面我来为您详细讲解“Vue-router 报错NavigationDuplicated的解决方法”的完整攻略。 什么是NavigationDuplicated错误? 在使用 Vue-router 进行路由跳转时,有时会出现 “NavigationDuplicated” 错误,这是因为 Vue-router 默认情况下禁止在相同的路由间跳转,比如从当前路由 …

    other 2023年6月27日
    00
  • pythontreelib多叉树数据结构中文使用帮助文档

    pythontreelib多叉树数据结构中文使用帮助文档 pythontreelib 是一个 Python 库,提供了多叉树数据结构的实现。本文将详细讲解如何使用 pyontreelib 进行多叉树数据结构的操作。 安装 使用 pythontreelib 进行多叉树数据结构的操作需要先安装该库。可以使用以下命令进行安装: pip install python…

    other 2023年5月9日
    00
  • javascript运算符的优先级

    JavaScript运算符的优先级 在JavaScript中,运算符根据优先级执行。如果有多个运算符在同一表达式中使用,那么优先级高的运算符将在优先级低的运算符之前执行。如果你不了解运算符的优先级,很可能会导致程序出现意想不到的结果。 JavaScript中的运算符根据它们执行的操作类型不同,可以分为以下几类: 算术运算符 比较运算符 逻辑运算符 位运算符 …

    其他 2023年3月28日
    00
  • 微信小程序框架wepy之动态控制类名

    微信小程序框架wepy之动态控制类名攻略 1. 引言 微信小程序框架wepy是一个类Vue语法的框架,它可以帮助开发者更方便地开发和管理小程序应用。其中,动态控制类名是一个常见需求,通过动态控制类名,我们可以在特定条件下改变元素的样式,增强用户交互体验。 2. 动态控制类名的基础知识 在wepy中,我们可以使用条件语句和计算属性来动态控制类名。 2.1 条件…

    other 2023年6月28日
    00
  • CPU损坏导致电脑不断地重启

    当CPU损坏时,电脑会出现不同的症状,其中之一是不断重启。这是因为CPU是电脑的核心组件之一,如果它出现问题,整个系统会受到影响。以下是解决这个问题的完整攻略: 步骤一:排除其它因素 在解决这个问题之前,需要排除其它因素导致的电脑不断重启。可能的原因包括操作系统故障、软件错误、电源问题、内存损坏、硬盘问题等等。因此,需要先逐一排查这些可能的问题。 步骤二:检…

    other 2023年6月27日
    00
  • MySQL变量原理及应用实例

    MySQL变量原理及应用实例攻略 MySQL变量是一种用于存储和操作数据的特殊类型。它们可以在MySQL查询中使用,并且可以存储各种数据类型,如整数、字符串和日期。在本攻略中,我们将详细讲解MySQL变量的原理以及如何在实际应用中使用它们。 1. MySQL变量的原理 MySQL变量是在会话级别中定义和使用的。这意味着变量只在当前会话中可见,并且在会话结束后…

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