vista

回顾※展望                     潜心技术&&不再搁浅

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  12 Posts :: 1 Stories :: 13 Comments :: 0 Trackbacks

2006年11月7日 #

   一直在为自己找借口,找理由,却始终不能专心一意下来,一直在为自己辩护: 找个机会重新开始!
   一直在为自己的QQ找个新名字,想从头再来; 一直想为自己的游戏帐号换个新名字,想从头再来;
   一直在为自己找一份满意的工作,想从头再来; 一直想为自己的懒惰找个理由- - 过段时间,一切从头开始.
   现在,我发现,那些全部是借口;
   现在,我发现: 时间不能再浪费,我也没有更多的时间去等待,去寻找一个所谓的新的机会,.
   all i  have is now and all i can hold is now, tomorrow is not held by myself.
   从现在开始, 两个字: 专心一意!



   自打辞掉第一份程序员的工作, 我始终不能专心下来,认真的工作,我承认,当时是冲动,辞职那么久以来,
一直为这件事情反省,我也尽力了,只是我没找到明确的方向,再加上自己的性格,容易受外界影响,不够有耐心,做事不够坚决,导致现在的困难状况,今天再次和以前同事的聊天,我开始认识到,有些事情,过去了,用不着再挂念,人总是在失败和挫折中长大的,有经历,才有沉淀,才有收获,前世不忘,后事之师.
   今天暂且主要回顾下自己的弱点:
   1,缺乏计划性: 不管是为人处世,还是工作学习, 都缺乏一定的计划性和针对性,由此增长的是懒惰和懈怠,这是当前最大的忧患.
   2,缺乏系统性: 主要表现在工作和学习中,缺乏一条循序渐进的路线,特别在学习的时候,一时学这个,一时学那个, 基础没打牢,就开始学人家研究高级技术,到头来脚跟不稳,难免跌倒.
   3,缺乏警惕性: 条件一稳定,就表现出懈怠的情绪, 完全忘记了"生于安乐,死于忧患"的历史名句, 没有贯彻不断学习和提高的思想,路线,

   以上三点是总结的比较深刻的三点, 这段时间一定多花时间, 看怎么设计一条路子,才可以逐渐的扭转这种状况, 同时慢慢转入正轨, 重新找回当初的自己.
   一直在想, 我不能流于世俗, 流于肤浅, 我应该担当的是不同凡人的责任感和紧迫感, 今天我跌到最低谷,不要紧,没关系, 我还年轻, 我还有很多机会, 我要紧握这种紧迫感和责任感以及这份压力, 更精彩的活下去.
   打点好行装, 该上路了.


                                                                                                                                                2006.12.27凌晨 
                                                                                                                                                                  diego.liu

posted @ 2006-12-17 00:18 Vista 阅读(619) | 评论 (1)编辑 收藏

      前些天,也就是6号辞职了,这些天只在中博和网信联动面试了下,投了很多简历,而且简历也被阅览了很多次,但很少接到电话,呆在家里不上班的日子,真是特快,心里没什么底,有点后悔辞职的冲动,不会也没什么,机会还是有的,况且自己还是相信自己的实力,毕竟有一年的工作经验,不过这些天还是在努力地学习,把基础打牢再说.
      华为一般是周五面试,其实我几乎没去华为面试,有几次华为打电话过来,我恰好有其他的面试,所以去不了,这次反正闲着也是闲着,所以,在上午接到电话后,下午坐公车去了.
      我住的地方去华为基地比较远,坐公车都要5元RMB,下了车,打了电话,经过电话指点,终于找到了面试地点,外面好冷,进去就不怎么冷了,没说别的,拿起试卷就开始做题.
      题目的难度在我预料之中,依我的水平也就拿个70分左右的样子(一般的公司我可以拿80以上,^_^),
