<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lizongbo at 618119.com &#187; Hessian</title>
	<atom:link href="http://618119.com/tag/hessian/feed" rel="self" type="application/rss+xml" />
	<link>http://618119.com</link>
	<description>工作,生活,Android,前端,Linode,Ubuntu,nginx,java,apache,tomcat,Resin,mina,Hessian,XMPP,RPC</description>
	<lastBuildDate>Tue, 31 Jan 2012 14:25:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(6.Client端的接口调用)</title>
		<link>http://618119.com/archives/2009/01/15/131.html</link>
		<comments>http://618119.com/archives/2009/01/15/131.html#comments</comments>
		<pubDate>Wed, 14 Jan 2009 17:03:07 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[RPC]]></category>
		<category><![CDATA[apache mina]]></category>
		<category><![CDATA[google protobuf]]></category>
		<category><![CDATA[Hessian]]></category>

		<guid isPermaLink="false">http://618119.com/?p=131</guid>
		<description><![CDATA[接上一篇：http://618119.com/archives/2009/01/15/130.html 1.ProtobufRpcChannel.java(相当于thrift的TBinaryProtocol). [code] package com.lizongbo.protobufrpc; import com.google.protobuf.RpcChannel; import java.net.URL; import com.google.protobuf.Descriptors.MethodDescriptor; import com.google.protobuf.RpcController; import com.google.protobuf.Message; import com.google.protobuf.RpcCallback; import java.net.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; public class ProtobufRpcChannel implements RpcChannel { private URL serviceUrl = null; public ProtobufRpcChannel(String url) { try { try { URL.setURLStreamHandlerFactory(new HessianURLStreamHandlerFactory()); } catch (Exception ex) { ex.printStackTrace(); } serviceUrl = [...]]]></description>
		<wfw:commentRss>http://618119.com/archives/2009/01/15/131.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(5.Server端的IoHandler)</title>
		<link>http://618119.com/archives/2009/01/15/130.html</link>
		<comments>http://618119.com/archives/2009/01/15/130.html#comments</comments>
		<pubDate>Wed, 14 Jan 2009 16:49:05 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[apache mina]]></category>
		<category><![CDATA[google protobuf]]></category>
		<category><![CDATA[Hessian]]></category>
		<category><![CDATA[RPC]]></category>

		<guid isPermaLink="false">http://618119.com/?p=130</guid>
		<description><![CDATA[接上一篇： http://618119.com/archives/2009/01/15/129.html ProtobufRPCServerSessionHandler.java [code] package com.lizongbo.protobufrpc; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import java.util.Map; import java.util.HashMap; import com.google.protobuf.Service; import com.lizongbo.mobileqq.UserInfoServiceImpl; import com.google.protobuf.Descriptors; import com.google.protobuf.Descriptors.MethodDescriptor; import com.google.protobuf.Message; import com.google.protobuf.RpcCallback; import com.lizongbo.mobileqq.UserInfoServiceRpcController; public class ProtobufRPCServerSessionHandler extends IoHandlerAdapter { /**存放service实例的map*/ private Map servicemap = new HashMap(); public ProtobufRPCServerSessionHandler() { UserInfoServiceImpl userInfoServiceImpl = new UserInfoServiceImpl(); String serviceName = userInfoServiceImpl.getDescriptor().getFullName(); [...]]]></description>
		<wfw:commentRss>http://618119.com/archives/2009/01/15/130.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(4.RPC请求和应答的编码解码)</title>
		<link>http://618119.com/archives/2009/01/15/129.html</link>
		<comments>http://618119.com/archives/2009/01/15/129.html#comments</comments>
		<pubDate>Wed, 14 Jan 2009 16:41:48 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[apache mina]]></category>
		<category><![CDATA[google protobuf]]></category>
		<category><![CDATA[Hessian]]></category>
		<category><![CDATA[RPC]]></category>

		<guid isPermaLink="false">http://618119.com/?p=129</guid>
		<description><![CDATA[接上一篇：http://618119.com/archives/2009/01/13/128.html 1.ProtobufRPCCodecFactory.java [code] package com.lizongbo.protobufrpc; import org.apache.mina.filter.codec.ProtocolCodecFactory; import org.apache.mina.filter.codec.ProtocolEncoder; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolDecoder; public class ProtobufRPCCodecFactory implements ProtocolCodecFactory { ProtocolDecoder decoder = new ProtobufRPCRequestProtocolDecoder(); ProtocolEncoder encoder = new ProtobufRPCResponseProtocolEncoder(); public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception { return encoder; } public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception { return decoder; } } [/code] 2. ProtobufRPCRequestProtocolDecoder.java [code] package [...]]]></description>
		<wfw:commentRss>http://618119.com/archives/2009/01/15/129.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(3.定义RPC请求和应答)</title>
		<link>http://618119.com/archives/2009/01/13/128.html</link>
		<comments>http://618119.com/archives/2009/01/13/128.html#comments</comments>
		<pubDate>Tue, 13 Jan 2009 15:59:00 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[apache mina]]></category>
		<category><![CDATA[google protobuf]]></category>
		<category><![CDATA[Hessian]]></category>
		<category><![CDATA[RPC]]></category>

		<guid isPermaLink="false">http://618119.com/archives/2009/01/13/128.html</guid>
		<description><![CDATA[接上一篇： http://618119.com/archives/2009/01/13/127.html google Protocol Buffers RPC的应答包： [code] package com.lizongbo.protobufrpc; import java.io.*; import java.nio.ByteBuffer; public class ProtobufRPCRequest { private String serviceName; private String methodName; private byte[] requestMessage; private int reqByteLen; public String getServiceName() { return serviceName; } public String getMethodName() { return methodName; } public byte[] getRequestMessage() { return requestMessage; } public int getReqByteLen() { return [...]]]></description>
		<wfw:commentRss>http://618119.com/archives/2009/01/13/128.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(2.service端)</title>
		<link>http://618119.com/archives/2009/01/13/127.html</link>
		<comments>http://618119.com/archives/2009/01/13/127.html#comments</comments>
		<pubDate>Tue, 13 Jan 2009 15:51:33 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[RPC]]></category>
		<category><![CDATA[apache mina]]></category>
		<category><![CDATA[google protobuf]]></category>
		<category><![CDATA[Hessian]]></category>

		<guid isPermaLink="false">http://618119.com/?p=127</guid>
		<description><![CDATA[接上一篇：http://618119.com/archives/2009/01/10/124.html 1.接口功能实现： [code] package com.lizongbo.mobileqq; import com.lizongbo.mobileqq.QQUserInfoProtos.*; import com.google.protobuf.RpcController; import com.google.protobuf.RpcCallback; public class UserInfoServiceImpl extends UserInfoService { public void getUserInfo(RpcController controller, GetUserInfoRequest request, RpcCallback < com.lizongbo.mobileqq. QQUserInfoProtos.GetUserInfoResponse > done) { GetUserInfoResponse.Builder builder = GetUserInfoResponse. newBuilder(); builder.setQqNo(request.getQqNo()); if (request.getQqNo() == 123456) { builder.setResult(0); QQUser.Builder qb = QQUser.newBuilder(); qb.setQqNo(request.getQqNo()); qb.setNickNmae("lizongbo"); qb.setPostCode("618100"); qb.setSignName("google Protocol Buffers 远程调用"); qb.setAddress("google"); builder.setUserInfo(qb); [...]]]></description>
		<wfw:commentRss>http://618119.com/archives/2009/01/13/127.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>扩展java.net.URL支持自定义协议来优化hessian的调用</title>
		<link>http://618119.com/archives/2009/01/11/126.html</link>
		<comments>http://618119.com/archives/2009/01/11/126.html#comments</comments>
		<pubDate>Sun, 11 Jan 2009 14:51:17 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hessian]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[RPC]]></category>
		<category><![CDATA[URL]]></category>
		<category><![CDATA[URLStreamHandler]]></category>
		<category><![CDATA[URLStreamHandlerFactory]]></category>

		<guid isPermaLink="false">http://618119.com/?p=126</guid>
		<description><![CDATA[扩展java.net.URL支持自定义协议来优化hessian调用 hessian是个高性能的java RPC调用协议，但是官方默认只提供了基于http和https两种方式的远程调用。 虽然每天使用http方式调用上千万次也没出现性能问题，(有jdk一份功劳，jdk1.5及以上版本支持了http.KeepAlive， 默认设置为： http.KeepAlive.remainingData=512 http.KeepAlive.queuedConnections=10) 但是如果能够改成tcp纯socket长连接池方式，性能是还可以优化的，因为把http的header头信息给省了七七八八。 由于hessian使用的URL和URLConnection来发送hessian请求和应答的，而URL的协议处理是可以扩展的, 因此可以通过扩展URL支持自定义协议来灵活切换hessian使用http或者tcp或者udp方式进行请求发送和接收应答。 查找相关资料后整理了三种扩展方法： 1.通过用户指定的package名称的最后一位作为协议名称（包名要是小写的）。 例如我自定义了三个协议,hessiantcp,hessianudp,hessiantcpudp； 则需要建立三个继承java.net.URLStreamHandler的Handler类(实现类的名字必须是Handler). 即： com.lizongbo.hessian.protocol.hessiantcp.Handler.java com.lizongbo.hessian.protocol.hessianudp.Handler.java com.lizongbo.hessian.protocol.hessiantcpudp.Handler.java 在运行时，还要指定系统属性java.protocol.handler.pkgs 或者在java命令行里增加启动参数： -Djava.protocol.handler.pkgs=com.lizongbo.hessian.protocol（多个包名之间用竖线隔开，例如: -Djava.protocol.handler.pkgs=com.lizongbo.hessian.protocola&#124;com.lizongbo.hessian.protocolb） 或者在代码里调用创建URL之前，先执行： [code] System.setProperty("java.protocol.handler.pkgs","com.lizongbo.hessian.protocol"); URL serviceUrl = new URL("hessiantcp://618119.com/blog/hessian/service"); [/code] 这样，用户便能够通过URL对象处理hessiantcp://这样的协议了， 否则，使用hessiantcp://这样的协议会导致异常。 参考：http://www.tuscany.org.cn/index.php/Tuscany与JBoss集成中遇到的问题及排除 和http://java.sun.com/developer/onlineTraining/protocolhandlers/ 2.设置指定的URLStreamHandlerFactory也可以扩展自定义的协议。 [code] package com.lizongbo.hessian.protocol; import java.net.*; import java.util.Hashtable; class HessianURLStreamHandlerFactory implements URLStreamHandlerFactory { private String packagePrefix = "com.lizongbo.hessian.protocol"; protected static [...]]]></description>
		<wfw:commentRss>http://618119.com/archives/2009/01/11/126.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(1.准备工作)</title>
		<link>http://618119.com/archives/2009/01/10/124.html</link>
		<comments>http://618119.com/archives/2009/01/10/124.html#comments</comments>
		<pubDate>Sat, 10 Jan 2009 13:25:44 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[apache mina]]></category>
		<category><![CDATA[google protobuf]]></category>
		<category><![CDATA[Hessian]]></category>
		<category><![CDATA[RPC]]></category>

		<guid isPermaLink="false">http://618119.com/?p=124</guid>
		<description><![CDATA[基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(1.准备工作) 1.最新的google Protocol Buffers 下载地址为： http://protobuf.googlecode.com/files/protobuf-2.0.3.zip http://protobuf.googlecode.com/files/protoc-2.0.3-win32.zip 来源：http://code.google.com/p/protobuf/downloads/list 2.Apache MINA 2.0.0-M4下载地址为： http://apache.freelamp.com/mina/2.0.0-M4/mina-2.0.0-M4.zip (或：http://www.eu.apache.org/dist/mina/2.0.0-M4/mina-2.0.0-M4.zip) 3.protobuf-rpc的代码： 通过svn取protobuf-rpc的代码到本地。源代码地址在： http://protobuf-rpc.googlecode.com/svn/trunk/ 来源： http://code.google.com/p/protobuf-rpc/ 不过这个例子太简单，并且没有java版本的。 4.建立目录D:/Java/protoc/javasrc， 运行命令： protoc.exe  -I=&#8221;D:/Java/protoc/protobuf-2.0.3/src/google/protobuf&#8221; &#8211;java_out=&#8221;D:/Java/protoc/javasrc&#8221; D:/Java/protoc/protobuf-2.0.3/src/google/protobuf/descriptor.proto 很奇特，protoc.exe -–java_out=./ D:\Java\protoc\protobuf-2.0.0beta\src\google\protobuf\descriptor.proto 运行出错了。（参考：http://618119.com/archives/2008/07/08/100.html） 5.复制D:\Java\protoc\javasrc\com\google\protobuf下的DescriptorProtos.java到 D:\Java\protoc\protobuf-2.0.3\java\src\main\java\com\google\protobuf。 建立java工程到E:\mywork\protobuf，将D:\Java\protoc\protobuf-2.0.3\java\src\main\java\下的文件复制到E:\mywork\protobuf\src。 (以下步骤其实是我绕的弯路) 6.E:\mywork\protobuf\src&#62;svn checkout http://protobuf-rpc.googlecode.com/svn/trunk / protobuf-rpc-read-only A    protobuf-rpc-read-only\protoc.sh A    protobuf-rpc-read-only\protocol A    protobuf-rpc-read-only\protocol\protobufrpc.proto A    protobuf-rpc-read-only\LICENSE A    protobuf-rpc-read-only\protobufrpc [...]]]></description>
		<wfw:commentRss>http://618119.com/archives/2009/01/10/124.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>选择或设计实现远程RPC调用所需要考虑的n个方面</title>
		<link>http://618119.com/archives/2008/08/27/107.html</link>
		<comments>http://618119.com/archives/2008/08/27/107.html#comments</comments>
		<pubDate>Wed, 27 Aug 2008 15:33:28 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Hessian]]></category>
		<category><![CDATA[RMI]]></category>
		<category><![CDATA[RPC]]></category>
		<category><![CDATA[XML-RPC]]></category>
		<category><![CDATA[google protobuf]]></category>
		<category><![CDATA[thrift]]></category>

		<guid isPermaLink="false">http://618119.com/archives/2008/08/27/107.html</guid>
		<description><![CDATA[选择或设计实现远程RPC调用所需要考虑的n个方面 (前段时间记录的零散片段，却一直没时间仔细整理，仅记录在此，以做备忘。) 可参考协议(组件)为： http,smtp,pop,ftp,dns，burlap,json,xml-rpc,xmpp,smpp,rmi,soap,hessian,thrift ， protocol buffers等等 需要考虑以下方面： 必备条件： a.多语言支持 b.强大的序列化和反序列化(xml,text,pdu,text+stream) c.多种传输模式 1.服务端所支持的编程语言。 java,C,C++,C#,PHP等等 2.客户端支持的语言。 java,C,C++,JavaScript等 3.字节流转码。 支持GBK,UTF-8等。 4.支持的基础数据类型。 char,int,long,double,floadt,boolean,List,Map,Object(Struct) 5.同名重载方法区别 6.支持数据包的转发代理 （前端负载均衡） 7.自定义超时连接 8.数据包转换 （对象的序列化和反序列化） 9.数据类型扩展 10.类与接口实现的约束 11.是否支持负载限制 （比如超过100并发时，直接返回系统忙） 12.failover处理 13.事务控制 14.异步调用 15.数据包版本自动识别 16.TCP/UDP支持 (UDP 有1472字节限制。) 17.代码生成器（主要针对数据包的序列化） 18.与现有框架的整合难度(组件化程度) 19.大文件传输 21.数据包序列化效率 客户端连接池 应用范围 22.网络带宽约束（数据包是否支持压缩） 23.服务接口监控统计 数据包加密 SSL支持 是否需要握手消息(是需多次交互还是简单的请求应答模式) 调试抓包的方便性 是否支持双向调用(xmpp支持) 部署难易程度 参数配置难度 是否支持请求队列 请求应答的对应关系 协议可读性 [...]]]></description>
		<wfw:commentRss>http://618119.com/archives/2008/08/27/107.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HessianServlet和HessianProxyFactory的配置参数</title>
		<link>http://618119.com/archives/2008/07/27/106.html</link>
		<comments>http://618119.com/archives/2008/07/27/106.html#comments</comments>
		<pubDate>Sun, 27 Jul 2008 06:20:13 +0000</pubDate>
		<dc:creator>lizongbo</dc:creator>
				<category><![CDATA[Hessian]]></category>
		<category><![CDATA[RPC]]></category>

		<guid isPermaLink="false">http://618119.com/?p=106</guid>
		<description><![CDATA[HessianServlet和HessianProxyFactory的配置参数 home-class，service-class,表示Service的实现类的类名 home-api，api-class，是Service的接口类名 object-class,不太了解 object-api，不太了解， debug,调试开关，默认为false，需要设置为true的时候，值必须是&#8221;true&#8221;，区分大小写(不建议设置为true) send-collection-type,设置SerializerFactory是否在序列化的数据里传递集合类的类型名，默认为true,需要设置为false的时候， 值必须是&#8221;false&#8221;，区分大小写(不建议设置为false) 其实 SerializerFactory还有个 _isAllowNonSerializable属性，控制是否接受对没有实现 java.io.Serializable接口的对象， 通过setAllowNonSerializable来控制， 默认是不接受，为false，而HessianServlet却没提供这个参数的控制开关，因此如果要支持传输没有实现java.io.Serializable接口的对象， 则需要继承HessianServlet来加上相应控制，重载getSerializerFactory方法来设置参数或增加扩展的SerializerFactory, 而无法通过直接配置HessianServlet的初始化参数来实现。 先前提到的 hessian  3.1.5里hession2.0 有bug ，在hessian 3.1.6里依然存在,在hessian 3.2.0中将被修正. 参考： http://maillist.caucho.com/pipermail/hessian-interest/2008-July/000405.html ServiceContext存放了线程局部变量request, ServiceContext.getContextRequest() HessianProxyFactory 设置的 _isOverloadEnabled 可支持同名重载方法。 不过不建议在接口中使用同名方法和变长参数。 _user和_password是设置 http basic认证的用户名和密码。 _isDebug，调试开关 _isHessian2Reply，_isHessian2Request，是否使用hessian 2.0协议发送请求。 _isChunkedPost,设置Chunked编码方式发送请求。 Tags: Hessian, RPC]]></description>
		<wfw:commentRss>http://618119.com/archives/2008/07/27/106.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

