天天看點

elastic-job:springboot實作

主要參考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

           

接下來是代碼的實作

elastic-job:springboot實作

步驟四:配置類

①注冊中心配置類

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就好了,多起幾個就能看到分片到不同的服務中去。但是寫這個主要是為了動态的進行任務的增删改查,

繼續閱讀