﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-闵毓</title><link>http://www.blogjava.net/shmily432685/</link><description>http://www.eshoo.com.cn &lt;a title="欢迎来到异客中国" href="http://www.eshoo.com.cn"&gt;欢迎来到异客中国&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 08 Oct 2008 00:32:51 GMT</lastBuildDate><pubDate>Wed, 08 Oct 2008 00:32:51 GMT</pubDate><ttl>60</ttl><item><title>转载：Java远程通讯可选技术及原理 </title><link>http://www.blogjava.net/shmily432685/archive/2008/03/06/184249.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Thu, 06 Mar 2008 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2008/03/06/184249.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/184249.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2008/03/06/184249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/184249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/184249.html</trackback:ping><description><![CDATA[<div class="postText">在分布式服务框架中，一个最基础的问题就是远程服务是怎么通讯的，在Java领域中有很多可实现远程通讯的技术，例如：RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等，这些名词之间到底是些什么关系呢，它们背后到底是基于什么原理实现的呢，了解这些是实现分布式服务框架的基础知识，而如果在性能上有高的要求的话，那深入了解这些技术背后的机制就是必须的了，在这篇blog中我们将来一探究竟，抛砖引玉，欢迎大家提供更多的实现远程通讯的技术和原理的介绍。<br />
<strong style="font-size: 14pt; color: #ff6600"><br />
<span style="font-size: 18pt; color: #008000">基本原理</span></strong><br />
要实现网络机器间的通讯，首先得来看看计算机系统网络通信的基本原理，在底层层面去看，网络通信需要做的就是将流从一台计算机传输到另外一台计算机，基于传输协议和网络IO来实现，其中传输协议比较出名的有http、tcp、udp等等，http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议，网络IO，主要有bio、nio、aio三种方式，所有的分布式应用通讯都基于这个原理而实现，只是为了应用的易用，各种语言通常都会提供一些更为贴近应用易用的应用层协议。<br />
<span style="font-size: 18pt; color: #008000"><strong><br />
应用级协议</strong></span><br />
远程服务通讯，需要达到的目标是在一台计算机发起请求，另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端，这其中又会有诸如one way request、同步请求、异步请求等等请求方式，按照网络通信原理，需要实现这个需要做的就是将请求转换成流，通过传输协议传输至远端，远端计算机在接收到请求的流后进行处理，处理完毕后将结果转化为流，并通过传输协议返回给调用端。<br />
原理是这样的，但为了应用的方便，业界推出了很多基于此原理之上的应用级的协议，使得大家可以不用去直接操作这么底层的东西，通常应用级的远程通信协议会提供：<br />
1、为了避免直接做流操作这么麻烦，提供一种更加易用或贴合语言的标准传输格式；<br />
2、网络通信机制的实现，就是替你完成了将传输格式转化为流，通过某种传输协议传输至远端计算机，远端计算机在接收到流后转化为传输格式，并进行存储或以某种方式通知远端计算机。<br />
所以在学习应用级的远程通信协议时，我们可以带着这几个问题进行学习：<br />
1、传输的标准格式是什么？<br />
2、怎么样将请求转化为传输的流？<br />
3、怎么接收和处理流？<br />
4、传输协议是？<br />
不过应用级的远程通信协议并不会在传输协议上做什么多大的改进，主要是在流操作方面，让应用层生成流和处理流的这个过程更加的贴合所使用的语言或标准，至于传输协议则通常都是可选的，在java领域中知名的有：RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS，来具体的看看这些远程通信的应用级协议：<br />
<strong><strong>--------------------------------------------------------------------------------------------------------------------------------------------------</strong><br />
RMI</strong><br />
RMI是个典型的为java定制的远程通信协议，我们都知道，在single vm中，我们可以通过直接调用java object instance来实现通信，那么在远程通信时，如果也能按照这种方式当然是最好了，这种远程通信的机制成为RPC（Remote Procedure Call），RMI正是朝着这个目标而诞生的。<br />
来看下基于RMI的一次完整的远程通信过程的原理：<br />
1、客户端发起请求，请求转交至RMI客户端的stub类；<br />
2、stub类将请求的接口、方法、参数等信息进行序列化；<br />
3、基于socket将序列化后的流传输至服务器端；<br />
4、服务器端接收到流后转发至相应的skelton类；<br />
5、skelton类将请求的信息反序列化后调用实际的处理类；<br />
6、处理类处理完毕后将结果返回给skelton类；<br />
7、Skelton类将结果序列化，通过socket将流传送给客户端的stub；<br />
8、stub在接收到流后反序列化，将反序列化后的Java Object返回给调用者。<br />
来看jboss-remoting对于此过程的一个更好的图示：<br />
<img height="225" alt="" src="http://www.blogjava.net/images/blogjava_net/bluedavy/jboss-remoting-arch.jpg" width="710" border="0" /><br />
根据原理来回答下之前学习应用级协议带着的几个问题：<br />
1、传输的标准格式是什么？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是Java ObjectStream。<br />
2、怎么样将请求转化为传输的流？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基于Java串行化机制将请求的java object信息转化为流。<br />
3、怎么接收和处理流？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据采用的协议启动相应的监听端口，当有流进入后基于Java串行化机制将流进行反序列化，并根据RMI协议获取到相应的处理对象信息，进行调用并处理，处理完毕后的结果同样基于java串行化机制进行返回。<br />
4、传输协议是？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Socket。<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
XML-RPC<br />
</strong>XML-RPC也是一种和RMI类似的远程调用的协议，它和RMI的不同之处在于它以标准的xml格式来定义请求的信息(请求的对象、方法、参数等)，这样的好处是什么呢，就是在跨语言通讯的时候也可以使用。<br />
来看下XML-RPC协议的一次远程通信过程：<br />
1、客户端发起请求，按照XML-RPC协议将请求信息进行填充；<br />
2、填充完毕后将xml转化为流，通过传输协议进行传输；<br />
3、接收到在接收到流后转换为xml，按照XML-RPC协议获取请求的信息并进行处理；<br />
4、处理完毕后将结果按照XML-RPC协议写入xml中并返回。<br />
图示以上过程：<br />
<img height="270" alt="" src="http://www.blogjava.net/images/blogjava_net/bluedavy/xmlrpc.jpg" width="527" border="0" /><br />
同样来回答问题：<br />
1、传输的标准格式是？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标准格式的XML。<br />
2、怎么样将请求转化为传输的流？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将XML转化为流。<br />
3、怎么接收和处理流？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过监听的端口获取到请求的流，转化为XML，并根据协议获取请求的信息，进行处理并将结果写入XML中返回。<br />
4、传输协议是？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Http。<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
Binary-RPC<br />
</strong>Binary-RPC看名字就知道和XML-RPC是差不多的了，不同之处仅在于传输的标准格式由XML转为了二进制的格式。<br />
同样来回答问题：<br />
1、传输的标准格式是？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标准格式的二进制文件。<br />
2、怎么样将请求转化为传输的流？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将二进制格式文件转化为流。<br />
3、怎么接收和处理流？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过监听的端口获取到请求的流，转化为二进制文件，根据协议获取请求的信息，进行处理并将结果写入XML中返回。<br />
4、传输协议是？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Http。<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
SOAP<br />
</strong>SOAP原意为Simple Object Access Protocol，是一个用于分布式环境的、轻量级的、基于XML进行信息交换的通信协议，可以认为SOAP是XML RPC的高级版，两者的原理完全相同，都是http+XML，不同的仅在于两者定义的XML规范不同，SOAP也是Webservice采用的服务调用协议标准，因此在此就不多加阐述了。<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
CORBA<br />
</strong><font face="arial,sans-serif" color="#000000">Common&nbsp;Object&nbsp;Request&nbsp;Broker&nbsp;Architecture（公用对象请求代理[调度]程序体系结构），是一组用来定义&#8220;分布式对象系统&#8221;的标准，由OMG(Object&nbsp;Menagement&nbsp;Group)作为发起和标准制定单位。CORBA的目的是定义一套协议，符合这个协议的对象可以互相交互，不论它们是用什么样的语言写的，不论它们运行于什么样的机器和操作系统。<br />
</font>CORBA在我看来是个类似于SOA的体系架构，涵盖可选的远程通信协议，但其本身不能列入通信协议这里来讲，而且CORBA基本淘汰，再加上对CORBA也不怎么懂，在此就不进行阐述了。<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
JMS<br />
</strong>JMS呢，是实现java领域远程通信的一种手段和方法，基于JMS实现远程通信时和RPC是不同的，虽然可以做到RPC的效果，但因为不是从协议级别定义的，因此我们不认为JMS是个RPC协议，但它确实是个远程通信协议，在其他的语言体系中也存在着类似JMS的东西，可以统一的将这类机制称为消息机制，而消息机制呢，通常是高并发、分布式领域推荐的一种通信机制，这里的主要一个问题是容错（详细见ErLang论文）。<br />
来看JMS中的一次远程通信的过程：<br />
1、客户端将请求转化为符合JMS规定的Message；<br />
2、通过JMS API将Message放入JMS Queue或Topic中；<br />
3、如为JMS Queue，则发送中相应的目标Queue中，如为Topic，则发送给订阅了此Topic的JMS Queue。<br />
4、处理端则通过轮训JMS Queue，来获取消息，接收到消息后根据JMS协议来解析Message并处理。<br />
回答问题：<br />
1、传输的标准格式是？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JMS规定的Message。<br />
2、怎么样将请求转化为传输的流？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将参数信息放入Message中即可。<br />
3、怎么接收和处理流？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;轮训JMS Queue来接收Message，接收到后进行处理，处理完毕后仍然是以Message的方式放入Queue中发送或Multicast。<br />
4、传输协议是？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不限。<br />
基于JMS也是常用的实现远程异步调用的方法之一。<br />
<br />
<span style="font-size: 18pt; color: #008000"><strong>可选实现技术</strong></span><br />
当然，在上面的原理中并没有介绍到所有的java领域可选的远程通信协议了，例如还有EJB采用的ORMI、Spring自己定义的一个简单的Http Invoker等等。<br />
看完原理后我们再来看看目前java领域可用于实现远程通讯的框架或library，知名的有：JBoss-Remoting、Spring-Remoting、Hessian、Burlap、XFire(Axis)、ActiveMQ、Mina、Mule、EJB3等等，来对每种做个简单的介绍和评价，其实呢，要做分布式服务框架，这些东西都是要有非常深刻的了解的，因为分布式服务框架其实是包含了解决分布式领域以及应用层面领域两方面问题的。<br />
当然，你也可以自己根据远程网络通信原理(transport protocol+Net IO)去实现自己的通讯框架或library。<br />
那么在了解这些远程通讯的框架或library时，会带着什么问题去学习呢？<br />
1、是基于什么协议实现的？<br />
2、怎么发起请求？<br />
3、怎么将请求转化为符合协议的格式的？<br />
4、使用什么传输协议传输？<br />
5、响应端基于什么机制来接收请求？<br />
6、怎么将流还原为传输格式的？<br />
7、处理完毕后怎么回应？<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
JBoss-Remoting<br />
</strong>Jboss-remoting是由jboss编写的一个java领域的远程通讯框架，基于此框架，可以很简单的实现基于多种传输协议的java对象的RPC。<br />
直接来回答问题：<br />
1、是基于什么协议实现的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JBoss-Remoting是个通讯框架，因此它支持多种协议方式的通信，例如纯粹的socket+io方式、rmi方式、http+io方式等。<br />
2、怎么发起请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在JBoss-Remoting中，只需将需要发起的请求参数对象传入jboss-remoting的InvocationRequest对象即可，也可根据协议基于InvocationRequest封装符合需求的InvocationRequest对象。<br />
3、怎么将请求转化为符合协议的格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JBoss-Remoting基于Java串行化机制或JBoss自己的串行化实现来将请求转化为对象字节流。<br />
4、使用什么传输协议传输？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持多种传输协议，例如socket、http等。<br />
5、响应端基于什么机制来接收请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 响应端只需将自己的处理对象注册到JBoss-Remoting提供的server端的Connector对象中即可。<br />
6、怎么将流还原为传输格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JBoss-Remoting基于java串行化机制或jboss自己的串行化实现来将请求信息还原为java对象。<br />
7、处理完毕后怎么回应？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处理完毕后将结果对象直接返回即可，jboss-remoting会将此对象按照协议进行序列化，返回至调用端。<br />
另外，jboss-remoting支持多种通信方式，例如同步/异步/单向通信等。<br />
<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
<a title="心得与体会" href="http://www.blogjava.net/shmily432685/admin/EditPosts.aspx?catid=4001" >spring in action</a>-Remoting<br />
</strong><a title="心得与体会" href="http://www.blogjava.net/shmily432685/admin/EditPosts.aspx?catid=4001" >spring in action</a>-remoting是Spring提供java领域的远程通讯框架，基于此框架，同样也可以很简单的将普通的spring bean以某种远程协议的方式来发布，同样也可以配置spring bean为远程调用的bean。<br />
1、是基于什么协议实现的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和JBoss-Remoting一样，作为一个远程通讯的框架，Spring通过集成多种远程通讯的library，从而实现了对多种协议的支持，例如rmi、http+io、xml-rpc、binary-rpc等。<br />
2、怎么发起请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Spring中，由于其对于远程调用的bean采用的是proxy实现，发起请求完全是通过服务接口调用的方式。<br />
3、怎么将请求转化为符合协议的格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring按照协议方式将请求的对象信息转化为流，例如Spring Http Invoker是基于Spring自己定义的一个协议来实现的，传输协议上采用的为http，请求信息是基于java串行化机制转化为流进行传输。<br />
4、使用什么传输协议传输？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持多种传输协议，例如rmi、http等等。<br />
5、响应端基于什么机制来接收请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 响应端遵循协议方式来接收请求，对于使用者而言，则只需通过spring的配置方式将普通的spring bean配置为响应端或者说提供服务端。<br />
6、怎么将流还原为传输格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;按照协议方式来进行还原。<br />
7、处理完毕后怎么回应？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处理完毕后直接返回即可，spring-remoting将根据协议方式来做相应的序列化。<br />
<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
Hessian<br />
</strong>Hessian是由caucho提供的一个基于binary-RPC实现的远程通讯library。<br />
1、是基于什么协议实现的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于Binary-RPC协议实现。<br />
2、怎么发起请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需通过Hessian本身提供的API来发起请求。<br />
3、怎么将请求转化为符合协议的格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hessian通过其自定义的串行化机制将请求信息进行序列化，产生二进制流。<br />
4、使用什么传输协议传输？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hessian基于Http协议进行传输。<br />
5、响应端基于什么机制来接收请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 响应端根据Hessian提供的API来接收请求。<br />
6、怎么将流还原为传输格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hessian根据其私有的串行化机制来将请求信息进行反序列化，传递给使用者时已是相应的请求信息对象了。<br />
7、处理完毕后怎么回应？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处理完毕后直接返回，hessian将结果对象进行序列化，传输至调用端。<br />
<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
Burlap<br />
</strong>Burlap也是有caucho提供，它和hessian的不同在于，它是基于XML-RPC协议的。<br />
1、是基于什么协议实现的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于XML-RPC协议实现。<br />
2、怎么发起请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据Burlap提供的API。<br />
3、怎么将请求转化为符合协议的格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将请求信息转化为符合协议的XML格式，转化为流进行传输。<br />
4、使用什么传输协议传输？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Http协议。<br />
5、响应端基于什么机制来接收请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 监听Http请求。<br />
6、怎么将流还原为传输格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据XML-RPC协议进行还原。<br />
7、处理完毕后怎么回应？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回结果写入XML中，由Burlap返回至调用端。<br />
<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
XFire、Axis<br />
</strong>XFire、Axis是Webservice的实现框架，WebService可算是一个完整的SOA架构实现标准了，因此采用XFire、Axis这些也就意味着是采用webservice方式了。<br />
1、是基于什么协议实现的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于SOAP协议。<br />
2、怎么发起请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;获取到远端service的proxy后直接调用。<br />
3、怎么将请求转化为符合协议的格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将请求信息转化为遵循SOAP协议的XML格式，由框架转化为流进行传输。<br />
4、使用什么传输协议传输？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Http协议。<br />
5、响应端基于什么机制来接收请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 监听Http请求。<br />
6、怎么将流还原为传输格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据SOAP协议进行还原。<br />
7、处理完毕后怎么回应？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回结果写入XML中，由框架返回至调用端。<br />
<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
ActiveMQ<br />
</strong>ActiveMQ是JMS的实现，基于JMS这类消息机制实现远程通讯是一种不错的选择，毕竟消息机制本身的功能使得基于它可以很容易的去实现同步/异步/单向调用等，而且消息机制从容错角度上来说也是个不错的选择，这是Erlang能够做到容错的重要基础。<br />
1、是基于什么协议实现的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于JMS协议。<br />
2、怎么发起请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;遵循JMS API发起请求。<br />
3、怎么将请求转化为符合协议的格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不太清楚，猜想应该是二进制流。<br />
4、使用什么传输协议传输？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持多种传输协议，例如socket、http等等。<br />
5、响应端基于什么机制来接收请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 监听符合协议的端口。<br />
6、怎么将流还原为传输格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同问题3。<br />
7、处理完毕后怎么回应？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遵循JMS API生成消息，并写入JMS Queue中。<br />
基于JMS此类机制实现远程通讯的例子有Spring-Intergration、Mule、Lingo等等。<br />
<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
Mina<br />
</strong>Mina是Apache提供的通讯框架，在之前一直没有提到网络IO这块，之前提及的框架或library基本都是基于BIO的，而Mina是采用NIO的，NIO在并发量增长时对比BIO而言会有明显的性能提升，而java性能的提升，与其NIO这块与OS的紧密结合是有不小的关系的。<br />
1、是基于什么协议实现的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于纯粹的Socket+NIO。<br />
2、怎么发起请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过Mina提供的Client API。<br />
3、怎么将请求转化为符合协议的格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mina遵循java串行化机制对请求对象进行序列化。<br />
4、使用什么传输协议传输？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持多种传输协议，例如socket、http等等。<br />
5、响应端基于什么机制来接收请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以NIO的方式监听协议端口。<br />
6、怎么将流还原为传输格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遵循java串行化机制对请求对象进行反序列化。<br />
7、处理完毕后怎么回应？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遵循Mina API进行返回。<br />
MINA是NIO方式的，因此支持异步调用是毫无悬念的。<br />
<br />
<strong>--------------------------------------------------------------------------------------------------------------------------------------------------<br />
EJB<br />
</strong>EJB最突出的在于其分布式，EJB采用的是ORMI协议，和RMI协议是差不多的，但EJB在分布式通讯的安全控制、transport pool、smart proxy等方面的突出使得其在分布式领域是不可忽视的力量。<br />
1、是基于什么协议实现的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于ORMI协议。<br />
2、怎么发起请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EJB调用。<br />
3、怎么将请求转化为符合协议的格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遵循java串行化机制对请求对象进行序列化。<br />
4、使用什么传输协议传输？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Socket。<br />
5、响应端基于什么机制来接收请求？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 监听协议端口。<br />
6、怎么将流还原为传输格式的？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遵循java串行化机制对请求对象进行反序列化。<br />
7、处理完毕后怎么回应？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 直接返回处理对象即可。<br />
<br />
在之前的分布式服务框架系列的文章中对于jndi有误导的嫌疑，在这篇blog中也顺带的提下jndi的机制，由于JNDI取决于具体的实现，在这里只能是讲解下jboss的jndi的实现了。<br />
在将对象实例绑定到jboss jnp server后，当远程端采用context.lookup()方式获取远程对象实例并开始调用时，jboss jndi的实现方法是从jnp server上获取对象实例，将其序列化回本地，然后在本地进行反序列化，之后在本地进行类调用。<br />
通过这个机制，就可以知道了，本地其实是必须有绑定到jboss上的对象实例的class的，否则反序列化的时候肯定就失败了，而远程通讯需要做到的是在远程执行某动作，并获取到相应的结果，可见纯粹基于JNDI是无法实现远程通讯的。<br />
但JNDI也是实现分布式服务框架一个很关键的技术点，因为可以通过它来实现透明化的远端和本地调用，就像ejb，另外它也是个很好的隐藏实际部署机制(就像datasource)等的方案。<br />
<br />
<span style="font-size: 18pt; color: #008000"><strong>总结</strong></span><br />
由上一系列的分析可知，在远程通讯领域中，涉及的知识点还是相当的多的，例如有：通信协议(Socket/tcp/http/udp/rmi/xml-rpc etc.)、消息机制、网络IO（BIO/NIO/AIO）、MultiThread、本地调用与远程调用的透明化方案（涉及java classloader、Dynamic Proxy、Unit Test etc.）、异步与同步调用、网络通信处理机制（自动重连、广播、异常、池处理等等）、Java Serialization (各种协议的私有序列化机制等)、各种框架的实现原理（传输格式、如何将传输格式转化为流的、如何将请求信息转化为传输格式的、如何接收流的、如何将流还原为传输格式的等等），要精通其中的哪些东西，得根据实际需求来决定了，只有在了解了原理的情况下才能很容易的做出选择，甚至可以根据需求做私有的远程通讯协议，对于从事分布式服务平台或开发较大型的分布式应用的人而言，我觉得至少上面提及的知识点是需要比较了解的。<br />
<br />
<strong style="font-size: 18pt; color: #008000">参考文档（感谢这些文章）</strong><br />
RMI原理及实现：<a href="http://www.yesky.com/274/1625274.shtml">http://www.yesky.com/274/1625274.shtml</a><br />
Java NIO原理和使用：<a href="http://www.jdon.com/concurrent/nio%D4%AD%C0%ED%D3%A6%D3%C3.htm">http://www.jdon.com/concurrent/nio%D4%AD%C0%ED%D3%A6%D3%C3.htm</a><br />
XML RPC协议：<a href="http://hedong.3322.org/archives/000470.html" target="_blank">http://hedong.3322.org/archives/000470.html</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.mengyan.org/blog/archives/2005/07/12/30.html">http://www.mengyan.org/blog/archives/2005/07/12/30.html</a><br />
Spring技术应用中的远程服务详解：<a href="http://www.builder.com.cn/2007/1027/583384.shtml">http://www.builder.com.cn/2007/1027/583384.shtml</a><br />
JAVA RPC通信<span style="color: #000000">机制之SOAP：</span><a href="http://www.java114.com/content16/content3826.html">http://www.java114.com/content16/content3826.html</a> <br />
Java Remoting：Protocol BenchMarks：<a href="http://q.sohu.com/forum/5/topic/1148909" target="_blank">http://q.sohu.com/forum/5/topic/1148909</a><br />
Evalution of RMI Alternative：<a href="https://www.jfire.org/modules/phpwiki/index.php/Evaluation%20of%20RMI%20Alternative" target="_blank">https://www.jfire.org/modules/phpwiki/index.php/Evaluation%20of%20RMI%20Alternative</a><br />
Metaprotocol Taxonomy：<a href="http://hessian.caucho.com/doc/metaprotocol-taxonomy.xtp" target="_blank">http://hessian.caucho.com/doc/metaprotocol-taxonomy.xtp</a> <br />
什么是Webservice：<a href="http://www.vchome.net/dotnet/webservice/webservice15.htm">http://www.vchome.net/dotnet/webservice/webservice15.htm</a> </div><img src ="http://www.blogjava.net/shmily432685/aggbug/184249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2008-03-06 13:55 <a href="http://www.blogjava.net/shmily432685/archive/2008/03/06/184249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql快速批量导入文本数据</title><link>http://www.blogjava.net/shmily432685/archive/2007/10/16/153329.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Tue, 16 Oct 2007 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2007/10/16/153329.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/153329.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2007/10/16/153329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/153329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/153329.html</trackback:ping><description><![CDATA[<p>近日有一文本文件，数据格式是以tab分割。数据量有数千万条数据，需要导入mysql数据库中，通过传统的方式进行拷贝到数据库中，需要花费很多天时间，中间也会出现很多错误，未必能导入成功。<br />
使用：load data local infile "本地路径" into table 表名命令方式进行导入，10w条数据也只需要花费几秒钟时间，可中文无法导入。<br />
仔细分析了一下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;建库时采用utf8编码，表也是utf8编码。对中文应该是支持的。排除数据库的问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;只能从要导入的文本文件考虑，将其编码用ultraEdit转换编码为utf8后，进行导入，成功导入。数据也没有出现错误。&nbsp;</p>
也可采用select * from&nbsp;表名 into outfile "c:\\文件路径";进行查询；进行导出表中的数据为文本文件格式。 <br />
也可以采用select * from&nbsp;表名 into outfile "c:\\stu_t.txt" lines terminated by '\r\n';进行查询，导出。<img src ="http://www.blogjava.net/shmily432685/aggbug/153329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2007-10-16 17:10 <a href="http://www.blogjava.net/shmily432685/archive/2007/10/16/153329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>经典网摘</title><link>http://www.blogjava.net/shmily432685/archive/2007/04/23/112931.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Mon, 23 Apr 2007 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2007/04/23/112931.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/112931.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2007/04/23/112931.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/112931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/112931.html</trackback:ping><description><![CDATA[<p>人=吃饭+睡觉+上班+玩,<br>猪=吃饭+ 睡觉,<br>代入:人=猪+上班+玩,<br>即:人-玩=猪+上班.<br>结论:不懂玩的人=会上班的猪&nbsp;&nbsp; </p>
<p>男人=吃饭+ 睡觉+挣钱<br>猪=吃饭+ 睡觉<br>男人=猪+挣钱<br>猪=男人-挣钱<br>所以男人不挣钱等于猪。</p>
<p>女人=吃饭+ 睡觉+花钱。<br>猪&nbsp; =吃饭+ 睡觉。代入上式得：<br>女人=猪+花钱。移项得：<br>女人-花钱=猪。<br>结论：女人不花钱的都是猪。</p>
<p>综上：<br>男人为了让女人不变成猪而挣钱！<br>女人为了让男人不变成猪而花钱 </p>
<p>&nbsp;</p>
<p>写字楼里写字间，写字间中程序员<br>程序人员写程序，又将程序换酒钱<br>酒醒只在屏前坐，酒醉还来屏下眠<br>酒醉酒醒日复日，屏前屏下年复年<br>但愿老死电脑间，不愿鞠躬老板前<br>奔驰宝马贵者趣，公交自行程序员<br>别人笑我太疯癫，我笑自己命太贱<br>但见满街漂亮妹，哪个归得程序员</p><img src ="http://www.blogjava.net/shmily432685/aggbug/112931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2007-04-23 13:29 <a href="http://www.blogjava.net/shmily432685/archive/2007/04/23/112931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat+mysql+jbpm配置工作流（1）</title><link>http://www.blogjava.net/shmily432685/archive/2007/03/30/107517.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Fri, 30 Mar 2007 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2007/03/30/107517.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/107517.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2007/03/30/107517.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/107517.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/107517.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 初次研究工作流Jbpm配置与开发：<br>JDK142<br>tomcat 5.0<br>mysql 5.0.16<br>apache-ant-1.6.5<br>jbpm-starters-kit-3.1.4<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/shmily432685/archive/2007/03/30/107517.html'>阅读全文</a><img src ="http://www.blogjava.net/shmily432685/aggbug/107517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2007-03-30 17:42 <a href="http://www.blogjava.net/shmily432685/archive/2007/03/30/107517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用js控制功能收集(待续)</title><link>http://www.blogjava.net/shmily432685/archive/2007/03/09/102760.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Fri, 09 Mar 2007 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2007/03/09/102760.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/102760.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2007/03/09/102760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/102760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/102760.html</trackback:ping><description><![CDATA[【弹出的窗口之定时关闭控制】     <br />  下面我们再对弹出窗口进行一些控制，效果就更好了。如果我们再将一小段代码加入弹出的页面（注意是加入到page.html的HTML中，可不是主页面中，否则…），让它在10秒钟后<b style="COLOR: black; BACKGROUND-COLOR: #ff66ff">自动关闭</b>是不是更酷了？     <br />  首先，将如下代码加入page.html文件的&lt;head&gt;区：     <br />  &lt;script   language="javascript"&gt;     <br />  function   closeit()   {     <br />  setTimeout("self.close()",10000)   //毫秒     <br />  }     <br />  &lt;/script&gt;     <br />  然后，再用&lt;body   onload="closeit()"&gt;这一句话代替page.html中原有的&lt;BODY&gt;这一句就可以了。（这一句话千万不要忘记写啊！这一句的作用是调用关闭窗口的代码，10秒钟后就自行关闭该窗口。）     <br /><img src ="http://www.blogjava.net/shmily432685/aggbug/102760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2007-03-09 10:55 <a href="http://www.blogjava.net/shmily432685/archive/2007/03/09/102760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Windows平台使用Apache2.2和Mongrel运行Ruby on Rails</title><link>http://www.blogjava.net/shmily432685/archive/2007/01/15/93939.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Mon, 15 Jan 2007 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2007/01/15/93939.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/93939.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2007/01/15/93939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/93939.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/93939.html</trackback:ping><description><![CDATA[<div>摘自:<a href="http://www.javaeye.com/topic/43290">http://www.javaeye.com/topic/43290</a><br />一、安装Ruby、rails、mongrel和Apache2.2</div>
		<div> </div>
		<div>从rubyforge网站下载One-Click Ruby Install，运行安装程序，就安装好了ruby和rubygems。</div>
		<div> </div>
		<div>运行命令：</div>
		<div>
				<font 230,="" 230);?="">gem install rails –y</font>
		</div>
		<div>
				<font 230,="" 230);?="">gem install mongrel –y</font>
		</div>
		<div>
				<font 230,="" 230);?="">gem install mongrel_service -y</font>
		</div>
		<div>安装好了rails和mongrel</div>
		<div> </div>
		<div>从Apache网站下载Windows版本的Apache2.2，运行安装程序，就安装好了Apache2.2。</div>
		<div> </div>
		<div>二、把Mongrel作为Services启动</div>
		<div> </div>
		<div>
				<font 230,="" 230);?="">mongrel_rails service::install -N depot -c d:\Rubyproject\depot -p 3000 –e production</font>
		</div>
		<div>-N指明服务名称，-d指明rails应用的目录，-p是mongrel监听的tcp端口，-e是启动模式为生产模式</div>
		<div> </div>
		<div>这样打开控制面版|管理工具|服务，就可以发现增加了一项名为“depot”的服务，就可以通过控制面版来管理服务了。如果需要命令行启动和关闭该服务，那么：</div>
		<div>
				<font 230,="" 230);?="">mongrel_rails service::start -N depot</font>
		</div>
		<div>
				<font 230,="" 230);?="">mongrel_rails service::stop -N depot</font>
		</div>
		<div> </div>
		<div>如果需要从服务中注销该项服务，那么：</div>
		<div>
				<font 230,="" 230);?="">mongrel_rails service::remove -N depot</font>
		</div>
		<div> </div>
		<div>如果需要安装多个mongrel实例，那么可以这样：</div>
		<div>
				<font 230,="" 230);?="">mongrel_rails service::install -N depot0 -c d:\Rubyproject\depot -p 3000 –e production</font>
		</div>
		<div>
				<font 230,="" 230);?="">mongrel_rails service::install -N depot1 -c d:\Rubyproject\depot -p 3001 –e production</font>
		</div>
		<div>诸如此类。</div>
		<div> </div>
		<div>三、配置Apache2.2</div>
		<div> </div>
		<div>用编辑工具打开Apache2.2目录下面的conf/httpd.conf，需要取消如下模块的注释：</div>
		<div>
				<font 230,="" 230);?="">LoadModule proxy_module modules/mod_proxy.so</font>
		</div>
		<div>
				<font 230,="" 230);?="">LoadModule proxy_balancer_module modules/mod_proxy_balancer.so</font>
		</div>
		<div>
				<font 230,="" 230);?="">LoadModule proxy_http_module modules/mod_proxy_http.so</font>
		</div>
		<div>如果你希望对页面输出使用压缩，也需要取消如下模块的注释：</div>
		<div>
				<font 230,="" 230);?="">LoadModule deflate_module modules/mod_deflate.so</font>
		</div>
		<div> </div>
		<div>然后按如下内容配置基于HTTP代理的负载均衡：</div>
		<div>
				<div>
						<font 230,="" 230);?="">
						</font>
				</div>
				<font 230,="" 230);?="">
						<div class="code_title">xml 代码</div>
						<div class="dp-highlighter">
								<div class="bar"> </div>
								<ol class="dp-xml">
										<li class="alt">
												<span>
														<span>ProxyRequests Off   </span>
												</span>
										</li>
										<li class="">
												<span>
												</span>
												<span class="tag">&lt;</span>
												<span class="tag-name">Proxy</span>
												<span> balancer://myCluster</span>
												<span class="tag">&gt;</span>
												<span>  </span>
										</li>
										<li class="alt">
												<span>  BalancerMember http://localhost:3000   </span>
										</li>
										<li class="">
												<span>  BalancerMember http://localhost:3001   </span>
										</li>
										<li class="alt">
												<span>
												</span>
												<span class="tag">
														<span class="tag-name">
														</span>
														<span class="tag">&gt;</span>
														<span>  </span>
												</span>
										</li>
										<li class="">
												<span>  </span>
										</li>
										<li class="alt">
												<span>
												</span>
												<span class="tag">&lt;</span>
												<span class="tag-name">VirtualHost</span>
												<span> *:80</span>
												<span class="tag">&gt;</span>
												<span>  </span>
										</li>
										<li class="">
												<span>  ServerName www.xxx.com   </span>
										</li>
										<li class="alt">
												<span>  DocumentRoot d:/rubyproject/depot/public   </span>
										</li>
										<li class="">
												<span>  ProxyPass /images !   </span>
										</li>
										<li class="alt">
												<span>  ProxyPass /stylesheets !   </span>
										</li>
										<li class="">
												<span>  ProxyPass /javascripts !   </span>
										</li>
										<li class="alt">
												<span>  ProxyPass / balancer://myCluster/   </span>
										</li>
										<li class="">
												<span>  ProxyPassReverse / balancer://myCluster/   </span>
										</li>
										<li class="alt">
												<span>  ProxyPreserveHost on   </span>
										</li>
										<li class="">
												<span>
												</span>
												<span class="tag">
														<span class="tag-name">
														</span>
														<span class="tag">&gt;</span>
														<span>  </span>
												</span>
										</li>
								</ol>
						</div>
				</font>
		</div>
		<div> </div>
		<div>myCluster定义了群集中的每个mongrel应用服务器节点。ProxyPass /images !指明该URL开始的请求不代理给Mongrel群集，而由Apache自己处理。重起Apache，然后打开浏览器访问<a href="http://www.xxx.com/">www.xxx.com</a>，检查配置是否正确。</div>
		<div> </div>
		<div>至此，在Windows Server上面一个具备良好稳定性和性能的Ruby on rails生产环境就搭建好了。</div>
		<div> </div>
		<div>对于页面输出，还可以使用mod_deflate进行输出内容压缩，以提高页面下载速度，这个就留给大家自己配置了。<br /><br /><br /><p>关闭标记被Rich Editor过滤掉了，重新用bbcode贴一下：</p><p></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-xml"><li class="alt"><span><span>ProxyRequests Off       </span></span></li><li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">Proxy</span><span> balancer://myCluster</span><span class="tag">&gt;</span><span>      </span></li><li class="alt"><span>  BalancerMember http://localhost:3000       </span></li><li class=""><span>  BalancerMember http://localhost:3001       </span></li><li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">Proxy</span><span class="tag">&gt;</span><span>      </span></li><li class=""><span>      </span></li><li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">VirtualHost</span><span> *:80</span><span class="tag">&gt;</span><span>      </span></li><li class=""><span>  ServerName www.xxx.com       </span></li><li class="alt"><span>  DocumentRoot d:/rubyproject/depot/public       </span></li><li class=""><span>  ProxyPass /images !       </span></li><li class="alt"><span>  ProxyPass /stylesheets !       </span></li><li class=""><span>  ProxyPass /javascripts !       </span></li><li class="alt"><span>  ProxyPass / balancer://myCluster/       </span></li><li class=""><span>  ProxyPassReverse / balancer://myCluster/       </span></li><li class="alt"><span>  ProxyPreserveHost on       </span></li><li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">VirtualHost</span><span class="tag">&gt;</span><span>    </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>cluster的作用不是加速单个请求的，是提高整体的负载能力的。</p></div><img src ="http://www.blogjava.net/shmily432685/aggbug/93939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2007-01-15 13:23 <a href="http://www.blogjava.net/shmily432685/archive/2007/01/15/93939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决java.lang.UnsupportedClassVersionError问题！！</title><link>http://www.blogjava.net/shmily432685/archive/2006/12/29/90651.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Fri, 29 Dec 2006 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2006/12/29/90651.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/90651.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2006/12/29/90651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/90651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/90651.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Eclipse解决java.lang.UnsupportedClassVersionError问题，只需要把项目用的JDK与你安装的JDK搞成版本一样就解决了．<br>步骤：右击你的项目－－＞属性－－＞Java Compiler，设置合适的版本！！&nbsp;&nbsp;<a href='http://www.blogjava.net/shmily432685/archive/2006/12/29/90651.html'>阅读全文</a><img src ="http://www.blogjava.net/shmily432685/aggbug/90651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2006-12-29 09:44 <a href="http://www.blogjava.net/shmily432685/archive/2006/12/29/90651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我个人认为做好Project Manager，需要具备的能力</title><link>http://www.blogjava.net/shmily432685/archive/2006/11/24/83327.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Fri, 24 Nov 2006 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2006/11/24/83327.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/83327.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2006/11/24/83327.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/83327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/83327.html</trackback:ping><description><![CDATA[<br />要有承担责任的勇气！任何事情，到你这一级为止。不要把责任推给这个推给那个，怨天尤人。 
