public class HessianMethodInvocation implements InvocationHandler, Serializable { private static final long serialVersionUID = 7304512179586775133L; private TestServiceImpl testService; private HessianSkeleton skeleton; private AbstractHessianInput input; private AbstractHessianOutput output; public HessianMethodInvocation(AbstractHessianInput input, AbstractHessianOutput output) { testService = new TestServiceImpl(); skeleton = new HessianSkeleton(testService, TestService.class); this.input = input; this.output = output; } public void invoke() { try { skeleton.invoke(input, output); } catch (Throwable e) { e.printStackTrace(); } } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; } }
public class HessianDecoder extends ByteToMessageDecoder { private final ClassResolver classResolver; private static TestServiceImpl testService; private static HessianSkeleton skeleton; static { testService = new TestServiceImpl(); skeleton = new HessianSkeleton(testService, TestService.class); } public HessianDecoder(ClassResolver classResolver) { this(1048576, classResolver); } public HessianDecoder(int maxObjectSize, ClassResolver classResolver) { super(); this.classResolver = classResolver; } @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { int length = in.readInt(); ByteBuf frame = Unpooled.buffer(length); in.readBytes(frame); if (frame == null) { return; } ByteArrayInputStream is = new ByteArrayInputStream(frame.array()); OutputStream osToUse = new ByteArrayOutputStream(); AbstractHessianInput input = new HessianInput(is); AbstractHessianOutput output = new HessianOutput(osToUse); HessianMethodInvocation invocation = new HessianMethodInvocation(input, output); if (invocation != null) { out.add(invocation); } } }
public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); // if (sslCtx != null) { // p.addLast(sslCtx.newHandler(ch.alloc())); // } // p.addLast(new LoggingHandler(LogLevel.INFO)); p.addLast( new HessianDecoder(ClassResolvers.cacheDisabled(null)), new HessianMethodInvocationHandler()); }
class HessianMethodInvocationHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { System.out.println(msg.getClass().getName()); if (! (msg instanceof HessianMethodInvocation)) { } HessianMethodInvocation invocation = (HessianMethodInvocation) msg; invocation.invoke(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // Close the connection when an exception is raised. cause.printStackTrace(); ctx.close(); } }
public class HessianMethodInvocationProxy implements InvocationHandler, Serializable { private static final long serialVersionUID = 6587104138220238229L; private String method; private Object[] args; public HessianMethodInvocationProxy(String method, Object[] args) { this.method = method; this.args = args; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public Object[] getArgs() { return args; } public void setArgs(Object[] args) { this.args = args; } public void invoke(ChannelHandlerContext ctx) { ctx.writeAndFlush(this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; } }
public class HessianEncoder extends MessageToByteEncoder<Serializable> { private static final byte[] LENGTH_PLACEHOLDER = new byte[4]; @Override protected void encode(ChannelHandlerContext ctx, Serializable msg, ByteBuf out) throws Exception { if (! (msg instanceof HessianMethodInvocationProxy)) { } HessianMethodInvocationProxy proxy = (HessianMethodInvocationProxy) msg; int startIdx = out.writerIndex(); ByteBufOutputStream bout = new ByteBufOutputStream(out); // ObjectOutputStream oout = null; try { bout.write(LENGTH_PLACEHOLDER); ByteArrayOutputStream osToUse = new ByteArrayOutputStream(); AbstractHessianOutput output = new HessianOutput(osToUse); try { output.call(proxy.getMethod(), proxy.getArgs()); } catch (Throwable e) { e.printStackTrace(); } bout.write(osToUse.toByteArray()); } finally { bout.close(); } int endIdx = out.writerIndex(); out.setInt(startIdx, endIdx - startIdx - 4); } }
public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); // if (sslCtx != null) { // p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT)); // } p.addLast(new HessianEncoder()); p.addLast(new HessianMethodInvocationHandlerProxy()); }
class HessianMethodInvocationHandlerProxy extends ChannelInboundHandlerAdapter { /** * Creates a client-side handler. */ public HessianMethodInvocationHandlerProxy() { //TODO } @Override public void channelActive(ChannelHandlerContext ctx) { HessianMethodInvocationProxy proxy = new HessianMethodInvocationProxy("test", new Object[] {"helloworld1234567"}); proxy.invoke(ctx); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { System.out.println(msg); } @Override public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // Close the connection when an exception is raised. cause.printStackTrace(); ctx.close(); } }
相关推荐
目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 2. 从通信协议的层面 基于 HTTP 协议的(例如基于...
Dubbo是一款基于Netty的高性能、轻量级的RPC框架,其主要功能包括:面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册和发现、依赖分析与降级。支持dubbo、rmi、hessian、http、webservice、thrift、...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码...
浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...