posts - 16,comments - 17,trackbacks - 0
          @ My Space
          posted @ 2005-05-13 00:08 非飛 閱讀(2468) | 評論 (2)編輯 收藏
          @ My space
          posted @ 2005-05-07 00:19 非飛 閱讀(2232) | 評論 (0)編輯 收藏
          在JDK1.4.2中加入了對NIO的支持,掌握其中的Selector個人認為是能實現(xiàn)好NIO的關鍵。

          Selector是用來獲取注冊在其中的channel的相關事件的發(fā)生,也就是accept,read和write。selector中有3個key set。

          key set:包含代表所有在其中注冊的channel,可以通過selector.keys()得到。
          selected-key set:包含所有被檢測到有關注的操作已經就緒的key,通過selector.selectedKeys得到。
          cancelled-key set:包含所有已經被cancel,但是還沒有channel還沒有deregister的key,這個集合是不能直接被訪問的。

          key通過調用channel的register方法被加入到key set中。被取消的key在select的時候會被從相應的key set中移除。

          key set自身是不可以直接進行修改的。 無論是通過調用channel的close方法還是調用key的cancel方法,key都會被放置到canceled-key set中。取消的key會將其channel在下一次select時將注冊撤銷,同時將key從所有的key set中移除。

          key在執(zhí)行select操作時被加入到selected-key set中。在selected-key set中的key可以通過調用iterator的remove方法,將其從selected-key set中移除,不能通過其他的辦法將其從selected-key set中移除。

          通過selector的3個方法select(阻塞選擇,直到有關心的事件發(fā)生時退出阻塞),selectNow(不阻塞選擇),select(long)(指定超時選擇,超時到達或者有關心事件發(fā)生時退出阻塞),來獲取關心事件的發(fā)生。其執(zhí)行步驟分為以下3步:

          1、將存在于canceled-key set中的key從所有的key set中移除,撤銷注冊的channel,清空canceled-key set。
          2、地層操作系統(tǒng)檢查是否有關心的事件發(fā)生,當有關心的事件發(fā)生時,首先檢查channel的key是否已經存在于selected-key set中,如果不存在,則將其加入到selected-key set中去,同時修改key的ready-operation set來表明當前ready的操作,而以前存在于ready-operation set中的信息會被刪除。如果對應的key已經存在于selected-key set中,這直接修改其ready-operation set來表明當前ready的操作,刪除原來ready-operation set中的信息。
          3、如果在第二步中有加入到canceled-key set中的key,在這一步會執(zhí)行第一步的操作。

          selector自身是線程安全的,而他的key set卻不是。在一次選擇發(fā)生的過程中,對于key的關心事件的修改要等到下一次select的時候才會生效。 另外,key和其代表的channel有可能在任何時候被cancel和close。因此存在于key set中的key并不代表其key是有效的,也不代表其channel是open的。如果key有可能被其他的線程取消或關閉channel,程序必須小 心的同步檢查這些條件。

          阻塞了的select可以通過調用selector的wakeup方法來喚醒。
          posted @ 2005-04-26 10:06 非飛 閱讀(17400) | 評論 (3)編輯 收藏

          在JavaScript中,可以通過window.location來獲取url地址。但是window.location是一個對象,沒有辦法直接從里面獲取出我們需要的參數(shù)。通常的做法就是使用一個隱藏的<input>,通過將window.location負值給input。其目的就是為了將location轉換成String。寫的過程中總是覺得太復雜了,后來發(fā)現(xiàn)使用document.URL就可以解決這個問題。
          posted @ 2005-04-18 15:52 非飛 閱讀(4103) | 評論 (3)編輯 收藏

          今天在幫朋友寫一個簡單的產品發(fā)布網站,由于使用的空間是靜態(tài)的,沒有辦法只能在javascript上下功夫了。首先想到的便是RIA,上網google了一下,發(fā)現(xiàn)這樣的東西還真不少,可謂是十八般武藝各顯靈通。看了看文明的bindows,感覺真的非常的好。可是選擇它對于我要做的東西,可以說是過于復雜了。(http://www.bindows.net 有興趣的朋友可以去看看)。
          搜索了半天最后還是決定,采用javascript讀取服務器端xml文件的辦法來實現(xiàn)。嘗試了一下感覺還不錯,確定就是對使用的瀏覽器有依賴。
          先寫了一個商品的xml文件:

          <?xml version="1.0"?>
          <root>
           
          <product id="0001" name="product1" price="10.00">
            
          <description>
             Detail Description
            
          </description>
           
          </product>
           
          <product id="0002" name="product2" price="20.00">
            
          <description>
             Detail Description
            
          </description>
           
          </product>
          </root>

           

          使用javascript來讀入xml實在是相當?shù)暮唵危恍枰獌删湓捑涂梢愿愣ǎ?BR>

          // 裝載xml文件的函數(shù)
          function loadXML(fileName) {
           
          // 定義一個xml dom對象
           var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
           
           xmlDoc.load(fileName);
           xmlObj 
          = xmlDoc.documentElement;
          }

           

          指定要載入的xml文件名就可以完成對xml的讀入。

          // 載入xml文件
          loadXML("product.xml");

           

          得到xml對象后就可以適用對象提供的相應方法和屬性來獲取xml中定義的數(shù)據信息。
          xmlObj.hasChildNodes來判斷是否含有子項;
          xmlObj.childNodes.lenght 得到包含的子項的數(shù)量
          子項可以用數(shù)字來作為索引,以product.xml為例。如果我們要獲取第二條商品時,可以用xmlObj.childNodes(1)來獲得,xmlObj.childNodes(1).childNodes(0)得到的是description
          xmlObj.childNodes(1).childNodes(0).text 得到description的值
          xmlObj.childNodes(1).getAttribute("name") 得到第二條商品的名字


          posted @ 2005-04-09 12:23 非飛 閱讀(4722) | 評論 (1)編輯 收藏

          下載了一個Action Script Viewer 4.0對原來的swf文件進行反編譯,雖然有的movie clip會出現(xiàn)一點問題,但是總的來說效果還是不錯的,而且操作相當?shù)暮唵巍?BR>
          1)使用ASV打開要進行反編譯的SWF文件;
          2)File-->export rebuild data。這時將swf文件分拆成單個的swf文件;
          3)打開flash,創(chuàng)建一個空的fla文件;
          4)File-->Import...-->Import to Library   將前面導出的swf文件導入,如果swf文件太多flash會報錯,可以通過分批導入文件來繞過這個錯誤;
          5)將新建的swf文件保存為rebuild.fla,并且3)導出的文件在同一目錄;
          6)運行3)產生的一個rebuild.jsfl文件,一切搞定。


          posted @ 2005-04-04 03:32 非飛 閱讀(2708) | 評論 (1)編輯 收藏

          中午收到老姐來的電話,電話里她是一遍一遍又一遍的在我耳邊嘮叨,說,“不管你怎么忙,有多少東西要寫,一定要按時睡覺”。還列出了一堆要按時睡覺的理由。其實誰不知道應該要按時睡覺,可是作為寫程序的程序員來說,要真想做到這一點實在是難,難,難呀!

          要按時睡覺的理由


          從人的排毒期入手:晚間11:00--1:00,肝的排毒期(必須在睡覺中進行)
          從人的睡眠最佳時段入手:1:00--4:00,人的睡眠是質量最高的

          不知道各位有誰是有正常的生活習慣的,能不能說一說你是怎么做到的。。。


          posted @ 2005-03-23 15:25 非飛 閱讀(2124) | 評論 (3)編輯 收藏

              做項目,無論是遺留產品的再生產,還是對遺留產品的再利用,都不可避免的會出現(xiàn)一大堆的異構現(xiàn)象。解決異構通信問題是這類項目的主要問題。以前看見這種情況第一個解決方案就是Socket通信。說實在的自己實現(xiàn)Socket通信,定制通信協(xié)議,或者是實現(xiàn)已有的通信協(xié)議都是很頭痛的事情。本人有不堪回首的歷史經歷。

              最近同樣在項目中需要去解決一個異構問題,由于時間的緊迫,以及先天的運行環(huán)境(兩個部分是運行在同一臺機器上的)。考慮到了使用JNI,結果表明JNI是完全可以勝任目前的角色的。以前沒有了解過JNI,總是以為它這不好那不好,用了用,表現(xiàn)還不錯,而且實現(xiàn)起來非常之簡單。

              整個實現(xiàn)過程可以分為五步來完成:

          1)寫一個聲明了native的Java文件:

          package example;

          public class TestJNI 
          {
              
          static 
          {
                  System.loadLibrary(
          "test"
          );
              }

              
              
          public native String getNameCPP();
          }


          2) 使用javah產生對應的CPP頭文件:
          命令:javah -classpath <path> -jni example.TestJNI -d <out_dir>
          生成的頭文件example_TestJNI.h如下:
          /* DO NOT EDIT THIS FILE - it is machine generated */
          #include 
          <jni.h>
          /* Header for class example_TestJNI */

          #ifndef _Included_example_TestJNI
          #define _Included_example_TestJNI
          #ifdef __cplusplus
          extern "C" {
          #endif
          /*
           * Class:     example_TestJNI
           * Method:    getNameForCPP
           * Signature: ()Ljava/lang/String;
           
          */

          JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
            (JNIEnv 
          *, jobject);

          #ifdef __cplusplus
          }

          #endif
          #endif

          3)實現(xiàn)對應的CPP代碼:
          #include "example_TestJNI.h"
          #include 
          <string>

          JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
            (JNIEnv 
          * env, jobject)
          {
              
          //TODO 可以在此調用其他的代碼
              std::string strName = "Tower";
              
          return env->NewStringUTF(strName.c_str());
          }


          4) 編譯CPP代碼
          命令:g++ -o libtest.so -shared -I<include_path> -I<java_home>/include -I<java_home>/include/linux example_TestJNI.cpp

          5)執(zhí)行
          package example;

          public class Test {
              
          public static void main(String[] args) {
                  TestJNI test 
          = new TestJNI();
                  System.
          out.println("Hello " + test.getNameForCPP());
              }

          }


          export LD_EXPORT_PATH=<so_path>
          java -cp <path> -Djava.library.path=<so_path> example.Test
          輸出:Hello Tower
          posted @ 2005-03-22 18:39 非飛 閱讀(3357) | 評論 (0)編輯 收藏

          做了這么久的軟件,從來就沒有好好的學習過設計模式。寫代碼,做設計的時候都是稀里糊涂。做出來的設計,都會不同程度的讓自己感覺到不安。這可能就是《設計模式精解》書中所說那種直覺吧。

          引用:

          留意你的知覺

          出自本能的直覺能對設計質量做出令人驚訝的預測。所謂“出自本能的直覺”,是指當你看到某些不喜歡的東西時,你胃部的感覺。我知道這聽起來并不科學(而且它的確不科學),但我的經驗總是向我證明:當我從直覺上不喜歡一個設計時,一個更好的設計一定就躺在角落里。

          Facade模式:關鍵特征

          意圖:希望簡化現(xiàn)有系統(tǒng)的使用方法。你需要定義自己的接口。
          問題:只需要使用一個復雜系統(tǒng)的一個子集。或者,需要用一種特殊的方式與系統(tǒng)交互。
          解決方案:Facade向客戶展現(xiàn)使用現(xiàn)有系統(tǒng)的一個新的接口。
          參與者與協(xié)作者:向客戶展現(xiàn)一個定制的接口,讓客戶更容易地使用現(xiàn)有系統(tǒng)。
          效果:Facade模式簡化了對所需子系統(tǒng)的使用。但是,由于Facade并不完整,因此某些功能對于客戶可能是可用的。
          現(xiàn)實:1)定義一個(或一組)新的類來提供所需要的接口。
                       2)讓新的類使用現(xiàn)有的系統(tǒng)。

          Facade模式使用于以下情況:

          • 不需要使用一個復雜系統(tǒng)的所有功能,并且可以創(chuàng)建一個新的類來包容訪問原有系統(tǒng)的接口的一個子集(通常它就是)比原始系統(tǒng)AP簡單得多。
          • 希望包裝或隱藏原有系統(tǒng)。
          • 希望使用原有系統(tǒng)的功能,并且希望增加一些新的功能。
          • “編寫一個新的類”的代價小于“讓所有人學會使用原有系統(tǒng)”或“在未來維護整個系統(tǒng)”所需的代價

           

          posted @ 2005-03-13 23:41 非飛 閱讀(2643) | 評論 (0)編輯 收藏


              一個項目通常分為表示層、業(yè)務邏輯層和持久層,這是最為常見的三層結構。在組織團隊進行項目開發(fā)的時候,選擇如何分工對版本控制有很大的影響。團隊在做開發(fā)的時候一般有兩種模式:按層開發(fā)和按功能開發(fā)。

          按層開發(fā)(本人贊同的模式)

              在這種開發(fā)模式下,每個開發(fā)人員的目錄結構相對固定和獨立。對于CVS這類按文件夾來控制權限的版本控制服務器來說,比較容易實現(xiàn)對開發(fā)人員權限的劃分,不易出現(xiàn)文件不同步而導致的版本混亂。

              另外,這種開發(fā)模式下,更能集中開發(fā)人員的注意力,不需要了解太多與本層無關的其他技術。將精神全部集中在如何實現(xiàn)本層的功能上,更有利于寫出功能強大,運行穩(wěn)定的代碼。例如:開發(fā)業(yè)務邏輯層的開發(fā)人員,他不可避免的會寫很多邏輯上基本上一致的代碼,在寫代碼的過程中,就能從中找出一些相對的共性,將公共的代碼進行抽象,從而避免了出現(xiàn)大量的重復代碼。由于工作范圍相對較小,能有更多的時間去學習相關方面的最新技術和解決方案,并應用到程序中,能使程序在實現(xiàn)方式上較為先進、優(yōu)越。

              老天是公平的,萬物有其好的一面也必然有其不好的一面,這種開發(fā)模式也不能例外。對于需求不明確,無法定義相對固定的對外接口時,這中按層開發(fā)的模式就有其無法避免的一個問題。各層開發(fā)人員需要在開發(fā)的過程中,反覆的修改接口,以便適應于變化了的需求。這必然就導致邏輯處理部分代碼要做相應的修改。

          按功能開發(fā)(本人持保留態(tài)度)

              這種開發(fā)模式下,開發(fā)人員的目錄結構基本是項目的完整目錄接口,他們需要到各層去編寫對應他們所開發(fā)的模塊的所有代碼。對于CVS這類版本控制服務器來說,基本上是無法做到對開發(fā)人員權限的界定。很容易造成版本控制混亂,導致文件版本不同步,是在開發(fā)過程中使用了公共文件的開發(fā)人員不能保證同步。例如:一個文件為多個開發(fā)人員所共同維護,開發(fā)人員各自都需要在其中添加自己功能所需要部分的代碼。這樣很容易出現(xiàn)多個人同時修改一個文件的情況,導致文件不同步而造成的版本混亂。

              另外,這種開發(fā)模式對開發(fā)人員的技術要求相對較高,它要求開發(fā)人員掌握各層中所需要的技術。從界面顯示到數(shù)據持久化,甚至到網絡通信都需要一個開發(fā)人員去實現(xiàn)。在功能實現(xiàn)架構不是很確定的情況下,程序代碼中將會出現(xiàn)大量的重復代碼,因為每個人都有自己的實現(xiàn)機制,而邏輯處理相同或相近的情況在同一層中出現(xiàn)頻率又比較高。導致程序的整體結構不統(tǒng)一,盡管層次結構相同。使得程序日后維護極度困難,大大的提高了維護成本。由于開發(fā)人員牽涉使用的技術過多,也很難保證程序實現(xiàn)方式的先進性和優(yōu)越性。



          posted @ 2005-03-03 21:06 非飛 閱讀(2308) | 評論 (0)編輯 收藏



          Hibernate的繼承映射包含了三種不同的策略:

          1. 每簇類使用一個表;
          2. 每個子類一個表;
          3. 每個具體內一個表(有限制)。
          假設我們有四個類Animal,Dog,Cat,其代碼如下:
          文件名:Animal.java
          class Animal {
              
          private String identifier;
              
          private String name;
              
          private String category;
              
          // setter and getter
          }

          文件名:Dog.java
          class Dog extends Animal {
              
          private String 
              
          // setter and getter
          }

          文件名:Cat.java
          class Cat extends Animal {
              
          private String 
              
          // setter and getter
          }

          • 每簇類使用一個表
                 使用每簇類使用一個表的策略時,有一個限制就時子類不能有NOT NULL,映射文件為:
                 文件名:Animal.hbm.xml
                 <class name="Animal" table="TB_ANIMAL">
                    
          <id name="identifier" type="string" column="IDENTIFIER">
                       
          <generator class="uuid.hex"/>
                    
          </id>
                    
          <discriminator column="ANIMAL_TYPE" type="string"/>
                    
          <property name="name" column="NAME" type="string"/>
                    
                    
          <subclass name="Dog" discriminator-value="DOG">
                       
                    
          </subclass>
                    
          <subclass name="Cat" discriminator-value="CAT">
                       
                    
          </subclass>
                 
          </class>

          • 每個子類一個表
                 使用每個子類一個表的策略時,可以使用一個映射文件實現(xiàn),也可以分成多個映射文件來實現(xiàn)。每個子類一個映射文件的情況:
                 文件名:Animal.hbm.xml
                 <class name="Animal" table="ANIMAL">
                    
          <id name="identifier" column="IDENTIFIER" type="string">
                       
          <generator class="uuid.hex"/>
                    
          </id>
                    
          <property >
                 
          </class>
                 文件名:Dog.hbm.xml
                 
          <joined-subclass name="Dog" table="DOG" extends="Animal">
                    
          <key column="DOG_ID"/>
                    
                 
          </joined-subclass>
                 文件名:Cat.hbm.xml
                 
          <joined-subclass name="Cat" table="CAT" extends="Cat">
                    
          <key column="CAT_ID"/>
                    
                 
          </joined-subclass>

                 每個子類一個表的策略實際上一種one-to-one的映射。
          • 每個具體內一個表(有限制)
                 使用每個具體內一個表(有限制)策略時,每一個子類的映射文件將要包含所有父類中的屬性,映射文件:
                 文件名:Dog.hbm.xml
                 <class name="Dog" table="DOG">
                    
          <id name="identifier" column="IDENTIFIER" type="string">
                       
          <generator class="uuid.hex"/>
                    
          </id>
                    
          <property name="name" column="NAME" type="string"/>
                    
                 
          </class>
                 文件名:Cat.hbm.xml
                 
          <class name="Cat" table="CAT">
                    
          <id name="identifier" column="IDENTIFIER" type="string">
                       
          <generator class="uuid.hex"/>
                    
          </id>
                    
          <property name="name" column="NAME" type="string"/>
                    
                 
          </class>




          posted @ 2005-03-02 22:31 非飛 閱讀(4605) | 評論 (1)編輯 收藏
              網上一大堆關于PO,POJO,DTO,VO等等對象的討論,通常都是各持己見,公說公有理,婆說婆有理,討論到最后也沒有什么定論。今天看到一個應用的代碼,發(fā)現(xiàn)其講PO直接做為VO(view object)在表示層使用。只從代碼上講,這樣做確實省去了跟多操作。不用重復的做對象的賦值、構造。但是會過頭來看,這樣無疑增加了代碼的耦合性。做一個簡單的假設,如果對持久層的PO進行了修改,相應的使用PO做為對應的VO(value object)業(yè)務邏輯層和使用PO最為VO(view object)的表示層都必須做相應的修改,如此的應用給代碼的維護帶來了很大的負擔,可謂是一動則百動。
              在J2EE應用開發(fā)中,是不應該出現(xiàn)這中PO共享使用的方式的。實體對象不應該被跨層使用,各層維護自己的實體對象。這點看書我想大家都知道,而在實際應用中很多人都選擇不遵循這一規(guī)則。(在使用hibernate時有所不同,引用:“不過由于Hibernate的強大功能,例如動態(tài)生成PO,PO的狀態(tài)管理可以脫離Session,使得在應用了Hibernate的J2EE框架中,PO完全可以充當VO,因此我們下面把PO和VO合并,統(tǒng)稱為PO。”引文:結合struts和hibernate談J2EE架構的數(shù)據表示。)出現(xiàn)這總現(xiàn)象,我想原因只有一個就是貪圖了一時的省事,在一次性應用開發(fā)中,相對的業(yè)務對象改動可能性相當?shù)纳伲芏鄷r候在做項目的時候并不會出現(xiàn)預料不到的改變,沒有必要去管理一大堆各式各樣的實體對象,這樣就自然的導致了PO在各層中共享使用。可是就我目前接觸到的項目基本上沒有需求是如此明確的,通常需求都是在不斷的改變,甚至有時到了最后發(fā)版的時候,一些客戶都會提出修改需求的要求。另外就是自做需求的情況就更是如此了,這種項目的需求是不斷的在變化的。為了保證項目的適應性和可擴展性,就必須保證各層之間的相對獨立,盡可能降低耦合度。



          posted @ 2005-03-01 12:40 非飛 閱讀(2468) | 評論 (2)編輯 收藏
              看了兩天文檔,總算對JMX有了一個整體的認識。發(fā)現(xiàn)使用mx4j實現(xiàn)JMX還是相當?shù)妮p松的。MBeans可以使用mx4j-tools中的 Xdoclet偷一下懶,讓它自動的生成MBeans和Descriptions,ant有相應的支持,還是比較方便的,對于MBean接口的實現(xiàn),自己寫了。

              對于如何產生和注冊MBeans,mx4j提供了一個相當方便的工具,為什么說相當方便,是因為它真的實在是太方便了。通過寫一個xml配置文件可以完成所有的工作。比起M-LET確實是強了不少。下面就是一個在MBean Server產生注冊一個NamingService、JMXConnectorServer和一個自寫的MBean的配置文件。

          <?xml version="1.0" encoding="UTF-8"?>
          <configuration port="9999">
             
          <startup>
                
          <create classname="mx4j.tools.naming.NamingService" objectname="naming:type=rmiregistry">
                   
          <arg type="int">1099</arg>
                
          </create>
                
          <call operation="start" objectname="naming:type=rmiregistry" />

                
          <object objectid="rmi">
                   
          <call classname="javax.management.remote.JMXConnectorServerFactory" method="newJMXConnectorServer">
                      
          <arg type="javax.management.remote.JMXServiceURL">
                         
          <new classname="javax.management.remote.JMXServiceURL">
                            
          <arg type="string">service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmx</arg>
                         
          </new>
                      
          </arg>
                      
          <arg type="java.util.Map" />
                      
          <arg type="javax.management.MBeanServer" />
                   
          </call>
                
          </object>
                
          <register objectname="connectors:type=rmi,protocol=jrmp">
                   
          <arg type="object" refobjectid="rmi" />
                
          </register>
                
          <call method="start" refobjectid="rmi" />
                
          <create classname="nsmp.examples.mbeans.rmi.MyRemoteServiceObject" objectname="services:type=my-remote" />
             
          </startup>

             
          <shutdown>
                
          <call operation="stop" objectname="services:type=my-remote" />
                
          <call method="stop" refobjectid="rmi" />
                
          <call operation="stop" objectname="naming:type=rmiregistry" />
                
          <unregister objectname="services:type=my-remote"/>
                
          <unregister objectname="connectors:type=rmi,protocol=jrmp" />
                
          <unregister objectname="naming:type=rmiregistry" />
             
          </shutdown>
          </configuration> 

          java代碼:

          package nsmp.agent;

          import java.io.BufferedReader;
          import java.io.FileReader;
          import java.io.Reader;
          import java.net.Socket;

          import javax.management.MBeanServer;
          import javax.management.MBeanServerFactory;
          import javax.management.ObjectName;

          import mx4j.tools.config.ConfigurationLoader;
          import nsmp.util.NsmpGlobals;

          /**
           * @version 1.0
           * @author tower
           *
           * TODO write the comment of this type
           
          */

          public class NsmpServer {
              
          public void startup() throws Exception {
                  MBeanServer server 
          = MBeanServerFactory.newMBeanServer();
                  ConfigurationLoader loader 
          = new ConfigurationLoader();

                  server.registerMBean(loader, ObjectName.getInstance(
          "config:service=loader"));
                  Reader reader 
          = new BufferedReader(new FileReader(NsmpGlobals.NSMP_HOME + "/conf/config.xml"));
                  
                  loader.startup(reader);
                  reader.close();
                  System.
          out.println("Start the nsmp server successfully!");
              }

              
          public void shutdown() throws Exception {
                    String shutdownCommand 
          = "shutdown";
                    Socket socket 
          = new Socket("127.0.0.1"9999);
                    socket.getOutputStream().write(shutdownCommand.getBytes());
                    socket.close();
              }

          }


              startup方法調用配置文件的startup部分完成創(chuàng)建和注冊,shutdown方法調用配置文件的shutdown部分釋放相應的資源。通過調用 startup方法就可以起動MBeanServer提供服務了。對于shutdown開始搞了我半天startup后 ConfigurationLoader都沒有創(chuàng)建一個偵聽端口來接收shutdown命令,看了看mx4j的源碼發(fā)現(xiàn) ConfigurationLoader也沒有發(fā)現(xiàn)什么特殊地方。捉摸半天終于發(fā)現(xiàn)了自己放了一個愚笨的錯誤,eclipse是用普通用戶權限開的,沒有辦法創(chuàng)建偵聽,改成root后一切ok。

              接下就隨便寫了一個JMXConnector,代碼:

          /*
           * Copyright (C) The MX4J Contributors.
           * All rights reserved.
           *
           * This software is distributed under the terms of the MX4J License version 1.0.
           * See the terms of the MX4J License in the documentation provided with this software.
           
          */


          package nsmp.examples.mbeans.rmi;

          import java.util.Map;

          import javax.management.MBeanInfo;
          import javax.management.MBeanOperationInfo;
          import javax.management.MBeanServerConnection;
          import javax.management.ObjectName;
          import javax.management.remote.JMXConnector;
          import javax.management.remote.JMXConnectorFactory;
          import javax.management.remote.JMXServiceURL;


          /**
           * @version $Revision: 1.3 $
           
          */

          public class Client
          {
             
          public static void main(String[] args) throws Exception
             
          {
                     JMXServiceURL address 
          = new JMXServiceURL("service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmx");
                     Map creationEnv 
          = null;
                     JMXConnector connector 
          = JMXConnectorFactory.newJMXConnector(address, creationEnv);
                     
                     Map connectionEnv 
          = null;
                     connector.connect(connectionEnv);
                     
                     MBeanServerConnection serverConnection 
          = connector.getMBeanServerConnection();
                     ObjectName name 
          = ObjectName.getInstance("services:type=my-remote");
                     MBeanInfo mbInfo 
          = serverConnection.getMBeanInfo(name);
                     MBeanOperationInfo[] operationInfo 
          = mbInfo.getOperations();
                     
                     
          for (int i = 0; i < operationInfo.length; i++{
                         System.
          out.println(operationInfo[i].getName());
                     }

                     
                     serverConnection.invoke(name, 
          "sayHello"new Object[] {"Tower He"}new String[] {"java.lang.String"});
             }

          }



          JMXConnector是通過獲取一個MBeanServerConnection來實現(xiàn)遠程調用的,運行了一下一切順利通過。

          下載:MX4JExample.rar
          posted @ 2005-02-05 19:07 非飛 閱讀(5709) | 評論 (0)編輯 收藏

          命運之可怕

             深夜,沒有睡。不是在寫程序,而是在看《難兄難弟》。兩大男主角都是我所喜歡的,羅嘉良扮演李奇,吳鎮(zhèn)宇飾演謝源。電視的情節(jié)跌宕起伏,命運被劇中的演員詮釋的入木三分。正所謂存在必不容易,電視劇的劇本不是編劇憑空想象而寫成的,特別是好的劇本定是編劇不知道咬了多少筆頭而寫就而成的。(寫好的程序不也是這樣嗎?)在《難兄難弟》一劇中謝源是一個在事業(yè)上一路順風,扶搖直上的大明星,而李奇的星路則是坎坷嶇崎的,做的角色大多是跑龍?zhí)滓活惖模墙洺W銎渌餍堑挠白樱ㄌ嫔恚R簧聿湃A得不到人得賞識,有力無處使。命運簡直是講所有的一切大風大浪都強加與他的身上。以前看電視,總是覺得有不有這么巧呀,什么壞是都被他遇上了。而今,長大了,對周圍的人、事也見多了。最后不得不感嘆,原來命運真的是如此的不公平。知道不公平又能怎么樣呢?人,作為一種自認為是高級的物種存在于這顆被稱為地球的星球上,其實他本身是多么的渺小。對于自己面臨的問題,很多時候人都是兩手一擺,無能為力。
             前段時間跟一位故友討論了一下所謂的人生價值。在閑聊之間,發(fā)現(xiàn)人生價值太難以去把握。人的一生拿來于宇宙來比較,太為短暫微不足道了。而一個人要在如此短暫的生命區(qū)間里找尋到自己的價值,談何容易。馬克思說一個人存在的價值是通過他的社會價值來表現(xiàn)的。只有當他實現(xiàn)了自己的社會價值,得到了社會的肯定和承認,這樣才能得到社會的回報,得到自己的個人價值。從字面上來看,馬克思說的這一點是勿庸置疑的。但是當用馬克思的另一個原理矛盾存在的普遍性在來分析一下人生。人的一身是短暫的,而矛盾無處不在。從宏觀的角度看,價值觀可能如馬克思所說,但是從微觀上來說,人的一生是充滿了不平等待遇的。就是所謂的好人未必又好報。劇本中的李奇這角色充分的體現(xiàn)了這一點。當人被命運不斷的摧殘下,有幾個人能真正的挨得住,撐得下去。(可能有人說我太消極了,應該用積極的態(tài)度去看待,應該認為是在接受命運的考驗。)可能是我真的太悲觀了,但是我知道如果換成我是李奇我肯定頂不住。我覺得已經遠遠超過了我的承受能力。命運可能認為只是跟他開一個小小的玩笑,可是不要忘記人是渺小的,開不起這樣的玩笑。

          posted @ 2005-02-03 03:02 非飛 閱讀(1966) | 評論 (0)編輯 收藏
          看了一天的文檔,頭都要炸了,加上原本就有的發(fā)燒,簡直就是要我的命了。上班的日子不知道比考研要累上多少被,才三天就有點支持不住了,可是為了生活沒有辦法呀。下午討論了一下如何做到對一個局域網的安全性進行評估。單單只是談論了一下需求就發(fā)現(xiàn)這個系統(tǒng)實在是把簡單。
          目前提出的需求有:
          1. 網絡上各節(jié)點主機是否存在病毒;
          2. 網絡上各節(jié)點主機存在的漏洞評估;
          3. 主機上是否存在非法用戶和非法應用;
          4. 對網絡上敏感信息的搜索;
          5. 網絡拓撲是否安全合理。
          以上無條需求出了2、5以外其他的都是一個“偉大的工程”,需要慢慢研究。無奈呀
          posted @ 2005-01-26 19:34 非飛 閱讀(1565) | 評論 (0)編輯 收藏
          辛苦呀,是在是很辛苦。不過總算是熬過去了。看了3個月的考研書,頭都快要大了。考完第3天了,回實驗室也是第3天了,一大堆的東西要看,要寫。最為郁悶 的是,昨天晚上開始有點發(fā)燒了,頭疼的要命。同學坐今天下午的火車回家,沒有辦法,命苦呀,頭痛還是要硬著頭皮去送人。把知道西客站今天的人是否很多,但 愿少一點。
          posted @ 2005-01-26 10:00 非飛 閱讀(630) | 評論 (1)編輯 收藏
          主站蜘蛛池模板: 禹城市| 黄平县| 陇川县| 磐石市| 永仁县| 浦东新区| 连城县| 翼城县| 台州市| 阳春市| 循化| 清新县| 平果县| 泌阳县| 城口县| 遵义市| 云安县| 渑池县| 炎陵县| 韶关市| 敖汉旗| 平山县| 凤山县| 克山县| 米脂县| 宜章县| 锦州市| 宜良县| 霍山县| 宜君县| 汝阳县| 甘谷县| 乌拉特前旗| 六盘水市| 彭泽县| 泰和县| 江永县| 儋州市| 安陆市| 博罗县| 沙坪坝区|