package com.hao.job; import com.hao.enums.RequestCode; import com.hao.exception.JobSubmitException; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.concurrent.CountDownLatch; /** * 任务客户端 用来提交任务 * Created by user on * 2016/4/12. */ public class JobClient { private JobTracker jobTracker; private static final Logger LOGGER = LoggerFactory.getLogger(JobClient.class); public JobClient(JobTracker jobTracker) { this.jobTracker = jobTracker; } private void checkField(List<Job> jobs) { if (CollectionUtils.isEmpty(jobs)) { throw new JobSubmitException("job can not be null"); } for (Job job : jobs) { if (job == null) { throw new JobSubmitException("job can not be null"); } else { job.checkField(); } } } public Response submitJob(final List<Job> jobs,SubmitType type) { checkField(jobs); final Response response = new Response(); JobSubmitRequest jobSubmitRequest = new JobSubmitRequest(); jobSubmitRequest.setJobs(jobs); Command requestCommand = Command.createRequestCommand(RequestCode.SUBMIT_JOB.code(),jobSubmitRequest); SubmitCallback submitCallback = new SubmitCallback() { @Override public void call(Command command) { if (command == null) { response.setSuccess(false); response.setMsg("submit job failed "); LOGGER.warn("submit job failed: {} ",jobs); return; } LOGGER.info("submit job success:{}",jobs); response.setSuccess(true); } }; if (SubmitType.ASYNC.equals(type)) { asyncSubmit(requestCommand,submitCallback); } else { syncSubmit(requestCommand,submitCallback); } return response; } private void syncSubmit(Command requestCommand,SubmitCallback submitCallback) { submitCallback.call(jobTracker.invokeSync(requestCommand)); } private void asyncSubmit(Command requestCommand,SubmitCallback submitCallback) { final CountDownLatch latch = new CountDownLatch(1); jobTracker.invokeAsync(requestCommand, new AsyncCallBack() { @Override public void operationComplete(ResponseFuture future) { try { submitCallback.call(future.getCommand()); } finally { latch.countDown(); } } }); } enum SubmitType { SYNC, ASYNC } }