@ My Space
posted @
2005-05-13 00:08 非飛 閱讀(2464) |
評論 (2) |
編輯 收藏
@ My space
posted @
2005-05-07 00:19 非飛 閱讀(2228) |
評論 (0) |
編輯 收藏
在JDK1.4.2中加入了對NIO的支持,掌握其中的Selector個(gè)人認(rèn)為是能實(shí)現(xiàn)好NIO的關(guān)鍵。
Selector是用來獲取注冊在其中的channel的相關(guān)事件的發(fā)生,也就是accept,read和write。selector中有3個(gè)key set。
key set:包含代表所有在其中注冊的channel,可以通過selector.keys()得到。
selected-key set:包含所有被檢測到有關(guān)注的操作已經(jīng)就緒的key,通過selector.selectedKeys得到。
cancelled-key set:包含所有已經(jīng)被cancel,但是還沒有channel還沒有deregister的key,這個(gè)集合是不能直接被訪問的。
key通過調(diào)用channel的register方法被加入到key set中。被取消的key在select的時(shí)候會(huì)被從相應(yīng)的key set中移除。
key set自身是不可以直接進(jìn)行修改的。
無論是通過調(diào)用channel的close方法還是調(diào)用key的cancel方法,key都會(huì)被放置到canceled-key set中。取消的key會(huì)將其channel在下一次select時(shí)將注冊撤銷,同時(shí)將key從所有的key set中移除。
key在執(zhí)行select操作時(shí)被加入到selected-key set中。在selected-key
set中的key可以通過調(diào)用iterator的remove方法,將其從selected-key
set中移除,不能通過其他的辦法將其從selected-key set中移除。
通過selector的3個(gè)方法select(阻塞選擇,直到有關(guān)心的事件發(fā)生時(shí)退出阻塞),selectNow(不阻塞選擇),select(long)(指定超時(shí)選擇,超時(shí)到達(dá)或者有關(guān)心事件發(fā)生時(shí)退出阻塞),來獲取關(guān)心事件的發(fā)生。其執(zhí)行步驟分為以下3步:
1、將存在于canceled-key set中的key從所有的key set中移除,撤銷注冊的channel,清空canceled-key set。
2、地層操作系統(tǒng)檢查是否有關(guān)心的事件發(fā)生,當(dāng)有關(guān)心的事件發(fā)生時(shí),首先檢查channel的key是否已經(jīng)存在于selected-key
set中,如果不存在,則將其加入到selected-key set中去,同時(shí)修改key的ready-operation
set來表明當(dāng)前ready的操作,而以前存在于ready-operation
set中的信息會(huì)被刪除。如果對應(yīng)的key已經(jīng)存在于selected-key set中,這直接修改其ready-operation
set來表明當(dāng)前ready的操作,刪除原來ready-operation set中的信息。
3、如果在第二步中有加入到canceled-key set中的key,在這一步會(huì)執(zhí)行第一步的操作。
selector自身是線程安全的,而他的key
set卻不是。在一次選擇發(fā)生的過程中,對于key的關(guān)心事件的修改要等到下一次select的時(shí)候才會(huì)生效。
另外,key和其代表的channel有可能在任何時(shí)候被cancel和close。因此存在于key
set中的key并不代表其key是有效的,也不代表其channel是open的。如果key有可能被其他的線程取消或關(guān)閉channel,程序必須小
心的同步檢查這些條件。
阻塞了的select可以通過調(diào)用selector的wakeup方法來喚醒。
posted @
2005-04-26 10:06 非飛 閱讀(17393) |
評論 (3) |
編輯 收藏
在JavaScript中,可以通過window.location來獲取url地址。但是window.location是一個(gè)對象,沒有辦法直接從里面獲取出我們需要的參數(shù)。通常的做法就是使用一個(gè)隱藏的<input>,通過將window.location負(fù)值給input。其目的就是為了將location轉(zhuǎn)換成String。寫的過程中總是覺得太復(fù)雜了,后來發(fā)現(xiàn)使用document.URL就可以解決這個(gè)問題。
posted @
2005-04-18 15:52 非飛 閱讀(4100) |
評論 (3) |
編輯 收藏
今天在幫朋友寫一個(gè)簡單的產(chǎn)品發(fā)布網(wǎng)站,由于使用的空間是靜態(tài)的,沒有辦法只能在javascript上下功夫了。首先想到的便是RIA,上網(wǎng)google了一下,發(fā)現(xiàn)這樣的東西還真不少,可謂是十八般武藝各顯靈通。看了看文明的bindows,感覺真的非常的好。可是選擇它對于我要做的東西,可以說是過于復(fù)雜了。(http://www.bindows.net 有興趣的朋友可以去看看)。
搜索了半天最后還是決定,采用javascript讀取服務(wù)器端xml文件的辦法來實(shí)現(xiàn)。嘗試了一下感覺還不錯(cuò),確定就是對使用的瀏覽器有依賴。
先寫了一個(gè)商品的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í)在是相當(dāng)?shù)暮唵危恍枰獌删湓捑涂梢愿愣ǎ?BR>
// 裝載xml文件的函數(shù)
function loadXML(fileName) {
// 定義一個(gè)xml dom對象
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.load(fileName);
xmlObj = xmlDoc.documentElement;
}
指定要載入的xml文件名就可以完成對xml的讀入。
// 載入xml文件
loadXML("product.xml");
得到xml對象后就可以適用對象提供的相應(yīng)方法和屬性來獲取xml中定義的數(shù)據(jù)信息。
xmlObj.hasChildNodes來判斷是否含有子項(xiàng);
xmlObj.childNodes.lenght 得到包含的子項(xiàng)的數(shù)量
子項(xiàng)可以用數(shù)字來作為索引,以product.xml為例。如果我們要獲取第二條商品時(shí),可以用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 非飛 閱讀(4719) |
評論 (1) |
編輯 收藏
下載了一個(gè)Action Script Viewer 4.0對原來的swf文件進(jìn)行反編譯,雖然有的movie clip會(huì)出現(xiàn)一點(diǎn)問題,但是總的來說效果還是不錯(cuò)的,而且操作相當(dāng)?shù)暮唵巍?BR>
1)使用ASV打開要進(jìn)行反編譯的SWF文件;
2)File-->export rebuild data。這時(shí)將swf文件分拆成單個(gè)的swf文件;
3)打開flash,創(chuàng)建一個(gè)空的fla文件;
4)File-->Import...-->Import to Library 將前面導(dǎo)出的swf文件導(dǎo)入,如果swf文件太多flash會(huì)報(bào)錯(cuò),可以通過分批導(dǎo)入文件來繞過這個(gè)錯(cuò)誤;
5)將新建的swf文件保存為rebuild.fla,并且3)導(dǎo)出的文件在同一目錄;
6)運(yùn)行3)產(chǎn)生的一個(gè)rebuild.jsfl文件,一切搞定。
posted @
2005-04-04 03:32 非飛 閱讀(2704) |
評論 (1) |
編輯 收藏
中午收到老姐來的電話,電話里她是一遍一遍又一遍的在我耳邊嘮叨,說,“不管你怎么忙,有多少東西要寫,一定要按時(shí)睡覺”。還列出了一堆要按時(shí)睡覺的理由。其實(shí)誰不知道應(yīng)該要按時(shí)睡覺,可是作為寫程序的程序員來說,要真想做到這一點(diǎn)實(shí)在是難,難,難呀!
要按時(shí)睡覺的理由:
從人的排毒期入手:晚間11:00--1:00,肝的排毒期(必須在睡覺中進(jìn)行)
從人的睡眠最佳時(shí)段入手:1:00--4:00,人的睡眠是質(zhì)量最高的
不知道各位有誰是有正常的生活習(xí)慣的,能不能說一說你是怎么做到的。。。
posted @
2005-03-23 15:25 非飛 閱讀(2120) |
評論 (3) |
編輯 收藏
做項(xiàng)目,無論是遺留產(chǎn)品的再生產(chǎn),還是對遺留產(chǎn)品的再利用,都不可避免的會(huì)出現(xiàn)一大堆的異構(gòu)現(xiàn)象。解決異構(gòu)通信問題是這類項(xiàng)目的主要問題。以前看見這種情況第一個(gè)解決方案就是Socket通信。說實(shí)在的自己實(shí)現(xiàn)Socket通信,定制通信協(xié)議,或者是實(shí)現(xiàn)已有的通信協(xié)議都是很頭痛的事情。本人有不堪回首的歷史經(jīng)歷。
最近同樣在項(xiàng)目中需要去解決一個(gè)異構(gòu)問題,由于時(shí)間的緊迫,以及先天的運(yùn)行環(huán)境(兩個(gè)部分是運(yùn)行在同一臺(tái)機(jī)器上的)。考慮到了使用JNI,結(jié)果表明JNI是完全可以勝任目前的角色的。以前沒有了解過JNI,總是以為它這不好那不好,用了用,表現(xiàn)還不錯(cuò),而且實(shí)現(xiàn)起來非常之簡單。
整個(gè)實(shí)現(xiàn)過程可以分為五步來完成:
1)寫一個(gè)聲明了native的Java文件:
package example;


