ElasticJob 曾作为当当旗下的开源产品大受欢迎,和 xxl-job 一样都是基于 Quartz 实现的定时调度平台。后来停止运维了几年,最近两年又开始重新维护并成为了 apache 的子项目。
官网地址
根据官网的介绍,Elasticjob具有以下功能(包含开发中的功能):
JAVA | Java 8 及其以上版本 |
MAVEN | 3.5.0及其以上版本 |
Zookeeper | 3.6.0及其以上版本 |
...
<dependency>
<groupId>org.apache.shardingsphere.elasticjob</groupId>
<artifactId>elasticjob-lite-spring-boot-starter</artifactId>
<version>3.0.1</version>
</dependency>
...
简单作业
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.elasticjob.api.ShardingContext;
import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class MyElasticJob implements SimpleJob {
/**
* 要调度的具体任务,时间段轮循
*/
@Override
public void execute(ShardingContext shardingContext) {
log.info(String.format("定时任务-测试%s %s %d",shardingContext.getJobName(),shardingContext.getTaskId() ,shardingContext.getShardingItem()));
}
}
数据流作业
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.elasticjob.api.ShardingContext;
import org.apache.shardingsphere.elasticjob.dataflow.job.DataflowJob;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Slf4j
@Component
public class SpringBootDataflowJob implements DataflowJob<String> {
@Override
public List<String> fetchData(final ShardingContext shardingContext) {
List<String> dex = new ArrayList<>();
dex.add(UUID.randomUUID().toString());
dex.add(UUID.randomUUID().toString());
dex.add(UUID.randomUUID().toString());
return dex;
}
@SneakyThrows
@Override
public void processData(final ShardingContext shardingContext, final List<String> data) {
for (String each : data) {
log.info(String.format("定时任务-测试%s %s %d %s",shardingContext.getJobName(),shardingContext.getTaskId() ,shardingContext.getShardingItem(),each));
}
}
}
环境配置文件中添加配置:spring.profiles.include=job
server:
port: 15999
spring:
profiles:
include: job
application:
name: elastic-service
datasource:
url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/elastic_job?serverTimezone=GMT%2B8&autoReconnect=true&useUnicode=true&characterEncoding=UTF8&useSSL=false
driverClassName: com.mysql.cj.jdbc.Driver
username: root
password: password
添加application-job.yml
elasticjob:
reg-center:
serverLists: 127.0.0.1:2181
namespace: elastic-job-lite
base-sleep-time-milliseconds: 1000
max-sleep-time-milliseconds: 3000
max-retries: 3
jobs:
testJobCronTrigger1:
elasticJobClass: com.dm.cloud.tasks.MyElasticJob
cron: 0/15 * * * * ?
timeZone: GMT+08:00
shardingTotalCount: 3
shardingItemParameters: 0=0,1=1,2=2
testJobCronTrigger2:
elasticJobClass: com.dm.cloud.tasks.SpringBootDataflowJob
cron: 0 0/30 * * * ?
timeZone: GMT+08:00
shardingTotalCount: 1
shardingItemParameters: 0=0
启动项目等待作业运行
可以启动多个项目键查看分片执行是否正常
下载源码
正常按照官方提示就操作就可以了
但是我这里失败了。。。
原因大致是因为在处理前端的时候时候缺各种命令,搜索之后无果,本人对前端环境这块接触较少,而且要添加 mysql 的 jdbc 驱动,要不然前端UI界面选不到mysql驱动,添加不了mysql数据源,最后决定自己修改代码打包发布。
修改pom文件,添加mysql数据驱动,修改maven扩展
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
</dependencies>
...
<build>
<finalName>shardingsphere-elasticjob-lite-ui</finalName>
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
修改 application.properties,这一句解屏蔽,并添加 com.mysql.cj.jdbc.Driver
## Uncomment the following property to allow adding DataSource dynamically.
dynamic.datasource.allowed-driver-classes={'org.h2.Driver','org.postgresql.Driver','com.mysql.cj.jdbc.Driver'}
执行命令打包
mvn clean package -Dmaven.test.skip=true
然后 java -jar 启动服务
前端打包
cd ./shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend
npm install
npm run build
然后会生成一个 dist 文件夹。
用 nginx 发布一下服务
server{
listen 2137;
server_name elastic.test.com;
location / {
root E:/,,,0PersonalPro/elasticjob/shardingsphere-elasticjob-ui/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/dist;
index index.html;
}
location ^~ /api/{
proxy_pass http://127.0.0.1:8088/api/;
}
}
访问 http://localhost:2137/#/data-source
默认用户名密码 root root
添加注册中心
添加事件追踪
这里的 mysql 驱动就是我们通过修改代码后添加的,默认只有 h2 和 postgresql
作业维度
可以查看作业状态等信息,也可以修改作业配置
服务器纬度
可以查看服务器作业信息
历史轨迹,历史状态
查看作业的执行记录
1、代码修改配置文件不生效
我出现的问题是在数据库连接上没有配置时区,导致历史记录里面的时间总是少八个小时
链接上添加serverTimezone=GMT%2B8 ,设置为东八区一般就没有问题了。
但是我修改之后时间仍不正确,最后通过清空 zookeeper 里面当前 namespace下的所有节点才好。
deleteall /elastic-job-lite