主要參考elastic-job源碼,整合這個為了接下來任務能動态的進行任務的增删改查
步驟一:建立一個springboot工程(帶web子產品)
步驟二:添加maven依賴
<!-- elastic start -->
<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>
<!-- elastic end -->
步驟三:配置檔案的添加(任務的周期以及zookeeper)
server.port=9091
regCenter.serverList=192.168.1.208:12181
regCenter.namespace=elastic-job-lite-springboot
simpleJob.cron=0/5 * * * * ?
simpleJob.shardingTotalCount=3
simpleJob.shardingItemParameters=0=Beijing,1=Shanghai,2=Guangzhou
接下來是代碼的實作
步驟四:配置類
①注冊中心配置類
package com.threejie.demo.config;
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;
@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));
}
}
②任務的配置類(後面動态添加任務參考這個來進行),這個裡面
JobEventConfiguration這個類目前不知道作用是啥,也不是必須得,用的這個類的地方有好幾個重載的方法,是以先注釋掉
package com.threejie.demo.config;
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;
import com.threejie.demo.jobs.SpringSimpleJob;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
@Configuration
public class SimpleJobConfig {
@Resource
private ZookeeperRegistryCenter regCenter;
//幹什麼用的?
// @Resource
// private JobEventConfiguration jobEventConfiguration;
@Bean
public SimpleJob simpleJob() {
//實作SimpleJob 接口的自己的業務類,在接下的步驟中有
return new SpringSimpleJob();
}
@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();
}
}
步驟五:實作SimpleJob接口的自己的業務類,這個在上面的4.2的配置中的bean中有用到
package com.threejie.demo.jobs;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SpringSimpleJob implements SimpleJob {
@Override
public void execute(final ShardingContext shardingContext) {
System.out.println(String.format("Item: %s | Time: %s | Thread: %s | ThreadName: %s | %s | %s",
shardingContext.getShardingItem(), new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getId(), Thread.currentThread().getName(), "SIMPLE", shardingContext.getJobName()));
int shardingItem = shardingContext.getShardingItem();
if (shardingItem == 0) {
System.out.println(String.format("這是來自 %s 的任務", shardingContext.getShardingParameter()));
} else if (shardingItem == 1) {
System.out.println(String.format("這是來自 %s 的任務", shardingContext.getShardingParameter()));
} else if (shardingItem == 2) {
System.out.println(String.format("這是來自 %s 的任務", shardingContext.getShardingParameter()));
}
}
}
現在就可以運作,其中配置檔案中任務的相關配置有分片數,cron表達式,和個性化參數
elastic-job整合springboot就好了,多起幾個就能看到分片到不同的服務中去。但是寫這個主要是為了動态的進行任務的增删改查,