网站规划建设实训报告,营销手段和营销方式,郑州pc网站建设,移动端网站开发流程1. 背景 在物联网络#xff0c;很多设备之间都在进行交互#xff0c;其中云端在远程交流中起到了很重要的作用。比如#xff0c;一台设备想进行调温#xff0c;但是需要知道此时房间的温度#xff0c;那就需要定时去查询传感器测出来的房间温度#xff0c;如果温度过高很多设备之间都在进行交互其中云端在远程交流中起到了很重要的作用。比如一台设备想进行调温但是需要知道此时房间的温度那就需要定时去查询传感器测出来的房间温度如果温度过高就降低温度 否则就升高温度。在这个过程中云端就需要对传感器的状态进行监控其中的定时任务就起到了作用。
什么是定时任务呢 定时任务简答来说就是在指定时间内触发执行某个动作比如早上设备了闹钟提醒你起床。
2. 定时搭建的方式
2.1.1 Spring提供的注解
在SpringBoot应用中有提供EnableScheduling、Scheduled来实现定时。其中 Scheduled注解是SpringBoot提供的⽤于定时任务控制的注解,主要⽤于控制任务在某个指定时间执⾏,或者每隔⼀段时间执⾏。 注意需要配合EnableScheduling使⽤定时任务需要在配置类上添加EnableScheduling表示对定时任务的支持在对应执行任务的方法上添加Scheduled声明需要执行定时任务的方法。
Scheduled主要有三种配置执⾏时间的⽅式cron、fixedRate、fixedDelay。例子分别是
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(cron0 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中导入依赖
dependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactIdversion2.3.1/version
/dependency新增配置类
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.addresseshttp://localhost:8080/xxl-job-admin### 执行器通讯TOKEN [选填]非空时启用xxl.job.accessToken### 执行器AppName [选填]执行器心跳注册分组依据为空则关闭自动注册xxl.job.executor.appnamexxl-job-executor-sample### 执行器注册 [选填]优先使用该配置作为注册地址为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。xxl.job.executor.address### 执行器IP [选填]默认为空表示自动获取IP多网卡时可手动设置指定IP该IP不会绑定Host仅作为通讯实用地址信息用于 执行器注册 和 调度中心请求并触发任务xxl.job.executor.ip### 执行器端口号 [选填]小于等于0则自动获取默认端口为9999单机部署多个执行器时注意要配置不同执行器端口xxl.job.executor.port9999### 执行器运行日志文件存储磁盘路径 [选填] 需要对该路径拥有读写权限为空则使用默认路径xxl.job.executor.logpath/data/applogs/xxl-job/jobhandler### 执行器日志文件保存天数 [选填] 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能xxl.job.executor.logretentiondays30* 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(valuedemoJobHandler)
Component
public class DemoJobHandler extends IJobHandler {Overridepublic ReturnTString 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{registGroupEXECUTOR, registryKeyxxl-job-ex
ecutor-sample, registryValue10.14.161.30:9999}, registryResult:ReturnT [code200, msgnull, contentnull]
17:42:04.952 logback [Thread-7] INFO c.x.j.c.t.ExecutorRegistryThread - xxl-job registry success, registryParam:RegistryParam{registGroupEXECUTOR, registryKeyxxl-job-ex
ecutor-sample, registryValue10.14.161.30:9999}, registryResult:ReturnT [code200, msgnull, contentnull]3. 结语 综上所述一共讨论了两种定时的实现方式所有的操作都是基于SpringBoot框架实现的每种方式都要自己的优势所在可以根据自己业务的难易进行选择以上的步骤亲测可以实现欢迎留言讨论。