令我意外的是,笔试完后,面试技术的考官并没怎么看我的答案,而是直接和我聊起技术方面的东西,问的很详细,特别是问到具体做过的项目时,问的比较仔细,要不是我真的做过,非穿帮不可,呵呵,问了项目,就开始问技术,只要我简历上写的技术,他都会问的很仔细,有几个地方,我记得不是很清楚,也就打哈哈过去,他也没说什么,就这样问了大概一个多钟头,他才说,好了,你在这等下,就走了,我好不容易许了一口气,心里也没什么底,等了10分钟的样子,来了一个领导模样的人物,拿了本笔记本,就坐在我旁边,和我聊起了一些看似琐碎的东西,其实在暗里考察的问题,总体感觉还过的去,完了,他说,我考虑下,就走了,出去的时候我和面试我技术的考官一起出去,他问我感觉怎么样,我说还行,他说过几天会电话通知我,呵呵,当时应该问下他机会大不,可惜了,现在也只好在家等结果了,不过中博那边如果要我马上上班的话,我还真不好抉择,因为中博那边是做外包,而且要出差,虽然薪资有点诱人,但毕竟感觉没进华为好.
      失业的日子的确比较枯燥,闲着没事就随便写写 了,呵呵,很晚了,要睡了....

posted @ 2006-12-15 01:19 Vista 阅读(2525) | 评论 (2)编辑 收藏

     摘要: 通过分析SQL语句的执行计划优化SQL(总结) 做DBA快7年了,中间感悟很多。在DBA的日常工作中,调整个别性能较差的SQL语句时一项富有挑战性的工作。其中的关键在于如何得到SQL语句的执行计划和如何从SQL语句的执行计划中发现问题。总是想将日常经验的点点滴滴总结一下,但是直到最近才下定决心,总共花了3个周末时间,才将其整理成册,便于自己日常工作。不好意思独享,所以将其贴出...  阅读全文
posted @ 2006-12-13 19:32 Vista 阅读(3441) | 评论 (0)编辑 收藏

dom4j(Version 1.6.1)快速入门

Parsing XML

或许你想要做的第一件事情就是解析一个某种类型的XML文档,用dom4j很容易做到。请看下面的示范代码:

import java.net.URL;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class Foo {

public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
}

使用迭代器(Iterators)

我们可以通过多种方法来操作XML文档,这些方法返回java里标准的迭代器(Iterators)。例如:

public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();
//迭代根元素下面的所有子元素
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
//处理代码
}

//迭代根元素下面名称为"foo"的子元素
for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
Element foo = (Element) i.next();
//处理代码
}

// 迭代根元素的属性attributes)元素
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}
}

强大的XPath导航

在dom4j中XPath可以表示出在XML树状结构中的Document或者任意的节点(Node)(例如:Attribute,Element 或者 ProcessingInstruction等)。它可以使在文档中复杂的操作仅通过一行代码就可以完成。例如:

public void bar(Document document) {
List list = document.selectNodes( "//foo/bar" );

Node node = document.selectSingleNode( "//foo/bar/author" );

String name = node.valueOf( "@name" );
}

如果你想得到一个XHTML文档中的所有超文本链接(hypertext links)你可以使用下面的代码:

public void findLinks(Document document) throws DocumentException {

List list = document.selectNodes( "//a/@href" );

for (Iterator iter = list.iterator(); iter.hasNext(); ) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
}
}

如果你需要关于XPath语言的任何帮助,我们强烈推荐这个站点Zvon tutorial他会通过一个一个的例子引导你学习。

快速遍历(Fast Looping)


如果你不得不遍历一个非常大的XML文档,然后才去执行,我们建议你使用快速遍历方法(fast looping method),它可以避免为每一个循环的节点创建一个迭代器对象,如下所示:

public void treeWalk(Document document) {
treeWalk( document.getRootElement() );
}

public void treeWalk(Element element) {
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
Node node = element.node(i);
if ( node instanceof Element ) {
treeWalk( (Element) node );
}
else {
// do something....
}
}
}

生成一个新的XML文档对象

在dom4j中你可能常常希望用程序生成一个XML文档对象,下面的程序为你进行了示范:

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class Foo {

public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );

Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );

Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );

return document;
}
}

将一个文档对象写入文件中

将一个文档对象写入Writer对象的一个简单快速的途径是通过write()方法。

FileWriter out = new FileWriter( "foo.xml" );
document.write( out );

如果你想改变输出文件的排版格式,比如你想要一个漂亮的格式或者是一个紧凑的格式,或者你想用Writer 对象或者OutputStream 对象来操作,那么你可以使用XMLWriter 类。

