elastic-job基本上是对quartz的再封装,并且使用了zookeeper来实现分布式的定时任务,换句话说把ZK当成了数据库,因为ZK里的数据变更时,每个ZK的客户端都能收到响应,天生支持分布式。
elastic-job其实并没有部署一说,只要在应用中引入elastic-job-lite-core包即可,在elastic-job-lite-core的jar包中,封装了对ZK的一系列操作。
elastic-job官方提供了elastic-job-console 运维web应用,用于可视化管理定时任务使用,这个web应用是需要部署的,官方包里也提供了启动脚本,运行脚本启动即可。
先要获取elastic-job-lite-console-2.1.5.tar.gz这个包
获取途径有两种
得到包后,解压。
在其bin目录下有启动脚本start.sh
运行bin/start.sh (默认启动端口8899)就能看到启动日志,访问本地http://localhost:8899 就能看到页面
初始用户写在配置文件里,位置位于conf/auth.properties中。
在简介中说过,其实Elastic job就是把ZK当数据库用,定时任务的详情都是直接写在ZK上的,所以这个控制台页面启动后不需要任何依赖
先在其注册中心配置中,新增你应用elastic-job的zk地址和命名空间,具体图如下,新增好后选择连接,至此,控制台的部署相关就已经全部搞定了(就是这么简单,不要想的很麻烦,配好地址,能连上ZK,就相当于连上了数据库)
如果你实际的应用已经启动了(具体看下节,在spring-boot中集成elastic-job),并且配置了定时任务,那么在其控制台的作业操作页面中,就可以看到你的定时任务列表了。
首先通过maven引入所用到的jar包 最新版本2.1.5
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>${elastic-job.version}</version>
<exclusions>
<exclusion>
<artifactId>curator-client</artifactId>
<groupId>org.apache.curator</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>${elastic-job.version}</version>
</dependency>
配置文件如下为yml格式
# elastic-job 配置
timejob:
regCenter :
serverList : zk地址
namespace : elastic-job-rim
schedule:
disabled : false
# 删除消息定时任务配置
message :
cron: 0 30 5 * * ?
monitorPort : 9990
首先要配置zk注册中心,因为elastic job分布式是基于zk的。
@Configuration
@ConditionalOnProperty("${timejob.regCenter.serverList}")
public class RegistryCenterConfig {
@Bean(initMethod = "init")
public ZookeeperRegistryCenter regCenter(@Value("${timejob.regCenter.serverList}") final String serverList, @Value("${timejob.regCenter.namespace}") final String namespace) {
return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));
}
}
配置定时任务时间追踪,注入datesource
@SuppressWarnings("SpringJavaAutowiringInspection")
@Configuration
@ConditionalOnBean(RegistryCenterConfig.class)
public class JobEventConfig {
@Resource
private DataSource dataSource;
@Bean
public JobEventConfiguration jobEventConfiguration() {
return new JobEventRdbConfiguration(dataSource);
}
}
接下来是真正的定时任务配置,将前两个配置的bean注入进来
@SuppressWarnings("SpringJavaAutowiringInspection")
@Configuration
@ConditionalOnBean(RegistryCenterConfig.class)
public class JobConfig {
@Resource
private ZookeeperRegistryCenter regCenter;
@Resource
private JobEventConfiguration jobEventConfiguration;
@Bean(initMethod = "init", name = "taskScheduler") //任务的名称,
public JobScheduler taskScheduler(final MsgTimingClearTask msgTimingClearTask,
@Value("${timejob.schedule.message.cron}") final String cron,
@Value("${timejob.schedule.disabled}") final boolean disabled,
@Value("${timejob.schedule.message.monitorPort}") final int monitorPort) {
//第一个参数为定义的定时任务类,通过spring注入
return new SpringJobScheduler(task, regCenter, getLiteJobConfiguration(Task.getClass(),
cron, disabled, monitorPort), jobEventConfiguration);
}
private LiteJobConfiguration getLiteJobConfiguration(final Class<? extends SimpleJob> jobClass,
final String cron,
final boolean disabled,
final int monitorPort) {
return LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(JobCoreConfiguration.newBuilder(
jobClass.getName(), cron, 1).build(), jobClass.getCanonicalName()))
.overwrite(true).disabled(disabled).monitorPort(monitorPort).build();
}
}
真正实现的任务类
@Component
public class Task implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
//业务代码
}
}