网站首页
网站导航
Ctrl+D收藏
首 页
代码段
源码包
文档库
工具箱
代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
JS
】
模拟dubbo 异步rpc
作者:
Rudolph
/ 发布于
2015/8/19
/
721
RpcClient.java package com.raisecom.msgbus.client.rpc; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.InetSocketAddress; import java.util.List; import java.util.Random; import com.raisecom.msgbus.client.MsgSender; import com.raisecom.msgbus.client.ResponseFuture; import com.raisecom.msgbus.client.RpcContext; import com.raisecom.msgbus.common.msg.CallObject; import com.raisecom.msgbus.common.msg.MsgObject; import com.raisecom.msgbus.server.ZkClient; public class RpcClient { @SuppressWarnings("unchecked") public static Object getProxy(Class clz, InetSocketAddress address) { return Proxy.newProxyInstance(clz.getClassLoader(), new Class[] { clz }, new Invocation(address)); } @SuppressWarnings("unchecked") public static Object getProxy(Class clz, String zkUrl) { ZkClient zk = new ZkClient(zkUrl); List<String> servers = zk.getServers(clz.getName()); if (!servers.isEmpty()) { String server = servers.get(new Random().nextInt(servers.size())); return Proxy.newProxyInstance(clz.getClassLoader(), new Class[] { clz }, new Invocation(new InetSocketAddress(server.split(":")[0], Integer .valueOf(server.split(":")[1])))); } return null; } @SuppressWarnings("unchecked") public static Object getAsynProxy(Class clz, String zkUrl) { ZkClient zk = new ZkClient(zkUrl); List<String> servers = zk.getServers(clz.getName()); if (!servers.isEmpty()) { String server = servers.get(new Random().nextInt(servers.size())); return Proxy.newProxyInstance(clz.getClassLoader(), new Class[] { clz }, new AsynInvocation(new InetSocketAddress(server.split(":")[0], Integer .valueOf(server.split(":")[1])))); } return null; } private static final class Invocation implements InvocationHandler { private InetSocketAddress address; public Invocation(InetSocketAddress address) { this.address = address; } @SuppressWarnings("unchecked") @Override public Object invoke(Object paramObject, Method paramMethod, Object[] paramArrayOfObject) throws Throwable { CallObject call = new CallObject(paramArrayOfObject, paramMethod, paramObject.getClass().getInterfaces()[0].getName()); MsgObject<CallObject, CallObject> msgObject = new MsgObject<CallObject, CallObject>(MsgObject.RPC_COMMAND, address, call); MsgObject<CallObject, CallObject> response = (MsgObject<CallObject, CallObject>) MsgSender.sendSyncMsg(msgObject); if (null != response) { return response.getResponseObj().getResult(); } return null; } } private static final class AsynInvocation implements InvocationHandler { private InetSocketAddress address; public AsynInvocation(InetSocketAddress address) { this.address = address; } @Override public Object invoke(Object paramObject, Method paramMethod, Object[] paramArrayOfObject) throws Throwable { CallObject call = new CallObject(paramArrayOfObject, paramMethod, paramObject.getClass().getInterfaces()[0].getName()); MsgObject<CallObject, CallObject> msgObject = new MsgObject<CallObject, CallObject>(MsgObject.RPC_COMMAND, address, call); ResponseFuture future = MsgSender.sendAsyncMsgFuturn(msgObject); RpcContext.getContext().setFuture(future); return null; } } } RpcContext.java package com.raisecom.msgbus.client; import java.util.concurrent.Future; public class RpcContext { private static final ThreadLocal<RpcContext> LOCAL = new ThreadLocal<RpcContext>() { protected RpcContext initialValue() { return new RpcContext(); } }; private Future<?> future; public static RpcContext getContext() { return LOCAL.get(); } public Future<?> getFuture() { return future; } public void setFuture(Future<?> future) { this.future = future; } } ClientTest.java package com.raisecom.msgbus.test; import java.util.concurrent.ExecutionException; import com.raisecom.msgbus.client.RpcContext; import com.raisecom.msgbus.client.rpc.RpcClient; public class ClientTest { public static void main(String[] args) throws InterruptedException, ExecutionException { SayHello s = (SayHello) RpcClient.getAsynProxy(SayHello.class, "127.0.0.01:2181,127.0.0.01:2182,127.0.0.01:2183"); s.sayHello("test rpc"); System.out.println(s.getHello()); System.out.println(RpcContext.getContext().getFuture().get()); } } ResponseFuture.java package com.raisecom.msgbus.client; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; @SuppressWarnings("unchecked") public class ResponseFuture implements Future { private ReentrantLock lock = new ReentrantLock(); private Condition finish = lock.newCondition(); private volatile boolean isDone = false; private Object result = null; @Override public boolean cancel(boolean paramBoolean) { return false; } @Override public Object get() throws InterruptedException, ExecutionException { try { lock.lock(); if (!isDone) { finish.await(); } return result; } finally { lock.unlock(); } } public void setValue(Object newValue) { try { lock.lock(); result = newValue; isDone = true; finish.signal(); } finally { lock.unlock(); } } @Override public Object get(long paramLong, TimeUnit paramTimeUnit) throws InterruptedException, ExecutionException, TimeoutException { try { lock.lock(); if (!isDone) { finish.await(paramLong, paramTimeUnit); } return result; } finally { lock.unlock(); } } @Override public boolean isCancelled() { return false; } @Override public boolean isDone() { return isDone; } }
评论列表
本站所提供的代码,版权归原作者所有,若有侵犯作者版权,请与我们联系,我们将立即删除或修改。谢谢!
本站所有代码发布及提供者。
试试其它关键字
dubbo
同语言下
.
Jquery搜索框获取回车事件
.
H5页面添加倒计时,然后自动跳转
.
通过user-agent判断h5页面是在哪个手机App(QQ、微信
.
nginx 禁止未绑定的域名访问
.
JavaScript 获取按键,并屏蔽系统 Window 事件
.
H5之只允许微信浏览器打开,禁止从外部浏览器访问
.
微信打开网址添加在浏览器中打开提示的办法
.
实现JS复制、粘贴,Chrome/Firefox下可用
.
video视频播放,play()、pause()、duration时长、onen
.
HTML5实现MP3上传前的预览和播放时长的获取
可能有用的
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
.
实现对图片上传的接收
.
判断用户输入的是否为IP地址
Rudolph
贡献的其它代码
(
2
)
.
模拟dubbo 异步rpc
.
图片延迟加载原理 - 优化
地图
本站
我们
服务
版权
联系
回馈
博客