#
		
			
			
			       今天项目终于顺利验收了,从5月到现在,我辛苦了大半年,终于把项目完成了。
       这是我做得最成功的一次项目,我的很多想法在这个项目中都得到实现,并被证明是正确的。
       之后,也许去兰州,也许去重庆,我期待着更有挑战的项目。 
			
			
		 
	
		
			
			
			
		
				       把afunms在公司的网络环境测试,现在的公司网络环境测试真是很适合测试网管软件,因为设备数量适中,有4台网络设备和10台服务器,而且服务器种类齐全,有Windows、Linux、Aix、Solaris和Hp-ux。
       因为星期天的重构了初始化(装载节点)部分的代码,本来想测试这部分的,但后来发现“网络发现程序”也有好多问题,主要集中在三点:
       1.子网的网关是否在子网内(换句话说就是网关的IP地址是不是一定要是子网内的有效IP)
       2.如何确定网络设备
       3.如何确定网络设备的port
       有些问题我一时也不清楚,只待日后慢慢研究。
       之后,我测试loader程序,没问题。
		
			
			
		 
	
		
			
			
			       今天系统顺利通过专门组评审。对他们所提出的问题,我都作了比较专业的回答。有点像当年的论文答辩一样。没想到这么简单,哈哈。     
       离开齐鲁的日子真的指日可待了,真想快点离开这里,因为还有很多事情等着我做。
			
			
		
 
	
		
			
			
			
		        今天要做一个tomcat监视,参考了ens和华中电力的相关代码,发现他们的做法都是先取到html代码,然后从这html代码中提取自己想要的数据,这太麻烦了,我在想有没有更好的办法。
        研究了tomcat的源码后,终于有了发现。我要的数据可以通过以下代码得到:
       --------server information------------------ 
       服务器信息:ServerInfo.getServerInfo()
        jvm版本:System.getProperty("java.runtime.version")
        jvm vendor:System.getProperty("java.vm.vendor")
        操作系统:System.getProperty("os.name")
        操作系统版本:System.getProperty("os.version")
       --------jvm information------------------
       free_memory:Runtime.getRuntime().freeMemory()
       total_memory:Runtime.getRuntime().totalMemory()
       max_memory:Runtime.getRuntime().maxMemory()
       ---------应用列表-------------------
      private Element createApplications()
 {
  Element applications = null;
  try
  {
   applications = new Element("applications");
   
   MBeanServer mBeanServer = Registry.getServer();
         ObjectName queryHosts = new ObjectName("*:j2eeType=WebModule,*");
         Set hostsON = mBeanServer.queryNames(queryHosts, null);
		   Iterator iterator = hostsON.iterator();
   while(iterator.hasNext())
   {
    ObjectName contextON = (ObjectName)iterator.next();
          String webModuleName = contextON.getKeyProperty("name");                      
    String hostName = null;
          String contextName = null;
          if(webModuleName.startsWith("//"))
               webModuleName = webModuleName.substring(2);
          
          int slash = webModuleName.indexOf("/");
          if(slash != -1)
          {
              hostName = webModuleName.substring(0, slash);
              contextName = webModuleName.substring(slash);
          } 
    else continue;
 
          if("/".equals(contextName)) continue;
          
          Element oneApp = new Element("application_information");
          try
          {        
              ObjectName queryManager = new ObjectName(contextON.getDomain() + ":type=Manager,path=" + contextName + ",host=" + hostName + ",*");
              Set managersON = mBeanServer.queryNames(queryManager, null);
              ObjectName managerON = null;
              for(Iterator iterator2 = managersON.iterator(); iterator2.hasNext();)
                 managerON = (ObjectName)iterator2.next();
 
              Element wmn = new Element("web_module_name");
              wmn.setText(contextName.substring(1));
          
              Element as = new Element("active_sessions");
           as.setText(mBeanServer.getAttribute(managerON, "activeSessions").toString());
          
           Element sc = new Element("session_count");
           sc.setText(mBeanServer.getAttribute(managerON, "sessionCounter").toString());
          
           Element mas = new Element("max_active_sessions");
           mas.setText(mBeanServer.getAttribute(managerON, "maxActive").toString()); 
           oneApp.addContent(wmn);
           oneApp.addContent(as);
           oneApp.addContent(sc);
           oneApp.addContent(mas);
           applications.addContent(oneApp);
          }
          catch(Exception e)
          {
           System.out.println("Error in TomcatMonitor.createApplications()-2");
          }//end_try
   }//end_while
  }
        catch(Exception e)
        {
         System.out.println("Error in TomcatMonitor.createApplications()-1");
        }//end_try
        return applications;
 }
			
			
		 
	
		
			
			
			1.修改界面
