elastic job是当当网开源的一个分布式定时任务
1、安装zookeeper,可在官网http://zookeeper.apache.org/下载
2、添加依赖
<properties> <java.version>1.8</java.version> <elastic-job.version>2.1.5</elastic-job.version> <curator.version>2.10.0</curator.version> </properties> <dependency> <artifactId>elastic-job-common-core</artifactId> <groupId>com.dangdang</groupId> <version>${elastic-job.version}</version> </dependency> <dependency> <artifactId>elastic-job-lite-core</artifactId> <groupId>com.dangdang</groupId> <version>${elastic-job.version}</version> </dependency> <dependency> <artifactId>elastic-job-lite-spring</artifactId> <groupId>com.dangdang</groupId> <version>${elastic-job.version}</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-test</artifactId> <version>${curator.version}</version> </dependency>
3、配置zookeeper注册中心
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration; import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author Administrator *@date 2017年9月28日 */ @Configuration @ConditionalOnExpression("'${regCenter.serverList}'.length() > 0") public class RegistryCenterConfig { @Bean(initMethod = "init") public ZookeeperRegistryCenter regCenter(@Value("${regCenter.serverList}") final String serverList, @Value("${regCenter.namespace}") final String namespace) { return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace)); } }
4、持久化配置
import javax.annotation.Resource; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.dangdang.ddframe.job.event.JobEventConfiguration; import com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration; /** * @author Administrator * @date 2017年9月28日 */ @Configuration public class JobEventConfig { @Resource private DataSource dataSource; @Bean public JobEventConfiguration jobEventConfiguration() { return new JobEventRdbConfiguration(dataSource); } }
5、配置文件application.properties配置,配置zookeeper和elastic job的执行时间、分片数、和定义分片参即shardingItemParameter,可以和分片项匹配对应关系,用于将分片项的数字转换为更加可读的业务代码
regCenter.serverList= 127.0.0.1:2181 regCenter.namespace= elastic-job simpleJob.cron=0/5 * * * * ? simpleJob.shardingTotalCount=3 simpleJob.shardingItemParameters=0=A,1=B,2=C
6、任务配置类
import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.chaos.webapi.job.ProfitLossOrderJob; import com.chaos.webapi.job.SpringSimpleJob; import com.dangdang.ddframe.job.api.simple.SimpleJob; import com.dangdang.ddframe.job.config.JobCoreConfiguration; import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration; import com.dangdang.ddframe.job.event.JobEventConfiguration; import com.dangdang.ddframe.job.lite.api.JobScheduler; import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration; import com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler; import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter; /** * @author Administrator *@date 2017年9月28日 */ @Configuration public class SimpleJobConfig { @Resource private ZookeeperRegistryCenter regCenter; @Resource private JobEventConfiguration jobEventConfiguration; @Bean public SimpleJob simpleJob() { return new SpringSimpleJob(); } @Bean public ProfitLossOrderJob pofitLossOrderJob() { return new ProfitLossOrderJob(); } @Bean(initMethod = "init") public JobScheduler simpleJobScheduler(final SimpleJob simpleJob, @Value("${simpleJob.cron}") final String cron, @Value("${simpleJob.shardingTotalCount}") final int shardingTotalCount, @Value("${simpleJob.shardingItemParameters}") final String shardingItemParameters) { return new SpringJobScheduler(simpleJob, regCenter, getLiteJobConfiguration(simpleJob.getClass(), cron, shardingTotalCount, shardingItemParameters), jobEventConfiguration); } private LiteJobConfiguration getLiteJobConfiguration(final Class<? extends SimpleJob> jobClass, final String cron, final int shardingTotalCount, final String shardingItemParameters) { return LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(JobCoreConfiguration.newBuilder( jobClass.getName(), cron, shardingTotalCount).shardingItemParameters(shardingItemParameters).build(), jobClass.getCanonicalName())).overwrite(true).build(); } }
7、任务执行类
import com.dangdang.ddframe.job.api.ShardingContext; import com.dangdang.ddframe.job.api.simple.SimpleJob; /** * @author Administrator *@date 2017年9月28日 */ public class SpringSimpleJob implements SimpleJob { @Override public void execute(final ShardingContext shardingContext){ System.out.println("当前分片:"+shardingContext.getShardingItem()+"---"+shardingContext.getShardingParameter()); } }
8、任务执行结果
扫描二维码关注公众号,回复:
234207 查看本文章
以上只是执行一个简单的打印语句,实际应用可以结合数据库的分库分表完成分片项和业务逻辑的对应关系。