@Override public void doStart() { String appName = client.getAppName(); String jobClass = getJobClass(); String jobInstancesNodePath = ZkPaths.pathOfJobInstances(appName, jobClass); this.watcher = client.getZk().newChildWatcher(jobInstancesNodePath, new ChildListener() { @Override protected void onAdd(String path, byte[] data) { // fired a new job instance String instanceId = ZkPaths.lastNode(path); if (Strings.isNullOrEmpty(instanceId)) return; // execute the job client.getJobExecutor().execute(Long.valueOf(instanceId), ZkJob.this); } }); }
@Override public void doStart() { executor = Executors.newExecutor(client.getExecutorThreadCount(), 10000, "JOB-EXECUTOR-"); }
@Override public ShardOperateResp call() throws Exception { return client.getHttp().finishJobInstanceShard(shardFinishDto); } }
@Override protected void onAdd(String path, byte[] data) { // fired a new job instance String instanceId = ZkPaths.lastNode(path); if (Strings.isNullOrEmpty(instanceId)) return; // execute the job client.getJobExecutor().execute(Long.valueOf(instanceId), ZkJob.this); } });
protected void checkInvalidInstance(Long instanceId, ZkJob zkJob, ShardOperateRespCode code) { if (code != null){ if (ShardOperateRespCode.needCleanJobInstance(code)){ // clean the dirty zk job instance String jobInstancePath = ZkPaths.pathOfJobInstance(client.getAppName(), zkJob.getJobClass(), instanceId); client.getZk().deleteIfExists(jobInstancePath); } } }
@Override public ShardPullResp call() throws Exception { return client.getHttp().pullJobInstanceShard(jobInstanceId); } }
@Override public ShardOperateResp call() throws Exception { return client.getHttp().returnJobInstanceShard(instanceId, shardId); } }
@Override protected Boolean finishShard(ShardFinishDto shardFinishDto, ZkJob zkJob) { ShardOperateResp finishResp = client.getHttp().finishJobInstanceShard(shardFinishDto); if (finishResp.getSuccess()){ return Boolean.TRUE; } if (ShardOperateRespCode.needFinishAgain(finishResp.getCode())){ // TODO need retry to finish again } return Boolean.TRUE; } }
@Override protected Boolean returnShard(final Long instanceId, final Long shardId, final ZkJob zkJob) { ShardOperateResp returnResp; for(;;){ returnResp = client.getHttp().returnJobInstanceShard(instanceId, shardId); if (returnResp == null){ return null; } if (ShardOperateRespCode.needReturnAgain(returnResp.getCode())){ log.info("retry to push shard(job={}, instanceId={}, shardId={}), resp={}", instanceId, zkJob.getJob(), shardId, returnResp); Sleeps.sleep(RETRY_INTERVAL); continue; } checkInvalidInstance(instanceId, zkJob, returnResp.getCode()); return returnResp.getSuccess(); } }
@Override protected PullShard pullShard(Long instanceId, final ZkJob zkJob) { ShardPullResp pullResp; for(;;){ pullResp = client.getHttp().pullJobInstanceShard(instanceId); if (pullResp == null){ return null; } if (ShardOperateRespCode.needPullAgain(pullResp.getCode())){ log.info("retry to pull shard(job={}, instanceId={}), resp={}", zkJob.getJob(), instanceId, pullResp); Sleeps.sleep(RETRY_INTERVAL); continue; } checkInvalidInstance(instanceId, zkJob, pullResp.getCode()); return pullResp.getPullShard(); } }
@Override protected Boolean finishShard(final ShardFinishDto shardFinishDto, final ZkJob zkJob) { ShardOperateResp finishResp; for(;;){ finishResp = client.getHttp().finishJobInstanceShard(shardFinishDto); if (finishResp == null){ return null; } if (ShardOperateRespCode.needFinishAgain(finishResp.getCode())){ log.info("retry to finish shard(job={}, shardFinishDto={}), resp={}.", shardFinishDto, zkJob.getJob(), finishResp); Sleeps.sleep(RETRY_INTERVAL); continue; } checkInvalidInstance(shardFinishDto.getInstanceId(), zkJob, finishResp.getCode()); return finishResp.getSuccess(); } } }