`
gtgt1988
  • 浏览: 111489 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

试用的管理进程的Java类

 
阅读更多
进程的基本信息类
public class ProcessDefDto {
	private long omcId;
	private String command;//启进程命令
	private int port;//端口号
	private int collectType;//采集类型,0 snmp,1 tl1
	

	public ProcessDefDto(){
		
	}
public ProcessDefDto(long omcId,String command,int port,int   collectType){
	this.omcId= omcId;
	this.command= command;
	this.port= port;
	this.collectType= collectType;
	 
	}
	
	public void setOmcId(long omcId){
		this.omcId= omcId;
	}
	public long getOmcId(){
		return this.omcId;
	}
	public void setCommand(String command){
		this.command= command;
	}
	public String getCommand(){
		return this.command;
	}
	
	public void setPort(int port){
		this.port= port;
	}
	public int getPort(){
		return this.port;
	}
	
	public void setCollectType(int collectType){
		this.collectType= collectType;
	}
	public int getCollectType(){
		return this.collectType;
	}
	
	 
}



一系列的进程
public class ProcessManager  {
	private static Logger log = Logger.getLogger(MonitorThread.class);
	private static Vector<ProcessDefDto> processDefs = new Vector<ProcessDefDto>();
	private Map<String, String> mapCmds   = new HashMap<String, String>();
	/** 起始端口  **/
	private String start_port="start_port";
	/**启动命令  **/
	private String snmp_key="snmp_cmd";
	private String tl1_key="tl1_cmd";
	private String tl1_parse_key="tl1_parse_cmd";
	private String snmp_parse_key="snmp_parse_cmd";
	private String tl1_alm_key="tl1_alm_cmd";
	private String tl1_coll_key="tl1_coll_cps";
	private String res_cj_key="res_cj";

	
	private int defaultPort=6000;
	public ProcessManager(Map<String, String> mapCmds){
		this.mapCmds=mapCmds;
	}
	//初始化所有待启动进程
	public boolean  initprocessDefs(String areaIds){
		long t1=System.currentTimeMillis();
		Map<Integer,String> omcmap=PonCollectorDaoServiceProvider.getOmcConfigDao().findOmcIdByAreaIds(areaIds);
		
		String snmp_cmd=mapCmds.get(snmp_key);
		String tl1_cmd=mapCmds.get(tl1_key);
		String tl1_parse_cmd=mapCmds.get(tl1_parse_key);
		String snmp_parse_cmd=mapCmds.get(snmp_parse_key);
		String tl1_alm_cmd=mapCmds.get(tl1_alm_key);
		String tl1_coll_cps=mapCmds.get(tl1_coll_key);
		String res_cj=mapCmds.get(res_cj_key);
		
		if(mapCmds.get(start_port)!=null&&!mapCmds.get(start_port).equals("")){//配置的端口号不为空,则取配置 的端口号。
			defaultPort=Integer.valueOf(mapCmds.get(start_port));
		};
		log.info("区域areaId:"+areaIds+",对应OMCID数:"+omcmap.size());
		ServicePortManager portmgr=	new ServicePortManager();
		//增加SNMP采集进程
		if (snmp_cmd != null && !snmp_cmd.equals("")) {
			for (Integer omc : omcmap.keySet()) {
				ProcessDefDto proDef = new ProcessDefDto();
				int port = portmgr.initPort(defaultPort, String.valueOf(omc),
						ServicePortManager.SNMPTYPE);
				defaultPort = port + 1;
				proDef.setOmcId(omc);
				proDef.setCommand(snmp_cmd + " " + omc + " " + port);
				proDef.setPort(port);
				proDef.setCollectType(0);
				processDefs.add(proDef);
			}
		} else {
			log.info("SNMP启动命令没有配置");
		}
	
		//增加TL1解析进程
		if (tl1_parse_cmd != null && !tl1_parse_cmd.equals("")) {
			String[] areas = areaIds.split(",");

			CollRmiCfg crc = PonCollectorDaoServiceProvider.getCollRmiCfgDao()
					.getPortById((short) Integer.parseInt(areas[0]), (short) 3);
			String ip = crc.getServerIp();
			String cmds[] = tl1_parse_cmd.split("\\|\\|");
			for (String area : areas) {
				for (String cmd : cmds) {
					ProcessDefDto proDef = new ProcessDefDto();
					String newCmd = cmd.replaceAll("\\{ip\\}", ip);
					proDef.setCommand(newCmd + " " + area);
					proDef.setCollectType(1);
					processDefs.add(proDef);
				}
			}
		} else {
			log.info("TL1解析进程启动命令没有配置");
		}
		//增加TL1告警进程
		if (tl1_alm_cmd != null && !tl1_alm_cmd.equals("")) {
			for (Integer omc : omcmap.keySet()) {
				ProcessDefDto proDef = new ProcessDefDto();
				int port = portmgr.initPort(defaultPort, String.valueOf(omc),
						ServicePortManager.TL1TYPE);
				defaultPort = port + 1;
				String factory = omcmap.get(omc);
				proDef.setOmcId(omc);
				proDef.setCommand(tl1_alm_cmd + " " + omc + " " + factory
						+ " "+port);
				proDef.setPort(port);
				proDef.setCollectType(1);
				processDefs.add(proDef);
			}
		} else {
			log.info("TL1启动命令没有配置");
		}
	public void startAllProcess(){
		for(ProcessDefDto pro:processDefs){
			startProc(pro);
		}
	}
	public void stopAllProcess(){
		for(ProcessDefDto pro:processDefs){
			stopProc(pro);
		}
	}
	public void startProc(ProcessDefDto pro){
		ProcessUtil.startProcess(pro.getCommand());
	}
	public void stopProc(ProcessDefDto pro){
		ProcessUtil.stopProcess(pro.getCommand());
	}
	
	public Vector<ProcessDefDto> getProcessDefs(){
		return processDefs;
	}
}
没有列举太多的进程信息


一个线程监控所有的进程
public class MonitorThread extends Thread{
	private static Logger log = Logger.getLogger(MonitorThread.class);
	
	public void run(){
		 ProcessManager pm =CollectServiceProvider.getProcessManager();
		Vector<ProcessDefDto> processManagerDtos = pm.getProcessDefs();
		 
		log.info("monitor thread start...");
		while (true) {
				Map<String, String[]> map = ProcessUtil.getProcessInfo();
				if(map!=null){
					for (ProcessDefDto managerDto : processManagerDtos) {
						String[] status = map.get(managerDto.getCommand());
						if (ProcessUtil.isDown(status)) {// 进程满足挂起僵死条件,则进行重启
							log.info("进程启动>"+managerDto.getCommand());
							if(status!=null){
								pm.stopProc(managerDto);
							}
							pm.startProc(managerDto);
						}
					}
				 
				}
			 
			try {
				Thread.sleep(15000);
			} catch (InterruptedException e) {
				log.error("InterruptedException",e);
			}
		}
	}
}



/**
 * 进程启动停止等工具类
 */
public class ProcessUtil {
	private static Logger log = Logger.getLogger(ProcessUtil.class);
	public final static String PROCESS_INFO_CMD_LINUX = "ps axo pid,stat,command";
	public final static String PROCESS_INFO_CMD_AIX = "ps -efo pid,state,args";
	public final static String PROCESS_INFO_CMD_SunOS = "/usr/ucb/ps -axww";
	private final static Map<String, String> osCmdMap = new HashMap<String, String>(){	{
		put("Linux", PROCESS_INFO_CMD_LINUX);
		 put("AIX", PROCESS_INFO_CMD_AIX);
		 put("SunOS", PROCESS_INFO_CMD_SunOS);
	}};
	private static Runtime runtime = Runtime.getRuntime();
	public static boolean startProcess(String cmd){
		 
			try{
				Process process = runtime.exec(cmd);
				new ConsoleThread(process,cmd).start();
				return true;
			}catch (Exception e) {
				log.error("error in start "+ cmd,e);
			}
		 
		return false;
	}
	public static boolean stopProcess(String cmd){
		try{
			Map<String, String[]> map = getProcessInfo();
			if(map!=null){
				String[] info = map.get(cmd);
				if(info!=null){
					runtime.exec("kill -9 "+info[0]);
				}else{
					log.info("can not find process " + cmd);
				}
			}
			return true;
		}catch (Exception e) {
			log.error("error in stop "+ cmd,e);
		}
		log.info("stop failed ");
		return false;
	}
	public synchronized static Map<String, String[]> getProcessInfo(){
		String osName = System.getProperty("os.name");
		String cmd = osCmdMap.get(osName);
		try{
			if ("Linux".equals(osName)||"AIX".equals(osName)) {
				Process p = runtime.exec(cmd);
				BufferedInputStream in = new BufferedInputStream(p.getInputStream());
				BufferedReader br = new BufferedReader(new InputStreamReader(in));
				String str = new String();
				Map<String, String[]> map = new HashMap<String, String[]>();
				while ((str = br.readLine()) != null) {
					Scanner s = new Scanner(str);
					String pid = s.next();
					String state = s.next();
					String command = str.substring(str.indexOf(state)+state.length()).trim();
					map.put(command, new String[]{pid,state});
					s.close();
				}
				br.close();
				in.close();
				p.destroy();
				return map;
			}else if("SunOS".equals(osName)){
				Process p = runtime.exec(cmd);
				BufferedInputStream in = new BufferedInputStream(p.getInputStream());
				BufferedReader br = new BufferedReader(new InputStreamReader(in));
				String str = new String();
				Map<String, String[]> map = new HashMap<String, String[]>();
				while ((str = br.readLine()) != null) {
					Scanner s = new Scanner(str);
					String pid = s.next();
					s.next();
					String state = s.next();
					String index = s.next();
					String command = str.substring(str.indexOf(index)+index.length()).trim();
					map.put(command, new String[]{pid,state});
					s.close();
				}
				br.close();
				in.close();
				p.destroy();
				return map;
			}else{
				log.debug(osName + " monitor unimplementate ");
				return null;
			}
		}catch (Exception e) {
			log.error("",e);
			return null;
		}
		
	}
	/**
	 * 进程运行是否正常
	 * @param status
	 * @return
	 */
	public static boolean isDown(String[] status){
		if(status==null) return true;
		String osName = System.getProperty("os.name");
		if ("Linux".equals(osName)) {
			if(status[1].equals("X") || status[1].equals("Z")){//X:死掉的进程 Z:僵尸进程
				return true;
			}else{
				return false;
			}
		}else if ("AIX".equals(osName)){
			if(status[1].equals("Z") || status[1].equals("T")){//Z:已取消 T:已停止
				return true;
			}else{
				return false;
			}
		}else if("SunOS".equals(osName)){
			if(status[1].equals("Z") || status[1].equals("T")){//Z:已取消 T:已停止
				return true;
			}else{
				return false;
			}
		}else{
			log.debug(osName + " monitor unimplementate ");
			return false;//不处理
		}
	}
}




/**
 * 控制台输出线程,防止被管进程由于控制台导致的进程挂起
 *
 */
public class ConsoleThread extends Thread {
	private Logger log = Logger.getLogger(ConsoleThread.class);
	private Process process = null;
	private String commad = null;
	public ConsoleThread(Process process,String commad) {
		this.process = process;
		this.commad = commad;
	}

	public void run() {
		if(this.process ==null) return;
		log.info(this.commad +" console thread start.");
		BufferedInputStream in = new BufferedInputStream(this.process.getInputStream());
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		try {
			String s = br.readLine();
			while (s != null) {
				System.out.println(s);
				s = br.readLine();
			}
		} catch (Exception e) {
			log.error(this.commad, e);
		} finally {
			try {
				br.close();
				in.close();
			} catch (Exception e) {
				log.error(this.commad, e);
			}
		}
		log.info(this.commad + " end");
	}
}

 

分享到:
评论

相关推荐

    java软件试用期解决方案

    软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!

    Java仓库管理系统

    欢迎下载java版本的仓库管理系统,非常试用初学者第一次自作管理系统的素材

    美萍会员管理系统 9.1试用版

    这是试用版!!! 美萍会员管理系统是一套功能强大的会员管理软件(会员卡管理系统,客户管理系统),软件将会员消费,会员基本信息,以及各种查询统计等紧密结合起来,操作简单方便,界面美观大方,能满足如销售,...

    2022年java试用期转正工作总结500字.docx

    2022年java试用期转正工作总结500字.docx

    Teigha.Java 2019.02版本

    Teigha.Java 2019.02 版本 最近要求做cad文件的第三方开发,尝试申请了Teigha的免费试用版(要注册账号申请,官网上有教程,不懂得可以咨询我,在下方评论也可以),以下是我总结的基础内容 1.一个工程制图文件,...

    学客西班牙手机词典试用版(java).rar

    学客西班牙手机词典试用版(java),免费使用

    java微信公众平台开发框架 easywechat 试用版

    java微信公众平台开发框架 easywechat 试用版。 easywechat是一个纯java开发的用于微信公众平台的框架,简化了微信的消息处理和发送。目的是为了使本来就不难的微信开发变得更简单。 java 微信 框架 sdk

    Java to C# Converter

    试用演示版的Java文件夹转换到C#转换器2000行的代码片段转换到200行一次。 官方网站 http://www.tangiblesoftwaresolutions.com/ 有需要其他转换器的可以给我留言,我可以帮你破解. Instant C# converts VB code to...

    java扫描端口绝对试用

    java扫描端口绝对有用,初学者试用的java 端口扫描

    java工程师试用期工作总结.pdf

    java工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava...

    基于JAVA的实验室管理系统

    基于java的实验室管理系统,适用与毕业设计,该系统比较简单,只实现了一些基本的功能,试用了mvc设计模式, hibernater+struts+Sping 3层框架

    java发邮件 java发email

    java发送电子邮件,程序和jar包都在里面,使用方法也有,程序可直接使用,直接改成自己的邮箱和密码就能发送了,解决了很多人java发送邮件不成功的烦恼

    保存java api、常用工具、一般的api试用代码.rar

    Java API(Java Application Programming Interface)是Java应用程序编程接口的缩写,Java中的API,就是JDK提供的具有各种功能的Java类,由于Java类库非常庞大,而且在不断壮大,本文不可能一一介绍所有类的使用...

    Java常用文件处理类

    该类主要对常见的一些文件操作进行了封装,如读写文件(UTF-8)、复制文件、删除文件,创建目录等

    java企业人事管理系统

    实现对企业员工从招聘--&gt;试用-&gt;转正-&gt;离职或退休的全过程管理,能够记录员工的基本信息(支持相片)家庭信息、获奖信息、工作经历、培训信息和签约信息等。提供统计分析和生日提醒等扩展功能。 要求实现功能: 1、...

    java试用期工作总结.doc

    java试用期工作总结.doc

    车辆管理系统试用

    很实用的车辆管理系统分享,满足单位需求。欢迎试用!

    java试用期工作总结.docx

    java试用期工作总结

    java试用期个人总结报告.pdf

    java试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结...

    java程序员试用期个人工作总结.doc

    java程序员试用期个人工作总结.doc

Global site tag (gtag.js) - Google Analytics