spring boot elastic job 整合
1、引入jar
<dependency>
<groupId>com.github.kuhn-he</groupId>
<artifactId>elastic-job-lite-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
該jar 是有當當網elastic job封裝升級的jar
2、建立job執行類
@Component
@Slf4j
@ElasticSimpleJob(cron= "* * * * * ?",jobName="test123",shardingTotalCount=2,jobParameter="測試引數",shardingItemParameters="0=A,1=B")
public class MySimpleJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
log.info("itemId={}", shardingContext.getShardingItem());
}
}
cron:定時執行規則,可以參考:https://www.cnblogs.com/lazyInsects/p/8075487.html啟動spring boot,定時任務即啟動
3、定時任務name,取得是類的全路徑
4、shardingTotalCount=2,將定時任務分成兩個片區,如果一臺server執行,那麼兩個片區都由改server執行
列印結果:
2018-07-13 17:17:14.204 INFO 88070 --- [g.MySimpleJob-1] c.f.t.e.config.MySimpleJob : itemId=0 2018-07-13 17:17:14.205 INFO 88070 --- [g.MySimpleJob-2] c.f.t.e.config.MySimpleJob : itemId=1 2018-07-13 17:17:15.175 INFO 88070 --- [g.MySimpleJob-4] c.f.t.e.config.MySimpleJob : itemId=0 2018-07-13 17:17:15.175 INFO 88070 --- [g.MySimpleJob-3] c.f.t.e.config.MySimpleJob : itemId=1 2018-07-13 17:17:16.168 INFO 88070 --- [g.MySimpleJob-6] c.f.t.e.config.MySimpleJob : itemId=0 2018-07-13 17:17:16.168 INFO 88070 --- [g.MySimpleJob-5] c.f.t.e.config.MySimpleJob : itemId=1
此時只有一個server節點在zk註冊,任務全部由該server執行
如果有多臺server接入,如 server:server1,server2
那麼server1得到分片itemId=0,server2分片itemid=1.
如果兩臺server,分成6片,或者7片
shardingItemParameters="0=A,1=B,2=C,3=D,4=E,5=F"
那麼分片情況
server1:0,1,2
server2:3,4,5
或者分成7片:shardingItemParameters="0=A,1=B,2=C,3=D,4=E,5=F,6=G"
server1:0,1,2
server2:3,4,5,6
如果當server1或者server2宕機,那麼會重新選舉,重新負載任務到可用server
預設shardingTotalCount=1,由其中一臺主server執行,其他為福server,當主server宕機,副server會頂替。
5、elastic-job定位為分散式定時任務,當任務數量級非常大的時候,可以根據需要加機器,解決定時任務原有序列執行效率問題,在解決中可以根據itemId對資料進行分組,解決重複執行問題。
6、動態改變任務屬性
1)、zk註冊工具類
@Configuration
public class ZKConfigRegister {
@Bean(initMethod = "init", name = "zookeeperRegistryCenter")
public ZookeeperRegistryCenter zookeeperRegistryCenter(@Value("${elaticjob.zookeeper.server-lists}")final String zkServerList, @Value("${elaticjob.zookeeper.namespace}") final String namespace) {
return new ZookeeperRegistryCenter(new ZookeeperConfiguration(zkServerList, namespace));
}
}
2)、動態執行工具類
@RestController
@Slf4j
public class DynamicJobController {
@Resource(name = "zookeeperRegistryCenter")
private ZookeeperRegistryCenter zookeeperRegistryCenter;
@RequestMapping("/dynamic_job")
public String home(){
int shardingTotalCount = 2;
String jobName = UUID.randomUUID().toString() + "-test";
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(jobName, "* * * * * ?", shardingTotalCount).shardingItemParameters("0=A,1=B,2=C").build();
SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, MySimpleJob.class.getCanonicalName());
JobScheduler jobScheduler = new JobScheduler(zookeeperRegistryCenter, LiteJobConfiguration.newBuilder(simpleJobConfiguration).build());
try {
jobScheduler.init();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("定時任務建立失敗");
}
return "success";
}
}
雖然可以動態更改任務屬性,但是前提是任務必須是之前就存在,而且新增的任務和之前的已存在的任務沒有任何關聯,依舊各自執行
server1:0
server2:1
dynamic:
server1:0
server2:1
server2:0,1,2(動態改動的定時任務只會會改動之後,釋出的server生效)
7、如果要改原有定時任務,原有server1,server2,server3,
現在只需要改server1程式碼,釋出,此時server2,server3 指定總數和分片都會更新
8、發現問題shardingTotalCount=2,shardingItemParameters="0=A,1=B,2=C",serverCount=2
執行結果
server1:0-A
server2:1-B
C未執行
解決辦法:shardingTotalCount=3,可解決!!