xxl-job入门
引入
在平时的事务场景中,常常有一些场景需求运用守时使命,比方:
- 时刻驱动的场景:体系需求守时每天0点进行数据备份,体系在某个时刻点发送优惠券,发送短信等等;
- 批量处理数据:批量统计上个月的账单,统计上个月出售数据等等;
- 固定频率的场景:每隔5分钟需求履行一次。
这些场景问题都能够经过使命调度来处理,使命调度指的是体系在约定的指守时刻主动履行指定使命的进程,简略来说,能够理解为规定在何时以何种方法主动去履行使命
在单体体系完成使命调度的方法:
- 多线程
- Timer
- Spring Tasks:@EnableScheduling + @Scheduled
有了上述几种完成使命调度的方法,为什么还需求分布式完成使命调度方法呢?
- 高可用:单机的守时使命只能在一台机器上运转,如果程序或者体系出现异常就会导致功能不可用;
- 防止重复履行:分布式布置多台服务,每台服务有守时使命,如果不进行合理的控制,在同一时刻,只要一个守时使命发动履行,这时,守时履行的成果就可能存在错误和紊乱;
- 单机处理极限:单机处理能力有限
分布式完成使命调度的方法:
xxl-job
- Quartz
- elastic-job
xxl-job
xxl-job完成守时使命能够理解为是经过使命调度渠道
和履行器
相互通信,然后到达完成守时使命的意图。
xxl-job中的两个核心概念:
- 调度渠道:担任办理调度信息,按照调度的装备宣布调度恳求(xxl-job供给可视化界面,程序员直接进入调度渠道按照要求装备即可,无需编写代码)
- 履行器:担任接纳调度恳求,履行调度使命的事务逻辑(由程序员编写代码完成详细履行的逻辑)。履行器发动后要注册到调度中心,接纳调度中心宣布的恳求
xxl-job原理图
xxl-job实战
下载
官网地址:www.xuxueli.com/xxl-job/
到官网下载zip
装备布置调度中心
- 解压下载好的文件,打开/doc/db/tables_xxl_job.sql
- 复制sql,到数据库中履行(以dbeaver为例)
- 将指定文件复制到sql编辑器中,依条履行,履行成功后,会生成一个xxl_job数据库
- 用idea打开下载好的项目xxl-job-master,修正装备文件数据库相关信息,按照自己数据库的地址,账号和密码装备,装备后发动
- 成功发动后,拜访调度中心,拜访地址为:http://localhost:8080/xxl-job-admin,默许登录账号 “admin/123456”
- 登录成功后,进入使命调度中心,主界面如图所示
装备布置履行器
- 创立Springboot项目xxljobDemo,pom文件中增加相关依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- 修正装备文件application.properties,坚持与xxl-job-master中的装备一致,留意需求装备下服务器端口,避免冲突
server.port = 8088
### 调度中心布置根地址 [选填]:如调度中心集群布置存在多个地址则用逗号分隔。履行器将会运用该地址进行"履行器心跳注册"和"使命成果回调";为空则封闭主动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 履行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=default_token
### 履行器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
- 增加xxl-job装备类
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
编写使命
- 新建job包,包下界说SimpleJob类,类中界说详细使命
@Component
public class SimpleJob {
@XxlJob("demoJobHander")
public void demoJobHandler() throws Exception{
System.out.println("履行守时使命,履行时刻:" + new Date());
}
}
- 发动项目xxljobDemo
- 发动成功后,进入使命调度中心设置履行器相关信息
- 装备完成后,发动使命,使命状况由stop–>running状况
经过控制台能够看到,我们规定的使命隔3s履行一次
- 使命中止后,状况由running–>stop
- 能够经过查看日志按钮查看调度日志
这样就完成了一个简略的守时使命!
参考资料
www.xuxueli.com/xxl-job/
developer.aliyun.com/article/775…
www.bilibili.com/video/BV182…
zhuanlan.zhihu.com/p/625060354