环境搭建
1.下载zookeeper并解压
执行解压目录下的bin/zkServer.cmd,如果出现闪退的情况,到解压目录的config下把zoo_sample.cfg改成zoo.cfg并修改配置文件中的dataDir的值
2.创建maven项目
导入依赖:
<properties>
<project.build.sourceEncoding>UTF‐8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF‐8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
</dependencies>
<build>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
3.编写代码
编写定时任务类FileBackupJob,该类需要实现SimpleJob
public class FileBackupJob implements SimpleJob {
//每次执行任务要备份的文件数量
private final int FETCH_SIZE = 1;
//文件列表(模拟
public static List<FileCustom> files = new ArrayList<FileCustom>();
/**
* 任务调度执行方法
* @param shardingContext
*/
@Override
public void execute(ShardingContext shardingContext) {
//作业切片信息
int shardingItem = shardingContext.getShardingItem();
System.out.println(String.format("作业分片:%d",shardingItem));
//获取未备份的文件
List<FileCustom> fileCustoms = fetchUnBackupFiles(FETCH_SIZE);
//备份文件
backupFiles(fileCustoms);
}
//获取未备份的文件
public List<FileCustom> fetchUnBackupFiles(int count){
List<FileCustom> fetchList = new ArrayList<>();
int num = 0;
for(FileCustom fileCustom : files){
if (num >= count) {
break;
}
//未备份的文件则放入列表
if (!fileCustom.getBackedUp()){
fetchList.add(fileCustom);
num++;
}
}
//ManagementFactory.getRuntimeMXBean获取当前jvm进程的pid
System.out.println(String.format("%sTime:%s,已获取%d文件",
ManagementFactory.getRuntimeMXBean().getName(),new SimpleDateFormat("hh:mm:ss").format(new
Date()),num));
return fetchList;
}
/**
* 备份文件
* @param files
*/
public void backupFiles(List<FileCustom> files){
for (FileCustom file : files) {
//标记文件数据已备份
file.setBackedUp(Boolean.TRUE);
System.out.println(String.format("已备份文件:%s 文件类型:%s",file.getName(),file.getType()));
}
}
}
文件实体类FileCustom如下:
@Data
public class FileCustom {
private String id;
/**
* 文件名
*/
private String name;
/**
* 文件类型,如text、image、radio、vedio
*/
private String type;
/**
* 文件内容
*/
private String content;
/**
* 是否已备份
*/
private Boolean backedUp = false;
public FileCustom(String id,String name,String type,String content){
this.id = id;
this.name = name;
this.type = type;
this.content = content;
}
}
启动类:
public class JobMain {
//zookeeper端口
private static final int ZOOKEEPER_PORT = 2181;
//zookeeper链接字符串 localhost:2181
private static final String ZOOKEEPER_CONNECTION_STRING = "localhost:" + ZOOKEEPER_PORT;
//定时任务命名空间
private static final String JOB_NAMESPACE = "elastic-job-example-java";
//启动任务
public static void main(String[] args) {
//生成测试文件
generateTestFiles();
//配置zookeeper
CoordinatorRegistryCenter registerCenter = setUpRegisterCenter();
//启动任务
startJob(registerCenter);
}
/**
* 配置注册中心
* @return
*/
public static CoordinatorRegistryCenter setUpRegisterCenter(){
//注册中心配置
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(ZOOKEEPER_CONNECTION_STRING, JOB_NAMESPACE);
//减少zk的超时时间 防止链接超时
zookeeperConfiguration.setSessionTimeoutMilliseconds(10000000);
//创建注册中心
ZookeeperRegistryCenter registryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
registryCenter.init();
return registryCenter;
}
/**
* 配置并启动任务
*/
public static void startJob(CoordinatorRegistryCenter registryCenter){
//创建jobCoreConfiguration
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration
.newBuilder("files-job", "0/3 * * * * ?", 3)//作业改成3片执行
.build();
//创建simpleJobConfiguration
SimpleJobConfiguration simpleJobConfiguration = new
SimpleJobConfiguration(jobCoreConfiguration, FileBackupJob.class.getCanonicalName());
//启动任务
new JobScheduler(registryCenter, LiteJobConfiguration.newBuilder(simpleJobConfiguration)
.overwrite(true).build()).init();
}
/**
* 生成测试文件
*/
private static void generateTestFiles(){
for (int i=1; i<11; i++) {
FileBackupJob.files.add(new FileCustom(String.valueOf(i+10),"文件"+
(i+10),"text","content"+ (i+10)));
FileBackupJob.files.add(new FileCustom(String.valueOf(i+20),"文件"+
(i+20),"image","content"+ (i+20)));
FileBackupJob.files.add(new FileCustom(String.valueOf(i+30),"文件"+
(i+30),"radio","content"+ (i+30)));
FileBackupJob.files.add(new FileCustom(String.valueOf(i+40),"文件"+
(i+40),"vedio","content"+ (i+40)));
}
}
}
如果我们将作业分片执行,作业将被拆分为多个独立的任务项,然后由分布式的应用实例分别执行某一个或几个分片项。
//创建jobCoreConfiguration
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration
.newBuilder(“files-job”, “0/3 * * * * ?”, 3)//作业改成3片执行
.build();
同时启动三个窗口,每个窗口分别执行一片作业。