`
lobin
  • 浏览: 379167 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hessian远程调用(基于Netty)

 
阅读更多

 

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();
	}
}

 

分享到:
评论

相关推荐

    Hprose 全名是高性能远程对象服务引擎.rar

    目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 2. 从通信协议的层面 基于 HTTP 协议的(例如基于...

    dubbo-admin-0.2.0.jar

    Dubbo是一款基于Netty的高性能、轻量级的RPC框架,其主要功能包括:面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册和发现、依赖分析与降级。支持dubbo、rmi、hessian、http、webservice、thrift、...

    java开源包3

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包1

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    JAVA上百实例源码以及开源项目

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

    JAVA上百实例源码以及开源项目源代码

    浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的...

    java开源包11

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包2

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包6

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包5

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包10

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包4

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包8

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包7

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包9

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包101

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    Java资源包01

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

Global site tag (gtag.js) - Google Analytics