public class TestJNI
{

static
{
System.loadLibrary("test");
}
public native String getNameCPP();
}

2) 使用javah產(chǎn)生對應(yīng)的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)實(shí)現(xiàn)對應(yīng)的CPP代碼:
#include "example_TestJNI.h"
#include <string>

JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
(JNIEnv * env, jobject)


{
//TODO 可以在此調(diào)用其他的代碼
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 非飛 閱讀(3354) |
評論 (0) |
編輯 收藏
做了這么久的軟件,從來就沒有好好的學(xué)習(xí)過設(shè)計(jì)模式。寫代碼,做設(shè)計(jì)的時(shí)候都是稀里糊涂。做出來的設(shè)計(jì),都會(huì)不同程度的讓自己感覺到不安。這可能就是《設(shè)計(jì)模式精解》書中所說那種直覺吧。
引用:
留意你的知覺
出自本能的直覺能對設(shè)計(jì)質(zhì)量做出令人驚訝的預(yù)測。所謂“出自本能的直覺”,是指當(dāng)你看到某些不喜歡的東西時(shí),你胃部的感覺。我知道這聽起來并不科學(xué)(而且它的確不科學(xué)),但我的經(jīng)驗(yàn)總是向我證明:當(dāng)我從直覺上不喜歡一個(gè)設(shè)計(jì)時(shí),一個(gè)更好的設(shè)計(jì)一定就躺在角落里。
Facade模式:關(guān)鍵特征
意圖:希望簡化現(xiàn)有系統(tǒng)的使用方法。你需要定義自己的接口。
問題:只需要使用一個(gè)復(fù)雜系統(tǒng)的一個(gè)子集。或者,需要用一種特殊的方式與系統(tǒng)交互。
解決方案:Facade向客戶展現(xiàn)使用現(xiàn)有系統(tǒng)的一個(gè)新的接口。
參與者與協(xié)作者:向客戶展現(xiàn)一個(gè)定制的接口,讓客戶更容易地使用現(xiàn)有系統(tǒng)。
效果:Facade模式簡化了對所需子系統(tǒng)的使用。但是,由于Facade并不完整,因此某些功能對于客戶可能是可用的。
現(xiàn)實(shí):1)定義一個(gè)(或一組)新的類來提供所需要的接口。
2)讓新的類使用現(xiàn)有的系統(tǒng)。
Facade模式使用于以下情況:
- 不需要使用一個(gè)復(fù)雜系統(tǒng)的所有功能,并且可以創(chuàng)建一個(gè)新的類來包容訪問原有系統(tǒng)的接口的一個(gè)子集(通常它就是)比原始系統(tǒng)AP簡單得多。
- 希望包裝或隱藏原有系統(tǒng)。
- 希望使用原有系統(tǒng)的功能,并且希望增加一些新的功能。
- “編寫一個(gè)新的類”的代價(jià)小于“讓所有人學(xué)會(huì)使用原有系統(tǒng)”或“在未來維護(hù)整個(gè)系統(tǒng)”所需的代價(jià)
posted @
2005-03-13 23:41 非飛 閱讀(2640) |
評論 (0) |
編輯 收藏
一個(gè)項(xiàng)目通常分為表示層、業(yè)務(wù)邏輯層和持久層,這是最為常見的三層結(jié)構(gòu)。在組織團(tuán)隊(duì)進(jìn)行項(xiàng)目開發(fā)的時(shí)候,選擇如何分工對版本控制有很大的影響。團(tuán)隊(duì)在做開發(fā)的時(shí)候一般有兩種模式:按層開發(fā)和按功能開發(fā)。
按層開發(fā)(本人贊同的模式)
在這種開發(fā)模式下,每個(gè)開發(fā)人員的目錄結(jié)構(gòu)相對固定和獨(dú)立。對于CVS這類按文件夾來控制權(quán)限的版本控制服務(wù)器來說,比較容易實(shí)現(xiàn)對開發(fā)人員權(quán)限的劃分,不易出現(xiàn)文件不同步而導(dǎo)致的版本混亂。
另外,這種開發(fā)模式下,更能集中開發(fā)人員的注意力,不需要了解太多與本層無關(guān)的其他技術(shù)。將精神全部集中在如何實(shí)現(xiàn)本層的功能上,更有利于寫出功能強(qiáng)大,運(yùn)行穩(wěn)定的代碼。例如:開發(fā)業(yè)務(wù)邏輯層的開發(fā)人員,他不可避免的會(huì)寫很多邏輯上基本上一致的代碼,在寫代碼的過程中,就能從中找出一些相對的共性,將公共的代碼進(jìn)行抽象,從而避免了出現(xiàn)大量的重復(fù)代碼。由于工作范圍相對較小,能有更多的時(shí)間去學(xué)習(xí)相關(guān)方面的最新技術(shù)和解決方案,并應(yīng)用到程序中,能使程序在實(shí)現(xiàn)方式上較為先進(jìn)、優(yōu)越。
老天是公平的,萬物有其好的一面也必然有其不好的一面,這種開發(fā)模式也不能例外。對于需求不明確,無法定義相對固定的對外接口時(shí),這中按層開發(fā)的模式就有其無法避免的一個(gè)問題。各層開發(fā)人員需要在開發(fā)的過程中,反覆的修改接口,以便適應(yīng)于變化了的需求。這必然就導(dǎo)致邏輯處理部分代碼要做相應(yīng)的修改。
按功能開發(fā)(本人持保留態(tài)度)
這種開發(fā)模式下,開發(fā)人員的目錄結(jié)構(gòu)基本是項(xiàng)目的完整目錄接口,他們需要到各層去編寫對應(yīng)他們所開發(fā)的模塊的所有代碼。對于CVS這類版本控制服務(wù)器來說,基本上是無法做到對開發(fā)人員權(quán)限的界定。很容易造成版本控制混亂,導(dǎo)致文件版本不同步,是在開發(fā)過程中使用了公共文件的開發(fā)人員不能保證同步。例如:一個(gè)文件為多個(gè)開發(fā)人員所共同維護(hù),開發(fā)人員各自都需要在其中添加自己功能所需要部分的代碼。這樣很容易出現(xiàn)多個(gè)人同時(shí)修改一個(gè)文件的情況,導(dǎo)致文件不同步而造成的版本混亂。
另外,這種開發(fā)模式對開發(fā)人員的技術(shù)要求相對較高,它要求開發(fā)人員掌握各層中所需要的技術(shù)。從界面顯示到數(shù)據(jù)持久化,甚至到網(wǎng)絡(luò)通信都需要一個(gè)開發(fā)人員去實(shí)現(xiàn)。在功能實(shí)現(xiàn)架構(gòu)不是很確定的情況下,程序代碼中將會(huì)出現(xiàn)大量的重復(fù)代碼,因?yàn)槊總€(gè)人都有自己的實(shí)現(xiàn)機(jī)制,而邏輯處理相同或相近的情況在同一層中出現(xiàn)頻率又比較高。導(dǎo)致程序的整體結(jié)構(gòu)不統(tǒng)一,盡管層次結(jié)構(gòu)相同。使得程序日后維護(hù)極度困難,大大的提高了維護(hù)成本。由于開發(fā)人員牽涉使用的技術(shù)過多,也很難保證程序?qū)崿F(xiàn)方式的先進(jìn)性和優(yōu)越性。
posted @
2005-03-03 21:06 非飛 閱讀(2307) |
評論 (0) |
編輯 收藏
Hibernate的繼承映射包含了三種不同的策略:
- 每簇類使用一個(gè)表;
- 每個(gè)子類一個(gè)表;
- 每個(gè)具體內(nèi)一個(gè)表(有限制)。
假設(shè)我們有四個(gè)類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
}
使用每簇類使用一個(gè)表的策略時(shí),有一個(gè)限制就時(shí)子類不能有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>
使用每個(gè)子類一個(gè)表的策略時(shí),可以使用一個(gè)映射文件實(shí)現(xiàn),也可以分成多個(gè)映射文件來實(shí)現(xiàn)。每個(gè)子類一個(gè)映射文件的情況:
文件名: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> 每個(gè)子類一個(gè)表的策略實(shí)際上一種one-to-one的映射。
- 每個(gè)具體內(nèi)一個(gè)表(有限制)
使用每個(gè)具體內(nèi)一個(gè)表(有限制)策略時(shí),每一個(gè)子類的映射文件將要包含所有父類中的屬性,映射文件:
文件名: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 非飛 閱讀(4601) |
評論 (1) |
編輯 收藏
網(wǎng)上一大堆關(guān)于PO,POJO,DTO,VO等等對象的討論,通常都是各持己見,公說公有理,婆說婆有理,討論到最后也沒有什么定論。今天看到一個(gè)應(yīng)用的代碼,發(fā)現(xiàn)其講PO直接做為VO(view object)在表示層使用。只從代碼上講,這樣做確實(shí)省去了跟多操作。不用重復(fù)的做對象的賦值、構(gòu)造。但是會(huì)過頭來看,這樣無疑增加了代碼的耦合性。做一個(gè)簡單的假設(shè),如果對持久層的PO進(jìn)行了修改,相應(yīng)的使用PO做為對應(yīng)的VO(value object)業(yè)務(wù)邏輯層和使用PO最為VO(view object)的表示層都必須做相應(yīng)的修改,如此的應(yīng)用給代碼的維護(hù)帶來了很大的負(fù)擔(dān),可謂是一動(dòng)則百動(dòng)。
在J2EE應(yīng)用開發(fā)中,是不應(yīng)該出現(xiàn)這中PO共享使用的方式的。實(shí)體對象不應(yīng)該被跨層使用,各層維護(hù)自己的實(shí)體對象。這點(diǎn)看書我想大家都知道,而在實(shí)際應(yīng)用中很多人都選擇不遵循這一規(guī)則。(在使用hibernate時(shí)有所不同,引用:“
不過由于Hibernate的強(qiáng)大功能,例如動(dòng)態(tài)生成PO,PO的狀態(tài)管理可以脫離Session,使得在應(yīng)用了Hibernate的J2EE框架中,PO完全可以充當(dāng)VO,因此我們下面把PO和VO合并,統(tǒng)稱為PO。”引文:
結(jié)合struts和hibernate談J2EE架構(gòu)的數(shù)據(jù)表示。)出現(xiàn)這總現(xiàn)象,我想原因只有一個(gè)就是貪圖了一時(shí)的省事,在一次性應(yīng)用開發(fā)中,相對的業(yè)務(wù)對象改動(dòng)可能性相當(dāng)?shù)纳伲芏鄷r(shí)候在做項(xiàng)目的時(shí)候并不會(huì)出現(xiàn)預(yù)料不到的改變,沒有必要去管理一大堆各式各樣的實(shí)體對象,這樣就自然的導(dǎo)致了PO在各層中共享使用。可是就我目前接觸到的項(xiàng)目基本上沒有需求是如此明確的,通常需求都是在不斷的改變,甚至有時(shí)到了最后發(fā)版的時(shí)候,一些客戶都會(huì)提出修改需求的要求。另外就是自做需求的情況就更是如此了,這種項(xiàng)目的需求是不斷的在變化的。為了保證項(xiàng)目的適應(yīng)性和可擴(kuò)展性,就必須保證各層之間的相對獨(dú)立,盡可能降低耦合度。
posted @
2005-03-01 12:40 非飛 閱讀(2463) |
評論 (2) |
編輯 收藏
看了兩天文檔,總算對JMX有了一個(gè)整體的認(rèn)識(shí)。發(fā)現(xiàn)使用mx4j實(shí)現(xiàn)JMX還是相當(dāng)?shù)妮p松的。MBeans可以使用mx4j-tools中的 Xdoclet偷一下懶,讓它自動(dòng)的生成MBeans和Descriptions,ant有相應(yīng)的支持,還是比較方便的,對于MBean接口的實(shí)現(xiàn),自己寫了。
對于如何產(chǎn)生和注冊MBeans,mx4j提供了一個(gè)相當(dāng)方便的工具,為什么說相當(dāng)方便,是因?yàn)樗娴膶?shí)在是太方便了。通過寫一個(gè)xml配置文件可以完成所有的工作。比起M-LET確實(shí)是強(qiáng)了不少。下面就是一個(gè)在MBean Server產(chǎn)生注冊一個(gè)NamingService、JMXConnectorServer和一個(gè)自寫的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方法調(diào)用配置文件的startup部分完成創(chuàng)建和注冊,shutdown方法調(diào)用配置文件的shutdown部分釋放相應(yīng)的資源。通過調(diào)用 startup方法就可以起動(dòng)MBeanServer提供服務(wù)了。對于shutdown開始搞了我半天startup后 ConfigurationLoader都沒有創(chuàng)建一個(gè)偵聽端口來接收shutdown命令,看了看mx4j的源碼發(fā)現(xiàn) ConfigurationLoader也沒有發(fā)現(xiàn)什么特殊地方。捉摸半天終于發(fā)現(xiàn)了自己放了一個(gè)愚笨的錯(cuò)誤,eclipse是用普通用戶權(quán)限開的,沒有辦法創(chuàng)建偵聽,改成root后一切ok。
接下就隨便寫了一個(gè)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是通過獲取一個(gè)MBeanServerConnection來實(shí)現(xiàn)遠(yuǎn)程調(diào)用的,運(yùn)行了一下一切順利通過。
下載:MX4JExample.rar
posted @
2005-02-05 19:07 非飛 閱讀(5706) |
評論 (0) |
編輯 收藏
命運(yùn)之可怕
深夜,沒有睡。不是在寫程序,而是在看《難兄難弟》。兩大男主角都是我所喜歡的,羅嘉良扮演李奇,吳鎮(zhèn)宇飾演謝源。電視的情節(jié)跌宕起伏,命運(yùn)被劇中的演員詮釋的入木三分。正所謂存在必不容易,電視劇的劇本不是編劇憑空想象而寫成的,特別是好的劇本定是編劇不知道咬了多少筆頭而寫就而成的。(寫好的程序不也是這樣嗎?)在《難兄難弟》一劇中謝源是一個(gè)在事業(yè)上一路順風(fēng),扶搖直上的大明星,而李奇的星路則是坎坷嶇崎的,做的角色大多是跑龍?zhí)滓活惖模墙?jīng)常做其他明星的影子(替身)。一身才華得不到人得賞識(shí),有力無處使。命運(yùn)簡直是講所有的一切大風(fēng)大浪都強(qiáng)加與他的身上。以前看電視,總是覺得有不有這么巧呀,什么壞是都被他遇上了。而今,長大了,對周圍的人、事也見多了。最后不得不感嘆,原來命運(yùn)真的是如此的不公平。知道不公平又能怎么樣呢?人,作為一種自認(rèn)為是高級的物種存在于這顆被稱為地球的星球上,其實(shí)他本身是多么的渺小。對于自己面臨的問題,很多時(shí)候人都是兩手一擺,無能為力。
前段時(shí)間跟一位故友討論了一下所謂的人生價(jià)值。在閑聊之間,發(fā)現(xiàn)人生價(jià)值太難以去把握。人的一生拿來于宇宙來比較,太為短暫微不足道了。而一個(gè)人要在如此短暫的生命區(qū)間里找尋到自己的價(jià)值,談何容易。馬克思說一個(gè)人存在的價(jià)值是通過他的社會(huì)價(jià)值來表現(xiàn)的。只有當(dāng)他實(shí)現(xiàn)了自己的社會(huì)價(jià)值,得到了社會(huì)的肯定和承認(rèn),這樣才能得到社會(huì)的回報(bào),得到自己的個(gè)人價(jià)值。從字面上來看,馬克思說的這一點(diǎn)是勿庸置疑的。但是當(dāng)用馬克思的另一個(gè)原理矛盾存在的普遍性在來分析一下人生。人的一身是短暫的,而矛盾無處不在。從宏觀的角度看,價(jià)值觀可能如馬克思所說,但是從微觀上來說,人的一生是充滿了不平等待遇的。就是所謂的好人未必又好報(bào)。劇本中的李奇這角色充分的體現(xiàn)了這一點(diǎn)。當(dāng)人被命運(yùn)不斷的摧殘下,有幾個(gè)人能真正的挨得住,撐得下去。(可能有人說我太消極了,應(yīng)該用積極的態(tài)度去看待,應(yīng)該認(rèn)為是在接受命運(yùn)的考驗(yàn)。)可能是我真的太悲觀了,但是我知道如果換成我是李奇我肯定頂不住。我覺得已經(jīng)遠(yuǎn)遠(yuǎn)超過了我的承受能力。命運(yùn)可能認(rèn)為只是跟他開一個(gè)小小的玩笑,可是不要忘記人是渺小的,開不起這樣的玩笑。
posted @
2005-02-03 03:02 非飛 閱讀(1963) |
評論 (0) |
編輯 收藏