搭建一个中心化的定时服务
创始人
2024-06-01 15:32:15
0

1. 背景

        在物联网络,很多设备之间都在进行交互,其中云端在远程交流中起到了很重要的作用。比如,一台设备想进行调温,但是需要知道此时房间的温度,那就需要定时去查询传感器测出来的房间温度,如果温度过高,就降低温度, 否则就升高温度。在这个过程中云端就需要对传感器的状态进行监控,其中的定时任务就起到了作用。

什么是定时任务呢?

        定时任务简答来说就是在指定时间内触发执行某个动作,比如早上设备了闹钟,提醒你起床。

2. 定时搭建的方式

2.1.1 Spring提供的注解

SpringBoot应用中,有提供@EnableScheduling@Scheduled来实现定时。其中:

  • @Scheduled注解是SpringBoot提供的⽤于定时任务控制的注解,主要⽤于控制任务在某个指定时间执⾏,或者每隔⼀段时间执⾏。

  • 注意需要配合@EnableScheduling使⽤,定时任务需要在配置类上添加@EnableScheduling,表示对定时任务的支持;在对应执行任务的方法上添加@Scheduled,声明需要执行定时任务的方法。

@Scheduled主要有三种配置执⾏时间的⽅式:cronfixedRatefixedDelay。例子分别是:

  • @Scheduled(cron = "0 0/5 * * * ?") // 每5分钟执行一次
  • @Scheduled(fixedDelay = 10000) // fixedDelay 表示固定延迟时间,上个任务完成后,延迟多长时间执行
  • @Scheduled(fixedRate = 1000 * 60) // 按照一定频率执行任务,每隔1分钟执行一次

2.1.2 具体应用

        使用@Scheduled注解的方式非常简单,首先我们创建一个类,并且加上@Component注解,确保可以被扫描。 然后我们在方法上加上这里要用到的定时任务注解@Scheduled() 其中,有个参数 cron="",是用来写入cron表达式的。

@Component
public class CronJob{// 定义每隔5分钟执行一次“Hello World”打印`@Scheduled`(cron="0 0/5 * * * ?")public void printHWScheduled(){System.out.println("Hello World");}
}

具体的cron表达式练习

具体的cron表达式练习

        除了配置@Scheduled注解,还需要在启动类上添加注解@EnableScheduling,以上两步就可以实现对方法实现定时。

@EnableScheduling
@SpringBootApplication
public class HelloWorldApplication {public static void main(String[] args) {SpringApplication.run(HelloWorldApplication.class, args);}}

综上所述,使用注解的方式在SpringBoot的框架是非常方便实现定时任务的。但是也存在缺点:

  • 不支持集群: 常用于单机系统,如果部署到多台机器的话,会导致同时触发问题。
  • 常用于小型任务:对于大型任务更需要单独任务调度平台,对于频繁更新cron时, 以注解的方式就显得力不从心。

对此接下来介绍一种,轻量化分布式任务调度平台。xxl-job,地址为:

xxl-job项目地址

2.2.1 轻量化分布式任务调度平台 --xxl-job

        XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。该项目在github完全开源,有着丰富的文档、活跃的社区。由于其开箱即用,已经被很多互联网公司接入产品线。

相较于@Scheduled注解,xxl-job有着一下的优点:

  • 操作简单:可以使用Web页面对任务进行更新;
  • 动态:支持动态修改任务状态、启动/停止任务,并且能即时生效;
  • 调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA。

等等,还有其他的优点。

2.2.2 如何搭建调度平台

接下就演示一下,在本地如何搭建一个xxl-job服务。

  • 首先clone项目到本地

在这里插入图片描述

  • 运行sql,建立数据库,建立必要的表
    在这里插入图片描述

在这里插入图片描述

  • 修改xxl-job-admin中的数据库路径

在这里插入图片描述

  • 使用maven对项目进行打包,在终端使用命令:mvn install。如下图所示,生成了一个war包

在这里插入图片描述

  • 这一步需要准备好tomcat服务,将war包放到webapps目录下,然后再bin目录下,点击startup.bat启动tomcat
    在这里插入图片描述

在这里插入图片描述

  • 输入服务的地址:http://localhost:8080/xxl-job-admin-1.9.2/, 账号:admin 12345
    在这里插入图片描述

如果出现了以上的界面,就说明任务调度中心Web界面就搭建完成。

2.2.3 如何使用xxl-job实现定时

接下来讲解下在SpringBoot中如何使用xxl-job

  • 首先在pom.xml中导入依赖
com.xuxuelixxl-job-core2.3.1

  • 新增配置类
package com.xxl.job.executor.core.config;import com.xxl.job.core.executor.XxlJobExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** xxl-job config** @author xuxueli 2017-04-28*/
@Configuration
@ComponentScan(basePackages = "com.xxl.job.executor.service.jobhandler")
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Bean(initMethod = "start", destroyMethod = "destroy")public XxlJobExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobExecutor xxlJobExecutor = new XxlJobExecutor();xxlJobExecutor.setAdminAddresses(adminAddresses);xxlJobExecutor.setAppName(appName);xxlJobExecutor.setIp(ip);xxlJobExecutor.setPort(port);xxlJobExecutor.setAccessToken(accessToken);xxlJobExecutor.setLogPath(logPath);xxlJobExecutor.setLogRetentionDays(logRetentionDays);return xxlJobExecutor;}}

每个配置的含义如下:

/**### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;xxl.job.admin.addresses=http://localhost:8080/xxl-job-admin### 执行器通讯TOKEN [选填]:非空时启用;xxl.job.accessToken=### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册xxl.job.executor.appname=xxl-job-executor-sample### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。xxl.job.executor.address=### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";xxl.job.executor.ip=### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;xxl.job.executor.port=9999### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;xxl.job.executor.logretentiondays=30* @return*/
  • 实现IJobHandler接口,实现execute方法,业务实现就在这里实现。
