/**
*
* @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 ,需要自己实现