import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Foo {

public void write(Document document) throws IOException {

// 写入文件
XMLWriter writer = new XMLWriter(
new FileWriter( "output.xml" )
);
writer.write( document );
writer.close();


// 以一种优雅的格式写入System.out对象
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter( System.out, format );
writer.write( document );

// 以一种紧凑的格式写入System.out对象
format = OutputFormat.createCompactFormat();
writer = new XMLWriter( System.out, format );
writer.write( document );
}
}

转化为字符串,或者从字符串转化

如果你有一个文档(Document)对象或者任何一个节点(Node)对象的引用(reference),象属性(Attribute)或者元素(Element),你可以通过asXML()方法把它转化为一个默认的XML字符串:

Document document = ...;
String text = document.asXML();

如果你有一些XML内容的字符串表示,你可以通过DocumentHelper.parseText()方法将它重新转化为文档(Document)对象:

String text = "James";
Document document = DocumentHelper.parseText(text);

通过XSLT样式化文档(Document)


使用Sun公司提供的JAXP API将XSLT 应用到文档(Document)上是很简单的。它允许你使用任何的XSLT引擎(例如:Xalan或SAXON等)来开发。下面是一个使用JAXP创建一个转化器(transformer),然后将它应用到文档(Document)上的例子:

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;

public class Foo {

public Document styleDocument(
Document document,
String stylesheet
) throws Exception {

// 使用 JAXP 加载转化器
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(
new StreamSource( stylesheet )
);

// 现在来样式化一个文档(Document)
DocumentSource source = new DocumentSource( document );
DocumentResult result = new DocumentResult();
transformer.transform( source, result );

// 返回经过样式化的文档(Document)
Document transformedDoc = result.getDocument();
return transformedDoc;
}
}

原文地址
dom4j下载地址

posted @ 2006-12-09 22:41 Vista 阅读(396) | 评论 (0)编辑 收藏

     摘要: 主  题:   OR...  阅读全文
posted @ 2006-12-06 19:10 Vista 阅读(410) | 评论 (0)编辑 收藏

 
Huihoo - Enterprise Open Source

 Last Modified: 2006.02.23

JBoss 4.0.2集群指南


