一、简介
xxl-job是通过一个中心式的调度平台,调度多个执行器执行任务,调度中心通过DB锁保证集群分布式调度的一致性,这样扩展执行器会增大DB的压力,但是如果实际上这里数据库只是负责任务的调度执行。但是如果没有大量的执行器的话和任务的情况,是不会造成数据库压力的。实际上大部分公司任务数,执行器并不多(虽然面试经常会问一些高并发的问题)。
相对来说,xxl-job中心式的调度平台轻量级,开箱即用,操作简易,上手快,与SpringBoot有非常好的集成,而且监控界面就集成在调度中心,界面又简洁,对于企业维护起来成本不高,还有失败的邮件告警等等。这就使很多企业选择xxl-job做调度平台。
二、过程
- 新建一个SpringBoot项目,或使用现有的SpringBoot项目;
- maven配置pom.xml,导入相关的依赖
- 编写application.yml,如:项目路径名及端口,mybatisplus配置,mysql多数据源配置。
- 新建DataSourceContextHolder 用于设置,获取,清空 当前线程内的数据源变量。
- 新建 MultipleDataSource 实现 AbstractRoutingDataSource 类。重写determineCurrentLookupKey(),通过DataSourceContextHolder 获取数据源变量,用于当作lookupKey取出指定的数据源。
- 新建DataSourceEnum 用于存放数据源名称。
- 新建注解 DataSource,用于下面aop类中当作切入点来选择数据源。
- 编写aop类 --> DataSourceAspect.java
- 新建并配置以下的三个类
DruidConfiguration:
StatViewServlet 和 WebStatFilter Druid监控配置和监控过滤器。
MybatisplusConfiguration:
mybatisplus 分页插件,SQL执行效率插件;
数据源Bean,MultipleDataSource 注入;
SqlSessionFactory注入;SwaggerConfiguration:
自动生成的接口文档,不需要频繁更新接口文档,保证接口文档与代码的一致。
- 测试mybatis-plus+多数据源配置。
三、项目结构
四、详细步骤
1.新建一个SpringBoot项目,或使用现有的SpringBoot项目;
2.maven配置pom.xml,导入相关的依赖
<properties>
<druid.version>1.1.22</druid.version>
<swagger.version>2.7.0</swagger.version>
</properties>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.1.0</version>
</dependency>
3.编写application.yml,如:项目路径名及端口,mybatisplus配置,mysql多数据源配置。
server:
servlet:
context-path: /ssm-zyy
spring:
datasource:
druid:
db1:
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/student?serverTimezone=UTC
initialSize: 5
minIdle: 5
maxActive: 20
db2:
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/teacher?serverTimezone=UTC
initialSize: 5
minIdle: 5
maxActive: 20
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.xxl.entity
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#mp2.3+ 全局表前缀 mp_
#table-prefix: mp_
#刷新mapper 调试神器
refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
#逻辑删除配置(下面3个配置)
logic-delete-value: 4
logic-not-delete-value: 0
configuration:
#配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
map-underscore-to-camel-case: true
cache-enabled: false
#配置JdbcTypeForNull, oracle数据库必须配置
jdbc-type-for-null: 'null'
4.新建DataSourceContextHolder 用于设置,获取,清空 当前线程内的数据源变量。
package com.xxl.datasource.multiple;
/**
* @Description: 用于设置,获取,清空 当前线程内的数据源变量。
* @author zhuyangyang
*/
public class DataSourceContextHolder {
private st