1. 程式人生 > >spring boot elastic job 整合

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,可解決!!