一个作业多个任务调度例子

/**
 * 
* @ClassName: MetaStreamSetTask
* @Description: TODO(这里用一句话描述这个类的作用)
* @author caozq
* @date 2018年10月24日
 */
public class MetaStreamSetTask extends SingleTaskJob {
	
    private static final long serialVersionUID = 1L;
     
    protected final AEMarker marker = LogMakerFactory.getExtractLogMarker();
    
    private JobContext jobCtxt;
    private List<DwEtlJobVO> vos;
    private int maxWeight = -1;

    public MetaStreamSetTask(JobContext jobCtxt) {
        super();
        this.jobCtxt = jobCtxt;
        this.init();
    }

    private void init() {
    	vos = putWeightForJob(jobCtxt.getBusinessId());
    	maxWeight = getMaxWeight(vos);
    }

    @Override
    public String getTaskName() {
    	AELogger.info(marker, "调度作业用到的所有信息("+vos.get(0).getName()+")");
        return "调度作业用到的所有信息("+vos.get(0).getName()+")";
    }

    @Override
    public TaskResult execute() {
    	String flag;
        try {
        	List<DwEtlJobVO> voTemp = null;
        	while(maxWeight >=0){
        		voTemp = vos.stream().filter(x -> x.getWeightNum() == maxWeight)
        				.distinct().collect(Collectors.toList());
        		if(null != voTemp){
        			AELogger.info(marker, "开始调度Task("+voTemp.toString()+")");
        			CountDownLatch counter = new CountDownLatch(voTemp.size());
        			flag = exeTaskThread(voTemp,counter);
        			if(StringUtils.isNotEmpty(flag)){
        				AELogger.info(marker, "Task:"+voTemp.get(0).getPkTask()+"出现错误--"+flag);
        				counter.countDown();
            			break;
            		}else{
            			counter.await();
            		}
        			AELogger.info(marker, "结束调度Task("+voTemp.toString()+")");
        		}
        		maxWeight --;
        	}
        	//调度失败需要处理其他事情
        	if(maxWeight >0){
        		return TaskResult.failureResult("作业调度出现问题");
        	}
            ExtractResult result = new ExtractResult(ExtractResultStatus.SUCCESS,"SUCCESS");
            if (result.getStatus() == ExtractResultStatus.SUCCESS) {
                return TaskResult.sucessResult(result.getMsg());
            }
            return TaskResult.failureResult("作业作业执行返回结果为null");
        } catch (Exception e) {
            AELogger.error(LogMakerFactory.getExtractLogMarker(), "调度作业(" + vos.toString() + ")发生异常:", e);
            return TaskResult.failureResult("调度作业(" + vos.toString() + ")发生异常:", e);
        }
    }
    
    /**
     * 
    * @Title: putWeightForJob
    * @Description: TODO(获取job的执行优先级)
    * @param @param businessId
    * @param @return    参数
    * @return List<DwEtlJobVO>    返回类型
    * @throws
     */
    private List<DwEtlJobVO> putWeightForJob(String businessId){
        IDwEtlJobService dwEtlJobService = DwSpringContextHolder.getBean(IDwEtlJobService.class);
        List<DwEtlJobVO> temp = dwEtlJobService.getVOByBussinessID(businessId);
        List<DwEtlJobVO> weightJob = new ArrayList<DwEtlJobVO>();
        DwEtlJobVO postfix = null;
        for(DwEtlJobVO vo:temp){
        	if(vo.getAssemblyTask().trim().equals(DwConst.JOB_POSTFIX)){
        		postfix = vo;
        		vo.setWeightNum(0);
        		weightJob.add(vo);
        	}
        }
        if(null != temp && temp.size()>0){
        	getChildNode(weightJob,postfix, temp);
        }
        return weightJob;
    }
    /**
     * 
    * @Title: getChildNode
    * @Description: TODO(递归处理)
    * @param @param weightJob
    * @param @param postfix
    * @param @param temp
    * @param @return    参数
    * @return List<DwEtlJobVO>    返回类型
    * @throws
     */
    private List<DwEtlJobVO> getChildNode(List<DwEtlJobVO> weightJob,DwEtlJobVO postfix, List<DwEtlJobVO> temp) {
		List<DwEtlJobVO> childList = null;
		for (DwEtlJobVO vo : temp) {
			if (!vo.getAssemblyTask().trim().equals(DwConst.JOB_POSTFIX)) {
				if (postfix.getPkTask().trim().equals(vo.getAssemblyTask().trim())) {
					vo.setWeightNum(postfix.getWeightNum()+1);
					weightJob.add(vo);
					childList = new ArrayList<DwEtlJobVO>();
					childList.add(vo);
				}
			}
		}
		if(null != childList){
			for (DwEtlJobVO vo : childList) {
				getChildNode(weightJob,vo,temp);
			}
		}
		if (null == childList) {
			return new ArrayList<DwEtlJobVO>();
		}
		return weightJob;
	}
    
    /**
     * 
    * @Title: getMaxWeight
    * @Description: TODO(获取最高优先级)
    * @param @param vos
    * @param @return    参数
    * @return int    返回类型
    * @throws
     */
    private int getMaxWeight(List<DwEtlJobVO> vos){
    	List<Integer> input = vos.stream().map(DwEtlJobVO::getWeightNum)
    			.collect(Collectors.toList());
    	return input.stream().mapToInt((x) -> x).summaryStatistics().getMax();
    }
    