package com.xxl.job.executor.service.jobhandler;import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/*** 任务Handler示例(Bean模式)** 开发步骤:* 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;* 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例;* 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。* 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;** @author xuxueli 2015-12-19 19:43:36*/
@JobHandler(value="demoJobHandler")
@Component
public class DemoJobHandler extends IJobHandler {@Overridepublic ReturnT execute(String param) throws Exception {XxlJobLogger.log("XXL-JOB, Hello World.");for (int i = 0; i < 5; i++) {XxlJobLogger.log("beat at:" + i);TimeUnit.SECONDS.sleep(2);}return SUCCESS;}}
  • 启动SpringBoot项目,配置

在这里插入图片描述

日志执行:如下显示demoJobHandler已经注册成功,并且执行成功了两次

17:41:34.934 logback [Thread-7] INFO  c.x.j.c.t.ExecutorRegistryThread - >>>>>>>>>>> xxl-job registry success, registryParam:RegistryParam{registGroup='EXECUTOR', registryKey='xxl-job-ex
ecutor-sample', registryValue='10.14.161.30:9999'}, registryResult:ReturnT [code=200, msg=null, content=null]
17:42:04.952 logback [Thread-7] INFO  c.x.j.c.t.ExecutorRegistryThread - >>>>>>>>>>> xxl-job registry success, registryParam:RegistryParam{registGroup='EXECUTOR', registryKey='xxl-job-ex
ecutor-sample', registryValue='10.14.161.30:9999'}, registryResult:ReturnT [code=200, msg=null, content=null]

3. 结语

        综上所述,一共讨论了两种定时的实现方式,所有的操作都是基于SpringBoot框架实现的;每种方式都要自己的优势所在,可以根据自己业务的难易进行选择;以上的步骤亲测可以实现,欢迎留言讨论。

相关内容

热门资讯

安卓手机的rom系统,功能丰富... 你有没有发现,安卓手机的ROM系统就像是一层神秘的面纱,包裹着你的手机,让它焕发出不一样的光彩?今天...
宝马安卓系统音源切换,一触即达 你有没有发现,开宝马的时候,音乐播放的体验也是相当重要的呢?想象当你驾驶着宝马,窗外的风景如画,而车...
安卓怎样删除系统更新,轻松恢复... 手机系统更新了,是不是觉得新功能超酷,但有时候更新后的系统反而有点小闹心?别急,今天就来手把手教你如...
国内安卓系统知乎,知乎视角下的... 你知道吗?在我国,安卓系统可是占据了手机市场的大半壁江山。而关于这个话题,知乎上可是讨论得如火如荼。...
安卓登录linux系统下载,下... 你有没有想过,你的安卓手机竟然能登录Linux系统呢?没错,就是那个在服务器上大显神威的Linux!...
安卓系统怎么弹窗广告,Andr... 你有没有发现,手机上时不时就会跳出来一些广告,让人烦不胜烦?尤其是安卓系统的手机,弹窗广告更是让人头...
安卓系统能运行tomcat,基... 你有没有想过,安卓系统竟然能运行Tomcat?这可不是什么天方夜谭,而是实实在在的技术实现。想象你的...
小米减少安卓系统耗电,深度解析... 你知道吗?最近小米手机界可是掀起了一阵小风波呢!那就是——小米减少安卓系统耗电的大动作!是不是听起来...
原生系统的安卓电视,体验流畅智... 你有没有想过,家里的电视竟然也能像智能手机一样,玩转各种应用和游戏?没错,这就是原生系统的安卓电视的...
老版电脑装安卓系统,探索安卓系... 你有没有想过,那些曾经陪伴我们度过无数时光的老版电脑,现在竟然也能装上安卓系统呢?这可不是天方夜谭,...
安卓系统查看mac地址,安卓系... 你有没有想过,你的安卓手机里隐藏着一个小秘密——那就是它的MAC地址!这个看似普通的数字组合,其实能...
ios系统和安卓系统的比较,全... 你有没有想过,为什么你的手机里装的是苹果的iOS系统,而朋友的手机却是安卓的呢?这两种系统各有各的特...
不是基于安卓的系统,多元化移动... 你知道吗?在科技的世界里,有一种操作系统,它可不是什么安卓哦!今天,就让我带你一起探索这个神秘的世界...
苹果上安卓系统游戏,揭秘跨平台... 你有没有想过,那些在苹果手机上玩得如痴如醉的游戏,竟然也能在安卓系统上畅游?没错,就是那种一触即发、...
安卓鸿蒙苹果系统对比,三大操作... 你有没有发现,现在手机市场上的操作系统之争越来越激烈了?安卓、鸿蒙、苹果,这三个名字几乎成了智能手机...
安卓系统所有暗码大全,暗码大全... 你有没有遇到过那种手机解锁时突然冒出个暗码,让你一头雾水的情况?别急,今天就来给你揭秘安卓系统所有暗...
安卓p原生系统样子,安卓P原生... 你有没有注意到,你的安卓手机最近是不是变得不一样了?没错,就是那个安卓P原生系统,它悄悄地来了,带来...
如何把harmony系统改为安... 你是不是也对Harmony系统有点儿腻味了,想要换换口味,试试安卓系统的魅力呢?别急,今天就来手把手...
郑州安卓会议视频系统,高效便捷... 你有没有想过,在繁忙的会议中,如何让每个人都能清晰地看到演示内容呢?今天,就让我带你走进郑州安卓会议...
安卓平板怎么备份系统,全方位备... 你有没有想过,如果你的安卓平板突然“罢工”了,里面的资料怎么办?别急,今天就来教你怎么备份系统,让你...