package com.hqyg.disjob.console.service.impl; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.hqyg.disjob.console.service.JobInfoService; import com.hqyg.disjob.monitor.db.mappers.DBJobBasicInfoMapper; import com.hqyg.disjob.register.job.EjobServerService; import com.hqyg.disjob.register.rpc.SubscribeService; import com.hqyg.disjob.rpc.client.HURL; import com.hqyg.disjob.rpc.client.proxy.ChannelBootStrap; import com.hqyg.disjob.rpc.codec.EjobKillTaskResponse; import com.hqyg.disjob.rpc.codec.EjobResponse; import com.hqyg.disjob.rpc.codec.EjobRestartTaskResponse; import com.hqyg.disjob.rpc.codec.Header; import com.hqyg.disjob.rpc.codec.RpcRequest; import com.hqyg.disjob.rpc.codec.RpcRequestData; import com.hqyg.disjob.rpc.utils.PhpTaskCmd; /** * <pre> * * File: ScheduleJobServiceImpl.java * * Copyright (c) 2016, globalegrow.com All Rights Reserved. * * Description: * 任务信息处理服务实现 * * Revision History * * Date: 2016年5月19日 * Author: Disjob * * </pre> */ @Service public class JobInfoServiceImpl implements JobInfoService { @Autowired private DBJobBasicInfoMapper mapper; @Autowired public EjobServerService initServerExecuteJobService; @Autowired public SubscribeService subscribeService; /** * 1为成功,0任务不存在,2为任务状态不是exec,-1代表超时 */ @Override public List<String> KillTaskByRequestId(String requestId) { PhpTaskCmd cmd = PhpTaskCmd.KILLTASK; byte type = 15; RpcRequest request = new RpcRequest(); Header header = new Header(); header.setType((byte)type); header.setVersion(1); RpcRequestData data = new RpcRequestData(); data.setRequestId(requestId); request.setHeader(header); request.setData(data); List<String> result = process(requestId, cmd, request); return result; } private List<String> process(String requestId, PhpTaskCmd cmd,RpcRequest data ) { List<String> result = new ArrayList<String>(); List<HURL> urlList = null; try { urlList = subscribeService.getProvidesByRequestId(requestId); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if(urlList !=null && urlList.size() >0){ for(HURL url : urlList){ String host = url.getHost(); int port = url.getPort(); int code = requestCmd(requestId, host, port, cmd,data,new EjobKillTaskResponse()); result.add(host+"_"+port+":"+code); } } return result; } private List<String> process(String groupName,String jobName, PhpTaskCmd cmd,RpcRequest data) { List<String> result = new ArrayList<String>(); List<HURL> urlList = SubscribeService.getHURListProvidesByService(groupName, jobName); if(urlList !=null && urlList.size() >0){ for(HURL url : urlList){ String host = url.getHost(); int port = url.getPort(); int code = requestCmd(null, host, port,cmd,data,new EjobRestartTaskResponse()); result.add(host+"_"+port+":"+code); } }else{ } return result; } private int requestCmd(String requestId, String host, int port,final PhpTaskCmd cmd,RpcRequest data,EjobResponse response) { //EjobKillTaskResponse response = new EjobKillTaskResponse(); CountDownLatch downLatch = new CountDownLatch(1); ChannelBootStrap b = new ChannelBootStrap(cmd,response,downLatch,host,port); b.request(data); try { downLatch.await(5, TimeUnit.SECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ b.bootstrap.group().shutdownGracefully(); } if(response !=null){ //状态统一转化为code处理 if(response instanceof EjobRestartTaskResponse){ return ((EjobRestartTaskResponse)response ).isStatus() ? 1 :0; }else if(response instanceof EjobKillTaskResponse){ return ((EjobKillTaskResponse)response ).getCode(); }else{ return -1; } }else{ return -1; } } @Override public List<String> restartJob(String groupName,String jobName) { PhpTaskCmd cmd = PhpTaskCmd.RESTART; byte type = 14; RpcRequest request = new RpcRequest(); Header header = new Header(); header.setType((byte)type); header.setVersion(1); RpcRequestData data = new RpcRequestData(); data.setOnlytask(true); request.setHeader(header); request.setData(data); List<String> result = process(groupName,jobName, cmd, request); return result; /*EjobRestartTaskResponse response = new EjobRestartTaskResponse(); CountDownLatch downLatch = new CountDownLatch(1); RpcRequest request = new RpcRequest(); Header header = new Header(); header.setType((byte)14); header.setVersion(1); RpcRequestData data = new RpcRequestData(); //data.setRequestId("ff808081581945c00158437017fe7fbc"); data.setIs_only_task(true); request.setHeader(header); request.setData(data); ChannelBootStrap b = new ChannelBootStrap(PhpTaskCmd.RESTART,response,downLatch); b.request(request); try { downLatch.await(5, TimeUnit.SECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(response !=null){ return response.getStatus(); }else{ return "false"; }*/ } }