2.完成阀值设置的代码
3.完成tomcat和oracle的监控
如果还有时间,就把文档写完。
			
			
		
 
	
		
			
			
			        明日项目要验收了。再想起11月1日,仍然让我激动。那天我给用户演示我们的系统,得到用户的高度评价,黄部说“没想到你们能做得这么好”。半年来,这个项目的所有不顺心的事都一扫而光,我用自己的努力证明我的实力。      
        公司都不支持我把产品推倒重做,尤其是刘洁,不相信我在两个月内可以完成所有的功能。可我还是坚持自己的观点。所以,有时自己认为是对是就一定要坚持。
        未来还有很多事等着我去做,我会继续努力。
			
			
		
 
	
		
			
			
			
		到12月1日,这几天的任务安排:
1.完成架构的修改;
2.完成Tomcat的监视,作为“应用节点”的首个例子,来测试这个新的frame
把修改后的版本定为afunms V2.0
			
			
		 
	
		
			
			
			
		
				
						        今天对afunms进行比较大的改动,突然,有一个问题我觉得我必须思考,我为什么作出这种架构?我的架构是基于什么来考虑的?
         现在很明确的只有两点:
        1.业务视图    2.被监视对象的标准化。
 
        这两点肯定是太少了,至少还应该多点:网络智能化管理。只是现在我还想不出来应该怎么做,哈哈。
						
						
   
		
			
			
		 
	
		
			
			
			        今天去找夏部,跟他谈验收问题,可是他又提一些新想法,什么丢包率,错误率。。。真是晕倒。用户的需求总是不断变化,面对不断变化的需求我们总是很无奈。其实这些数据,系统中都有,只是我们没有展现出来。这两天把这些做完,希望下周能验收。这样我们就可以回北京了。
       今天和mm在QQ上视频聊天,以前不觉得她漂亮,可是今天觉得她好漂亮哦,也许是很久没见的原因,哈哈。希望早日看到她。        
			
			
		
 
	
		
			
			
			
		
				       我对网管软件有一个很完整的想法,齐鲁项目是我实践这个想法的第一步,由于时间和人力的原因,我仅实现了1/3。今天开始我要实现剩下的2/3,不论是在齐鲁还是回北京,我都得把它完成。
       剩下的2/3主是对应用的监控以及如何实现把应用作为与设备一样的被监视对象。为什么要把应用也看成与设备一样呢?因为很多用户都有画出自己“业务视图”的需求,而如果把应用当成单个个体(而不是象以前,把应用当成设备上被监视对象)就可以很容易实现“业务视图”。
		
			
			
		 
	
		
			
			
			
		
				
						我们要实现三个功能:在
						jsp
						页面上生成报表(包括一个表和一个图)、生成
						pdf
						报表和
						excel
						报表。
						
								
								
								
						
				
		
		
				
						原来的代码虽然已经实现了这些功能,但每个类的功能不明确,而且存在大量重复代码。于是想到用设计模式来解决这个问题。起初想用装饰模式(
						Decorator Pattern
						),但经过分析,发现装饰模式适合于那种需要把多个功能动态组合在一起的情况。但对于一个
						report
						,我们并不需要它同时能生成
						pdf
						和
						excel
						(即不是多个功能的组合)。
						
								
								
						
				
		
		
				
						桥梁模式(
						Bridge Pattern
						)才是最适合的。桥梁模式的用意是
						"
						将抽象化(
						Abstraction
						)与实现化(
						Implementation
						)脱耦,使得二者可以独立地变化
						"
						。(
						According to GoF, the Bridge Pattern is intended to "Decouple an abstraction from its implementation so that the two can vary independently"
						)
						
								
								
						
				
		
		
				类图如下:

 
