基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(5.Server端的IoHandler)

作者:lizongbo 发表于:00:49. 星期四, 一月 15th, 2009
版权声明:可以任意转载,转载时请务必以超链接形式标明文章和作者信息及本版权声明

接上一篇: 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();
System.out.println("put "+serviceName);
servicemap.put(serviceName, userInfoServiceImpl);
}

public void messageReceived(final IoSession session, Object message) throws
Exception {
System.out.println("messageReceived == " + session.getClass());
ProtobufRPCRequest req = (ProtobufRPCRequest) message;
Service service = servicemap.get(req.getServiceName());
System.out.println("service========"+service);
System.out.println("req.getMethodName()=="+req.getMethodName());
MethodDescriptor md = service.getDescriptorForType().
findMethodByName(req.getMethodName());
System.out.println("md========="+md);
Message request = service.
getRequestPrototype(md).
newBuilderForType().mergeFrom(
req.getRequestMessage()).build();

service.callMethod(md,
new UserInfoServiceRpcController(), request,
new
RpcCallback() {
public void run(Message response) {
System.out.println(
"write socket for:" +
response.
toString());
byte[] data = response.
toByteArray();
try {
ProtobufRPCResponse res = new ProtobufRPCResponse();
res.setResponseMessage(data);
session.write(res);
} catch (Exception ex) {
ex.printStackTrace();
}

}
}
);
}

public void exceptionCaught(IoSession session, Throwable cause) throws
Exception {
System.out.println("exceptionCaught == " + session.getClass());
cause.printStackTrace();

}
}

[/code]

Tags: apache mina, google protobuf, Hessian, Java, RPC

Related posts

标签: , , , ,

recent related 8 searches :

这篇文章发布于 2009年01月15日,星期四,00:49,归类于 Java。 您可以跟踪这篇文章的评论通过 RSS 2.0 feed。 您可以留下评论,或者从您的站点trackback

留下回复