項目終于順利驗收了!
?????? 今天項目終于順利驗收了,從5月到現在,我辛苦了大半年,終于把項目完成了。?????? 這是我做得最成功的一次項目,我的很多想法在這個項目中都得到實現,并被證明是正確的。
?????? 之后,也許去蘭州,也許去重慶,我期待著更有挑戰的項目。

posted @ 2006-12-07 23:38 afunms 閱讀(116) | 評論 (0) | 編輯 收藏
My Software,My Dream—Forge a more perfect NMS product.
posted @ 2006-12-07 23:38 afunms 閱讀(116) | 評論 (0) | 編輯 收藏
?????? 把afunms在公司的網絡環境測試,現在的公司網絡環境測試真是很適合測試網管軟件,因為設備數量適中,有4臺網絡設備和10臺服務器,而且服務器種類齊全,有Windows、Linux、Aix、Solaris和Hp-ux。
?????? 因為星期天的重構了初始化(裝載節點)部分的代碼,本來想測試這部分的,但后來發現“網絡發現程序”也有好多問題,主要集中在三點:
?????? 1.子網的網關是否在子網內(換句話說就是網關的IP地址是不是一定要是子網內的有效IP)
?????? 2.如何確定網絡設備
?????? 3.如何確定網絡設備的port
?????? 有些問題我一時也不清楚,只待日后慢慢研究。
?????? 之后,我測試loader程序,沒問題。
posted @ 2006-12-06 17:18 afunms 閱讀(156) | 評論 (0) | 編輯 收藏
posted @ 2006-12-05 11:42 afunms 閱讀(132) | 評論 (0) | 編輯 收藏
??????? 今天要做一個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("http://"))
?????????????? 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;
?}
posted @ 2006-12-04 11:18 afunms 閱讀(395) | 評論 (3) | 編輯 收藏
posted @ 2006-11-28 23:08 afunms 閱讀(133) | 評論 (0) | 編輯 收藏
posted @ 2006-11-27 23:10 afunms 閱讀(86) | 評論 (0) | 編輯 收藏
posted @ 2006-11-26 14:30 afunms 閱讀(147) | 評論 (0) | 編輯 收藏
??????? 今天對afunms進行比較大的改動,突然,有一個問題我覺得我必須思考,我為什么作出這種架構?我的架構是基于什么來考慮的?
???????? 現在很明確的只有兩點:
??????? 1.業務視圖??? 2.被監視對象的標準化。
?
??????? 這兩點肯定是太少了,至少還應該多點:網絡智能化管理。只是現在我還想不出來應該怎么做,哈哈。
??
posted @ 2006-11-25 21:43 afunms 閱讀(141) | 評論 (0) | 編輯 收藏
posted @ 2006-11-24 22:42 afunms 閱讀(168) | 評論 (0) | 編輯 收藏
?????? 我對網管軟件有一個很完整的想法,齊魯項目是我實踐這個想法的第一步,由于時間和人力的原因,我僅實現了1/3。今天開始我要實現剩下的2/3,不論是在齊魯還是回北京,我都得把它完成。
?????? 剩下的2/3主是對應用的監控以及如何實現把應用作為與設備一樣的被監視對象。為什么要把應用也看成與設備一樣呢?因為很多用戶都有畫出自己“業務視圖”的需求,而如果把應用當成單個個體(而不是象以前,把應用當成設備上被監視對象)就可以很容易實現“業務視圖”。
posted @ 2006-11-23 14:38 afunms 閱讀(166) | 評論 (0) | 編輯 收藏
我們要實現三個功能:在
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();
posted @ 2006-11-22 10:09 afunms 閱讀(201) | 評論 (0) | 編輯 收藏
??????? 在以前的項目中,都是用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!
???????
???
posted @ 2006-11-21 11:26 afunms 閱讀(617) | 評論 (0) | 編輯 收藏
?前段時間,系統連續跑幾天,tomcat jvm內存總在不斷減少,最多只能跑三天,memory就不夠了。
把tomcat jvm 從64m增加到128m仍不能解決問題,估計是哪個程序有問題,于是下載了JProbe來測試,
找出了幾個占內存大的class,修改程序。情況有所好轉,可是不能根本解決。
?????? 前天突然想到會不會是DBManager.java中出了問題,于是刪除了其中一些可有可無的代碼。經過三天的測試,哈哈,果然,jvm free memory再不會持續下降了,問題得到根本解決,好高興。以前寫程序不會太注意內存的問題,但因為有了次經歷,我開始重視如何把程序寫得更精煉些。
?????? ENS曾出現非常大的問題,就是跑了幾天后tomcat就自己關掉了,真可笑!還好,我的系統不曾出現過這種嚴重的問題。我對我的系統afunms還是很有信心的,哈哈。發現整個系統只占不到30m的內存,其實原來的64m是完全夠用了!
posted @ 2006-11-20 14:41 afunms 閱讀(1095) | 評論 (1) | 編輯 收藏
posted @ 2006-11-19 17:27 afunms 閱讀(264) | 評論 (0) | 編輯 收藏