| 类名 | 功能 | 角色 | 
| AbstractionReport | 所有功能报表的父类 | 抽象化(Abstraction) | 
| PdfReport | 生成pdf报表文件 | 修正抽象化 (Refined Abstraction) | 
| ExcelReport | 生成excel报表文件 | 修正抽象化 | 
| JspReport | 在jsp中调用,生成报表 | 修正抽象化 | 
|   |   |   | 
| ImplementorReport | 所有数据报表的父类 | 实现化(Implementor) | 
| NetworkPerformanceReport | 网络设备性能报表 | 具体实现化 (Concrete Implementor) | 
| ServerPerformanceReport | 服务器性能报表 | 具体实现化 | 
| PortTrafficReport | 接口流量报表 | 具体实现化 | 
AbstractionReport的功能是生成pdf或excel文件,而ImplementorReport的功能是收集数据,为生成报表作准备。
AbstractionReport的子类相对固定,因为我们现在只要实现三个功能,当然,如果以后还想再实现其他功能,比如生成txt报表或html报表,我们还能再扩展,增加两个类TxtReport和HtmlReport即可实现。
ImplementorReport的子类就比较多了,列出的只是其中三个。
任意一个AbstractionReport与ImplementorReport的组合都能有不同的功能。有了以上的各个类,我们就能生成各种各样的报表,比如我们要生成一个“网络设备性能”的pdf报表文件,就这么写:
       AbstractionReport report = new PdfReport(new NetworkPerformanceReport());        
       report.createReport();
生成excel报表文件:
       AbstractionReport report = new ExcelReport(new NetworkPerformanceReport());        
       report.createReport();
 
生成“服务器性能报表”pdf报表文件:
       AbstractionReport report = new PdfReport(new ServerPerformanceReport());        
       report.createReport();
 
生成“服务器性能报表”excel报表文件:
        AbstractionReport report = new ExcelReport(new ServerPerformanceReport());        
       report.createReport();
		
			
			
		 
	
		
			
			
			
		
				        在以前的项目中,都是用popchart(一个applet)画,因为popchart比较简单,生成一个图要写的代码也不多。而且,我始终觉得popchart画出来的图要比jfreechart好看得多。但popchart有缺点,因为是applet,所以在有些浏览器中不能用,而且要想生成pdf或excel报表都不可能。
        为了生成pdf和excel的报表,我最终还是放弃了popchart选择jfreechart。今天用桥梁模式重构了report部份代码,可以生成pdf和excel的报表,这个我以前一直很想要的功能今天实现了。当然,要感谢老聂前期对jfreechart、iText和jxl的研究,三者的完美结合实现了功能强大的Report。
       桥梁模式,这个曾被我多次使用过的pattern,今天再一次证明了它的实用性。
       同时,download了jfreechart的demo,里面包括了所有jfreechart可以生成的图的代码。jfreechart本身是免费的,但这些demo的代码却是收费的,呵呵,这倒是一种很好的赢利模式,jfreechart的开发者们真够smart!
       
    
		
			
			
		 
	
		
			
			
			
		
				 前段时间,系统连续跑几天,tomcat jvm内存总在不断减少,最多只能跑三天,memory就不够了。
把tomcat jvm 从64m增加到128m仍不能解决问题,估计是哪个程序有问题,于是下载了JProbe来测试,
找出了几个占内存大的class,修改程序。情况有所好转,可是不能根本解决。
		
		
				       前天突然想到会不会是DBManager.java中出了问题,于是删除了其中一些可有可无的代码。经过三天的测试,哈哈,果然,jvm free memory再不会持续下降了,问题得到根本解决,好高兴。以前写程序不会太注意内存的问题,但因为有了次经历,我开始重视如何把程序写得更精炼些。
		
		
				       ENS曾出现非常大的问题,就是跑了几天后tomcat就自己关掉了,真可笑!还好,我的系统不曾出现过这种严重的问题。我对我的系统afunms还是很有信心的,哈哈 。发现整个系统只占不到30m的内存,其实原来的64m是完全够用了!
。发现整个系统只占不到30m的内存,其实原来的64m是完全够用了!
				
				 
				 
				
		
			
			
		 
	
		
			
			
			今天遇到一种极恐怖的病毒 svhost32.exe,不但是把端星的服务停了,而且有多种变种。
重装机器也没用,最后还是手动删除相关的病毒文件,机器才正常。
一下午就折腾这事,原计划把report程序写完也没写,不但浪费我时间,最主要是搞得我
心情极度郁闷。