(来源:http://www.javaresearch.org )


bromon原创 请尊重版权

    本文主要讲解JBoss cluster的基本知识以及简单的配置方法,其间涉及了一些jboss的补充知识。

一、材料准备:

1、    JBoss 4.0.2    

JBoss各个版本之间差异比较大,即使同为jboss 4.x的版本,内部组件的版本也不一致,所以请尽量使用同一版本的server。目前已经证明可以配置cluster的版本多为jboss 3.2.6和jboss 4.0.2。

2、    Apache 2.0.54

3、    Apache mod_jk-1-2-13-apache-2-0-54

二、安装:

1、    jboss4.0.2与apache 2.0.54的安装请自行搞定。假设jboss的安装目录为%jboss%,apache安装目录为%apache%。

2、    mod_jk的安装。

从apache.org获得文件mod_jk-1-2-13-apache-2-0-54.so,将该文件拷贝到%apache%\ modules。

三、jboss cluster入门

    Jboss 支持如下类型的cluster:EJB、web、JNDI、JMS,我们主要了解web cluster。
Web cluster实际上可以划分为两个话题:负载均衡 (load balance) 和状态同步。它们是互相独立的,单独配置。

负载均衡的概念比较简单,重要的是负载均衡的粒度。可以选择针对每个request的均衡,或者是针对每个用户的均衡。选择不同的粒度,需要不同的状态同步方式。

1、基于request的负载均衡

    该种方式下,负载均衡器 (load balancer)会根据各个node的状况,把每个http request进行分发。使用这样的均衡策略,就必须在多个node之间复制用户的session,实时保持整个cluster的用户状态同步,这种操作被称为session复制(session replication)。Jboss的实现原理是使用拦截器(interceptor),根据用户的同步策略拦截request,做同步处理后再交给server产生响应。

    该方法的优点是客户不会被绑定都具体的node,只要还有一个node存活,用户状态都不会丢失,cluster都能够继续工作。缺点是node之间通信频繁,响应速度有影响,多并发、高频操作的情况下性能下降比较厉害。

2、    基于用户的负载均衡

该种方式下,当用户发出第一个request后,负载均衡器动态的把该用户分配到某个节点,并记录该节点的jvm路由,以后该用户的所有request都会被绑定这个jvm路由,用户只会与该server发生交互,这种策略被称为粘性session(session sticky)。

该方法的优点是响应速度快,多个节点之间无须通信。缺点也很明显,某个node死掉以后,它负责的所有用户都会丢失session。

四、实战

1、负载均衡

    Jboss的负载均衡目前有两种方案,一是使用apache的mod_jk,二是使用jboss自带的负载均衡模块。下面分别讲解这两种配置。

mod_jk的配置

1、    请确认%apache%\modules下已经有mod_jk-1-2-13-apache-2-0-54.so文件。
2、    修改%apache%\conf\httpd.conf    在文件末尾添加:    Include conf/mod_jk2.conf
3、    在%apache%\conf下新建文件    mod_jk2.conf        文件内容如下:

# Load mod_jk module. Specify the filename
# of the mod_jk lib you’ve downloaded and
# installed in the previous section
LoadModule jk_module modules/mod_jk-1-2-13-apache-2-0-54.so
# Where to find workers.properties
JkWorkersFile conf/workers2.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
JkMount /* loadbalancer

其中JkMount /* loadbalancer的意思是,把所有的请求都发给loadbalancer处理。可以通过修改url来控制发送某些request。
4、在%apache%\conf下新建文件    workers2.properties        其内容为:

worker.list=loadbalancer,server1,server2

# Define the first node...
worker.server1.port=8009
worker.server1.host=172.16.0.116
worker.server1.type=ajp13
worker.server1.lbfactor=1
worker.server1.local_worker=1
worker.server1.cachesize=10

# Define the first node...
worker.server2.port=8009
worker.server2.host=172.16.32.88
worker.server2.type=ajp13
worker.server2.lbfactor=1
worker.server2.local_worker=1
worker.server2.cachesize=10

# Now we define the load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=server1,server2
worker.loadbalancer.sticky_session=1

其中对于node的命名规则是worker.节点名.xxxx。所以上述文件定义了两个节点:server1和server2。8009端口是jboss默认的ajp端口,另外需要注意的是worker.server2.lbfactor参数,它是节点的负载加权,它的值越大,获得负载的机会就越大。可以根据node的硬件性能进行调整。worker.loadbalancer.sticky_session参数是指定是否使用粘性session。

所有需要负载均衡的节点,都必须在worker.loadbalancer.balanced_workers参数中列举出来。

请记住所有node的名称和它对应着哪台机器,后面的配置中会使用。

尝试启动apache:%apache\bin\apache.exe,正常情况下没有任何提示。如果你使用的jk是2.0的,那么配置文件的写法完全不同,由于mod_jk2已经停止开发,所以apache并没有提供任何讲解,对于配置文件的编写也没有任何指导。

Jboss自带均衡器的配置

    将文件夹%jboss%\docs\examples\varia\loadbalancer\loadbalancer.sar拷贝到%jboss%\server\all\deploy下,并且修改loadbalancer.sar\loadbalancer.sar\META-INF\jboss-service.xml,在<host>标签中类出所有节点,在<sticky-session>标签中指定是否使用粘性session。配置完成。

    该均衡器的缺点是负载能力相对不高,配置参数太少,比如无法指定不同节点的负载加权,所以后面都以mod_jk为例,不再讲解jboss自带的负载均衡器的内容。
 

    负载均衡的配置基本完成,启动jboss,其中过程中会列出DefaultPatition中所有的节点:
run.bat -c all

 

任何节点的关闭与启动都会在cluster中广播,比如加如一个新节点后,其他节点会得到以下提示:
 


2、session sticky配置

    apache应该会以粘性session的方式分发请求。部署一个应用测试一下,你会发现粘性session没有起作用。因为我们还没有给jboss配置jvm路由( jvmRoute),apache就无法知道究竟哪些session是属于哪个节点的。我们继续往下:

    修改server1机器上的jboss的配置文件:%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ META-INF\ jboss-service.xml

    在110行有:<attribute name="UseJK">false</attribute>,将它改为true。值得注意的是在这行标签上面有一段注释,要求你在server.xml中必须有:
Engine name="jboss.web" jmvRoute="Node1" defaultHost="localhost"

    请注意这里有一个气死人不偿命的小bug,jboss的官方文档把 jvmRoute写成了jmvRoute,就是v和m两个字母的颠倒让我郁闷了三天,翻遍了jboss.com和theserverside.com。都是直接拷贝的错,吐血吐到脱水啊。

    下面需要修改server1上的%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ server.xml,在32行左右有:

<Engine name="jboss.web" defaultHost="localhost">

给它增加一个jvmRoute属性:

<Engine jvmRoute="server1" name="jboss.web" defaultHost="localhost">

请注意,jvmRoute的值必须和mod_jk中的节点名字正确对应,否则无法正确路由。Cluster中的所有节点都应该做相应的配置。

Jboss的配置完成了,下面需要在你的web应用中修改配置文件,让它支持集群。

在WEB-INF\web.xml中加入属性:    <distributable/>

Ok,基于用户的cluster完成了,每个用户会绑定都某个节点上进行交互。这种绑定是如何完成的呢?原来apache把客户分发到节点后,该节点会在用户的session id后面加上此节点的路由名称,变成这个样子:

Efdfxxd98daja87daj76da2dka**,server1

    有了这个标志,就能分辨该session属于哪个节点。

3、session replication配置

    下面要做的是基于request的cluster,也就让各个节点之间互相复制session状态。有两种复制模式,同步与异步。使用同步的方式,jboss会把session复制的操作和对request的响应放到一个应用事务(application transaction),session复制完成后才去处理request。异步复制则发送session复制的消息后马上处理request,session复制则会稍有延迟。但是在多框架的web页面中,这样的集群方式会有问题。由于frame在同一时间发出多个request,会造成一些混乱,这也是采用基于用户的集群方式的原因之一。

    JBoss 4.0.2中采用了Jboss cache来实现session复制,实际上就是一个分布式缓存,由于session id中包含了jvm route,所以能够分辨session属于哪个节点。Session的更新类似于hibernate中的乐观锁,有了更新之后就让session的版本号增加,其他节点通过对比版本号来决定是否同步session状态。

    配置session replication首先需要编辑
%jboss% server\all\deploy\jbossweb-tomcat55.sar\META-INF\ jboss-service.xml,88行左右有:
<attribute name="SnapshotMode">instant</attribute>
这就是刚才提到的复制模式,instant为立即复制,如果设为interval 那么系统会在延迟一段时间再进行复制,时间长度在<attribute name="SnapshotInterval">2000</attribute>中指定,单位是毫秒。

单独配置这一个地方还不够,在%jboss% server\all\deploy\ tc5-cluster-service.xml中有:

<attribute name="CacheMode">REPL_ASYNC</attribute>

这里才真正决定复制是同步的还是异步的,可以指定为REPL_ASYNC(异步)或者REPL_SYNC(同步)。

在这个文件下面一点,还有一个config标签,里面指定了各个节点在进行session复制的时候如何通信,有udp和tcp两种可选,如果使用udp方式,那么应该将udp的lookback属性指定为true,因为windows上有一个叫做media sense的东西会影响udp multicast。注意如果你不了解multi address的ip规则,请不要随便修改mcast_addr的值。如果采用tcp方式的话,应该指定bind_addr的值为本机ip,并且在TCPPING标签的initial_hosts属性中列出所有节点,格式是”机器名[端口号]”,比如在我们的例子中,就应该这样配置tcp(以其中一个节点为例):

<config>
<TCP bind_addr="172.16.0.116" start_port="7810" loopback="true"/>
<TCPPING initial_hosts="172.16.0.116[7810],172.16.32.88[7810]" port_range="3" timeout="3500"
num_initial_members="3" up_thread="true" down_thread="true"/>
<MERGE2 min_interval="5000" max_interval="10000"/>
<FD shun="true" timeout="2500" max_tries="5" up_thread="true" down_thread="true" />
<VERIFY_SUSPECT timeout="1500" down_thread="false" up_thread="false" />
    <pbcast.NAKACK down_thread="true" up_thread="true" gc_lag="100"
         retransmit_timeout="3000"/>
    <pbcast.STABLE desired_avg_gossip="20000" down_thread="false" up_thread="false" />
    <pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="false"
print_local_addr="true" down_thread="true" up_thread="true"/>
<pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/>
</config>

    JBoss的clustering版主建议尽量使用udp。不过在Sobey内部,建议使用tcp方式,经测试可能有不明物体在影响udp通信,导致Timeout异常。

    在%jboss%\ server\all\deploy\ cluster-service.xml中也有关于udp和tcp的配置信息,在4.0以前版本的jboss中,会以这个文件为主配置,4.0以后都以tc5-cluster-service.xml为主配置。

    Jboss的配置完成了,最后需要在web应用中增加配置信息,控制session复制的粒度。在WEB-INF\    jboss-web.xml中增加以下内容:

<replication-config>
    <replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
    <replication-granularity>SESSION</replication-granularity>
  </replication-config>

其中replication-trigger是指定哪些操作引发session的版本更新,它的取值有:

SET_AND_GET        
SET_AND_NON_PRIMITIVE_GET
SET

replication-granularity是复制粒度,可以取session或attribute。如果取为attribute有可能导致复制失败,这是目前版本的jboss cache的一个bug,等待修正。

部署项目,测试,如果配置没有问题,可以在%jboss%\0server\all\log\server.log中发现类似于这样的信息:

DEBUG [org.jboss.web.tomcat.tc5.session.JBossCacheManager] check to see if needs to store and replicate session with id Im9-qpuaXppMS+xXwE3M+Q**.server1 

DEBUG [org.jboss.web.tomcat.tc5.session.ClusteredSession] processSessionRepl(): session is dirty. Will increment version from: 20 and replicate.

    Session replication配置的成功率比较低,情况也很复杂,请仔细操作。

五、分布式热部署(distributable hot deploy)

    在一个节点很多的cluster中,如果部署应用的时候必须把程序文件拷贝到每个机器上的话,那实在太愚蠢了,幸好通过all启动的jboss自动支持分布式热部署。把支持cluster的应用(通常需要打包成war文件),放到%jboss%\server\all\farm下,那么处于同一cluster中的其他节点会自动下载并且部署,jboss把这个称为Farm deploy。如下图:



End 2005-7-11 Released by bromon

© 2006 Huihoo
posted @ 2006-12-05 09:30 Vista 阅读(1026) | 评论 (0)编辑 收藏

     摘要: JS正则表达式详解[收藏] ...  阅读全文
posted @ 2006-11-10 09:58 Vista 阅读(240) | 评论 (0)编辑 收藏

这个知识点不多,但属于java的高级技术,相信熟悉SPRING的朋友对它一定不会陌生,今天花了点时间对java的动态代理进行了学习,感觉还可以,因为是结合spring来看的,所以练习的是面向接口的代理模式,但应该也是最常用的动态代理..,废话不多说,看例子:
package org.diego;

public interface Ip {
    
public void say();
}


实现类:
package org.diego;

public class P implements Ip{
    
public void say(){
        System.out.println(
"hello");
    }

}


代理类:

package org.diego;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

class TraceHandler implements InvocationHandler {
    
private Object target;

    
public TraceHandler(Object t) {
        target 
= t;
    }


    
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        
// TODO Auto-generated method stub
        if (method.getName().startsWith("say")) {
            System.out.println(
"hello,before method");
            Object result 
= method.invoke(target, args);
            System.out.println(
"World,after method");
            
return result;
        }

        
return null;
        
    }

}


测试类:
/*
 * @author diego.liu
 * @contact vista.lbw@gmail.com
 * @date 2006-11-7
 
*/

package org.diego;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class ProxyTest {

    
public static void main(String[] args) {
        P test 
= new P();
        InvocationHandler handler 
= new TraceHandler(test);
        Ip proxy 
= (Ip) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(),
                handler);
        proxy.say();
    }


}


已经测试可以运行,欢迎拍砖。。。
posted @ 2006-11-07 18:14 Vista 阅读(1652) | 评论 (0)编辑 收藏