elastic job搭建以及集成到spring boot项目

Elastic job 分布式定时任务框架

Elastic job 简介

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 控制台部署及使用

先要获取elastic-job-lite-console-2.1.5.tar.gz这个包
获取途径有两种

  1. 从elastic-job github官方https://github.com/elasticjob/elastic-job-lite/releases 上下载最新的release版本的源码,maven编译获得
  2. 从小网站上下别人已经编译好的包(吐槽一下,官方连打好的包都不给地方下载)。

得到包后,解压。
在其bin目录下有启动脚本start.sh
运行bin/start.sh (默认启动端口8899)就能看到启动日志,访问本地http://localhost:8899 就能看到页面
初始用户写在配置文件里,位置位于conf/auth.properties中。

在简介中说过,其实Elastic job就是把ZK当数据库用,定时任务的详情都是直接写在ZK上的,所以这个控制台页面启动后不需要任何依赖
先在其注册中心配置中,新增你应用elastic-job的zk地址和命名空间,具体图如下,新增好后选择连接,至此,控制台的部署相关就已经全部搞定了(就是这么简单,不要想的很麻烦,配好地址,能连上ZK,就相当于连上了数据库)
elastic job搭建以及集成到spring boot项目_第1张图片
如果你实际的应用已经启动了(具体看下节,在spring-boot中集成elastic-job),并且配置了定时任务,那么在其控制台的作业操作页面中,就可以看到你的定时任务列表了。

在spring-boot中集成elastic-job

引入jar包

首先通过maven引入所用到的jar包 最新版本2.1.5

pom

        <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>

java config配置注入bean

配置文件如下为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) {
		//业务代码
	}
}

Elastic job 集成问题记录

  1. spring启动报错 Specified key was too long; max key length is 767 bytes
    elastic job 会将任务的相关信息写到配置的数据库中,并且会在自动创建的job_status_trace_log表中创建TASK_ID_STATE_INDEX索引,如果mysql使用的是UTF-MB4字符集,就会超出索引默认的大小限制,这时可以手动创建索引解决
    CREATE INDEX TASK_ID_STATE_INDEX ON job_status_trace_log(task_id(191),state);

你可能感兴趣的:(spring,boot)