<p>要有敢于拼命的勇气！不会的技术，难解的问题，都需要你用各种办法不择手段的去完成，去偷也好，去抢也好。要准备好若干天熬通宵。累掉十斤八斤是正常的。</p><p>要有灵活处理的能力！对手下要宽严结合，技术上严，生活上宽。对上要把任务量适当夸大，给自己留有余地；对客户要大事化小，小事化无，尽可能少接任务。<br /><br />要有统观全局的能力！掌握手下工作人员的各方面能力，根据项目开发紧张合理分配手下工作任务，确定充分的工作时间，严格检查工作完成情况。<br /><br />要有制定纪律的实力！没有规矩，不成方圆，根据项目开发组的实际情况，合理制定项目组的开发纪律，而不能盲目的根据想象，不结合实际制定不符合实际的纪律，反而会造成团队不合，以及难以实施的情况。</p><img src ="http://www.blogjava.net/shmily432685/aggbug/83327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2006-11-24 17:40 <a href="http://www.blogjava.net/shmily432685/archive/2006/11/24/83327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby on Rails 学习：解决中文乱码问题</title><link>http://www.blogjava.net/shmily432685/archive/2006/09/27/72261.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Wed, 27 Sep 2006 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2006/09/27/72261.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/72261.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2006/09/27/72261.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/72261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/72261.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Ruby on Rails 学习：解决中文乱码问题<br>       1、页面无法显示中文，产生中文乱码<br>       2、Mysql数据库采用utf8后，页面采用utf8，数据库保存是乱码，但页面显示正常。<br>       3、时间格式在页面上的中文显示产生乱码。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/shmily432685/archive/2006/09/27/72261.html'>阅读全文</a><img src ="http://www.blogjava.net/shmily432685/aggbug/72261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2006-09-27 11:55 <a href="http://www.blogjava.net/shmily432685/archive/2006/09/27/72261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 常用快捷键收集(中文)</title><link>http://www.blogjava.net/shmily432685/archive/2006/09/11/68981.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Mon, 11 Sep 2006 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2006/09/11/68981.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/68981.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2006/09/11/68981.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/68981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/68981.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/shmily432685/archive/2006/09/11/68981.html'>阅读全文</a><img src ="http://www.blogjava.net/shmily432685/aggbug/68981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2006-09-11 16:20 <a href="http://www.blogjava.net/shmily432685/archive/2006/09/11/68981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>