    /**
     * 
    * @Title: exeTaskThread
    * @Description: TODO(并发处理相同权值的Task)
    * @param @param threadTask
    * @param @param counter
    * @param @return    参数
    * @return String    返回类型
    * @throws
     */
    private String exeTaskThread(List<DwEtlJobVO> threadTask,CountDownLatch counter){
    	int maxThreads = threadTask.size();
    	ExecutorService executor = Executors.newFixedThreadPool(maxThreads);
    	Map<String, Future<String>> results = new HashMap<String, Future<String>>();
    	for (int index = 0; index < maxThreads; index++) {
    		int a = index;
            Future<String> future = executor.submit(() -> {
            	AELogger.info("处理JobCode="+threadTask.get(0).getPkJob()+
                		"--TaskCode="+threadTask.get(0).getPkTask());
                String flags = exeTask(threadTask.get(a));
                if(StringUtils.isNotEmpty(flags)){
                	updateTaskState(threadTask.get(a),DwConst.TASK_STATUS_FAIL);
                	return flags;
                }else{
                	updateTaskState(threadTask.get(a),DwConst.TASK_STATUS_SUCCESS);
                }
                counter.countDown();
                return flags;
            });
            results.put("thread-" + index, future);
        }
    	String flag = null;
    	for (Entry<String, Future<String>> entry : results.entrySet()) {
    		if(StringUtils.isNotEmpty(entry.getValue().toString())){
    			flag = entry.getValue().toString();
    			break;
    		}
        }
    	return flag;
    }
    
    /**
    e: exeTask
    * @Description: TODO(调用StreamSet接口方式)
    * @param @param vo
    * @param @return    参数
    * @return String    返回类型
    * @throws
     */
    @SuppressWarnings("unchecked")
	private String exeTask(DwEtlJobVO vo){
    	StringBuffer url = new StringBuffer(DwConst.STREAMSET_BASE_URL);
    	url.append("/rest/v1/pipeline/");
    	url.append(vo.getPkTask().trim());
    	url.append("/start?rev=0");
    	String msg = HttpUtil.httpPostStreamSet(url.toString(), null);
    	if(StringUtils.isNotEmpty(msg)){
    		Map<String,String> map = JSONUtil.toBean(msg, Map.class);
        	updateTaskState(vo,map.get("status"));
        	//实时处理状态信息
        	url = new StringBuffer(DwConst.STREAMSET_BASE_URL);
        	url.append("/rest/v1/pipeline/");
        	url.append(vo.getPkTask().trim());
        	url.append("/status?rev=0");
        	updateTaskState(vo,getStreamSetState(vo,url.toString()));
        	msg = null;
    	}else{
    		updateTaskState(vo,DwConst.TASK_STATUS_FAIL);
    		msg = DwConst.TASK_STATUS_FAIL;
    	}
    	return msg;
    }
    
    
    @SuppressWarnings("unchecked")
	private String getStreamSetState(DwEtlJobVO vo,String url){
		Boolean result = false;   //查找循环处理
		Boolean isFail= false;	//是否有错误信息
		int exeTotle = 0;
		while(!result) {
			try {
				String msg = HttpUtil.httpGetStreamSet(url);
		    	Map<String,String> map = JSONUtil.toBean(msg, Map.class);
		    	if(map.get("status").equals(DwConst.TASK_STATUS_RUN)){
		    		updateTaskState(vo,map.get("status"));
		    		result = false;
		    		Thread.sleep(2 * 1000);
		    	}else if(map.get("status").equals(DwConst.TASK_STATUS_SUCCESS)){
		    		updateTaskState(vo,map.get("status"));
		    		result = true;
					break ;
		    	}else{
		    		updateTaskState(vo,DwConst.TASK_STATUS_FAIL);
		    		result = true;
		    		isFail = true;
		    		break;
		    	}
		    	AELogger.info("循环查询第"+exeTotle+"次结果执行的状态, status=" + map.get("status"));
		    	exeTotle ++ ;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}  
			
		}
		return isFail?DwConst.TASK_STATUS_FAIL:DwConst.TASK_STATUS_SUCCESS;
    }
    
    /**
     * 
    * @Title: getState
    * @Description: TODO(获取Task的状态)
    * @param @param vo
    * @param @return    参数
    * @return int    返回类型
    * @throws
     */
    private String getState(DwEtlJobVO vo){
    	String jobNameSql = "select status from dw_etl_job where "
    			+ "pk_job =? and pk_task=? and assembly_task=?";
		List<DwEtlJobVO> list = DwSQLExecutor.createSQLExecutor().
				execQueryList(jobNameSql, new Object[]{vo.getPkJob(),vo.getPkTask(),vo.getAssemblyTask()}, 
						new BeanPropertyRowMapper<DwEtlJobVO>(DwEtlJobVO.class));
		if(null != list && list.size()>0){
			list.get(0).getStatus();
		}
    	return DwConst.TASK_STATUS_READY;
    }
    
    /**
     * 
    * @Title: updateTaskState
    * @Description: TODO(修改执行状态)
    * @param @param vo
    * @param @param status    参数
    * @return void    返回类型
    * @throws
     */
    private void updateTaskState(DwEtlJobVO vo,String status){
    	String updateSql = "update dw_etl_job set status=? "
    			+ "where pk_job=? and pk_task=? and assembly_task=?";
		DwSQLExecutor.createSQLExecutor().execUpdate(updateSql, 
				status,vo.getPkJob(),vo.getPkTask(),vo.getAssemblyTask());
    }
}

SingleTaskJob   自己封装的一个Job ,需要自己实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值