- 浏览: 111489 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
小布丁丶:
一个简单的问题非要整这么复杂
extjs grid 根据条件禁用选中 -
kylewebgame:
不错啊,做一个线程定时保存,不知道记录后如何做查询呢?或者怎样 ...
一个日志管理设计类
进程的基本信息类 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"); } }
发表评论
-
使用BeanUtils时,遇到日期类型的空值时会抛错的解决办法
2013-03-14 16:46 800public class BeanUtilEx exten ... -
Oracle 计算两个时间的差值
2012-11-08 20:26 2466Oracle 计算两个时间的差值 有两个日期数据STA ... -
一个日志管理设计类
2012-07-23 20:10 1260public class LogDataQueue { ... -
JDBC操作数据库的步骤
2012-07-08 21:49 1070#传统JDBC访问数据库步骤 》通过Cla ... -
java 分页类
2012-07-08 21:37 823package com.iflytek.hr.model ... -
java 斗地主发牌
2012-07-08 21:23 1044/** * * @Title: Controlle ... -
面向对象设计1
2012-02-19 16:02 778我要去新疆 面向过程:注重过程,进过什么地方到达新疆,例如过 ... -
Java的内存知识梳理
2012-02-18 10:42 897栈、堆、常量池等虽同属Java内存分配时操作的区域,但其适用范 ... -
定时任务类统一接口以及实现(1)
2012-02-15 19:22 1077public interface ITaskRunner { ... -
初始化容器编写的类
2012-02-15 19:03 857public interface Initializer { ... -
IO流的讲解
2012-02-14 15:54 823关于IO流讲解的一篇不错文章 http://blog.csdn ... -
Java中getResourceAsStream的用法
2012-02-07 14:58 1038三种写法: 1.“ / ”代表了工程的根目录,例如工 ... -
练习对XML文件的操作
2011-12-24 16:50 852初步练习下java对XML文件的操作,加深下记忆而已,代码如下 ...
相关推荐
软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!软件注册!
欢迎下载java版本的仓库管理系统,非常试用初学者第一次自作管理系统的素材
这是试用版!!! 美萍会员管理系统是一套功能强大的会员管理软件(会员卡管理系统,客户管理系统),软件将会员消费,会员基本信息,以及各种查询统计等紧密结合起来,操作简单方便,界面美观大方,能满足如销售,...
2022年java试用期转正工作总结500字.docx
Teigha.Java 2019.02 版本 最近要求做cad文件的第三方开发,尝试申请了Teigha的免费试用版(要注册账号申请,官网上有教程,不懂得可以咨询我,在下方评论也可以),以下是我总结的基础内容 1.一个工程制图文件,...
学客西班牙手机词典试用版(java),免费使用
java微信公众平台开发框架 easywechat 试用版。 easywechat是一个纯java开发的用于微信公众平台的框架,简化了微信的消息处理和发送。目的是为了使本来就不难的微信开发变得更简单。 java 微信 框架 sdk
试用演示版的Java文件夹转换到C#转换器2000行的代码片段转换到200行一次。 官方网站 http://www.tangiblesoftwaresolutions.com/ 有需要其他转换器的可以给我留言,我可以帮你破解. Instant C# converts VB code to...
java扫描端口绝对有用,初学者试用的java 端口扫描
java工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava工程师试用期工作总结.pdfjava...
基于java的实验室管理系统,适用与毕业设计,该系统比较简单,只实现了一些基本的功能,试用了mvc设计模式, hibernater+struts+Sping 3层框架
java发送电子邮件,程序和jar包都在里面,使用方法也有,程序可直接使用,直接改成自己的邮箱和密码就能发送了,解决了很多人java发送邮件不成功的烦恼
Java API(Java Application Programming Interface)是Java应用程序编程接口的缩写,Java中的API,就是JDK提供的具有各种功能的Java类,由于Java类库非常庞大,而且在不断壮大,本文不可能一一介绍所有类的使用...
该类主要对常见的一些文件操作进行了封装,如读写文件(UTF-8)、复制文件、删除文件,创建目录等
实现对企业员工从招聘-->试用->转正->离职或退休的全过程管理,能够记录员工的基本信息(支持相片)家庭信息、获奖信息、工作经历、培训信息和签约信息等。提供统计分析和生日提醒等扩展功能。 要求实现功能: 1、...
java试用期工作总结.doc
很实用的车辆管理系统分享,满足单位需求。欢迎试用!
java试用期工作总结
java试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结报告.pdfjava试用期个人总结...
java程序员试用期个人工作总结.doc