java实现rpc连接池_JAVA RPC (八) 手把手从零教你写一个生产级RPC之client请求

@Overridepublic Object invoke(MethodInvocation invocation) throwsInvocationTargetException, IllegalAccessException {

Method method=invocation.getMethod ();

String methodName=method.getName ();

Object[] args=invocation.getArguments ();

Class>[] parameterTypes =method.getParameterTypes ();if (method.getDeclaringClass () == Object.class) {try{return method.invoke ( this, args );

}catch(IllegalAccessException e) {

LOG.error ( e.getMessage (), e );return null;

}

}if ("toString".equals ( methodName ) && parameterTypes.length == 0) {return this.toString ();

}if ("hashCode".equals ( methodName ) && parameterTypes.length == 0) {return this.hashCode ();

}if ("equals".equals ( methodName ) && parameterTypes.length == 1) {return this.equals ( args[0] );

}boolean serviceTop =false;

Transaction transaction=null;if(TraceThreadContext.get () ==null){

serviceTop=true;

transaction= Cat.newTransaction("Service", method.getDeclaringClass ().getName ().concat ( "." ).concat ( methodName ).concat ( ".top"));

MessageTree tree=Cat.getManager().getThreadLocalMessageTree();

String messageId=tree.getMessageId();if (messageId == null) {

messageId=Cat.createMessageId();

tree.setMessageId(messageId);

}

String childId= Cat.getProducer().createRpcServerId("default");

String root=tree.getRootMessageId();if (root == null) {

root=messageId;

}

Cat.logEvent(CatConstants.TYPE_REMOTE_CALL,"", Event.SUCCESS, childId);

KoalasTrace koalasTrace= newKoalasTrace ( );

koalasTrace.setChildId (childId );

koalasTrace.setParentId ( messageId);

koalasTrace.setRootId ( root );

TraceThreadContext.set (koalasTrace);

}else{

KoalasTrace currentKoalasTrace=TraceThreadContext.get ();

String child_Id= Cat.getProducer().createRpcServerId("default");

Cat.logEvent(CatConstants.TYPE_REMOTE_CALL,"", Event.SUCCESS, child_Id);

currentKoalasTrace.setChildId ( child_Id );

}try{

TTransport socket= null;int currTryTimes = 0;while (currTryTimes++

ServerObject serverObject=icluster.getObjectForRemote ();if (serverObject == null) throw new IllegalStateException("no server list to use :" +koalasClientProxy.getServiceInterface ().getName ());

GenericObjectPool genericObjectPool =serverObject.getGenericObjectPool ();try{long before =System.currentTimeMillis ();

socket=genericObjectPool.borrowObject ();long after =System.currentTimeMillis ();

LOG.debug ("get Object from pool with {} ms", after -before );

}catch(Exception e) {if (socket != null)

genericObjectPool.returnObject ( socket );

LOG.error ( e.getMessage (), e );if(transaction!=null)

transaction.setStatus ( e );throw new IllegalStateException("borrowObject error :" +koalasClientProxy.getServiceInterface ().getName ());

}

Object obj=koalasClientProxy.getInterfaceClientInstance ( socket, serverObject.getRemoteServer ().getServer () );if (obj instanceofTAsyncClient) {

((TAsyncClient) obj).setTimeout ( asyncTimeOut );if (args.length < 1) {

genericObjectPool.returnObject ( socket );throw new IllegalStateException ( "args number error");

}

Object argslast= args[args.length - 1];if (!(argslast instanceofAsyncMethodCallback)) {

genericObjectPool.returnObject ( socket );throw new IllegalStateException ( "args type error");

}

AsyncMethodCallback callback=(AsyncMethodCallback) argslast;

ReleaseResourcesKoalasAsyncCallBack releaseResourcesKoalasAsyncCallBack= newReleaseResourcesKoalasAsyncCallBack ( callback, serverObject, socket );

args[args.length- 1] =releaseResourcesKoalasAsyncCallBack;

}try{

Object o=method.invoke ( obj, args );if (socket instanceofTSocket) {

genericObjectPool.returnObject ( socket );

}if(transaction!=null)

transaction.setStatus ( Transaction.SUCCESS );returno;

}catch(Exception e) {

Throwable cause= (e.getCause () == null) ?e : e.getCause ();boolean ifreturn = false;if (cause instanceofTApplicationException) {if (((TApplicationException) cause).getType () == 6666) {

LOG.info ("the server{}--serverName【{}】 thread pool is busy ,retry it!", serverObject.getRemoteServer (),koalasClientProxy.getServiceInterface ().getName () );if (socket != null) {

genericObjectPool.returnObject ( socket );

ifreturn= true;

}

Thread.yield ();if(retryRequest)continue;

}if (((TApplicationException) cause).getType () == 9999) {

LOG.error ("rsa error with service--{}--serverName【{}】", serverObject.getRemoteServer (),koalasClientProxy.getServiceInterface ().getName () );if (socket != null) {

genericObjectPool.returnObject ( socket );

}if(transaction!=null)

transaction.setStatus ( cause );throw new IllegalStateException("rsa error with service" + serverObject.getRemoteServer ().toString ()+koalasClientProxy.getServiceInterface ().getName () );

}if (((TApplicationException) cause).getType () == 6699) {

LOG.error ("this client is not rsa support,please get the privateKey and publickey with server--{}--serverName【{}】", serverObject.getRemoteServer (),koalasClientProxy.getServiceInterface ().getName () );if (socket != null) {

genericObjectPool.returnObject ( socket );

}if(transaction!=null)

transaction.setStatus ( cause );throw new IllegalStateException("this client is not rsa support,please get the privateKey and publickey with server" + serverObject.getRemoteServer ().toString ()+koalasClientProxy.getServiceInterface ().getName ());

}if (((TApplicationException) cause).getType () ==TApplicationException.INTERNAL_ERROR) {

LOG.error ("this server is error please take the error log with server--{}--serverName【{}】the remote server error message data【{}】", serverObject.getRemoteServer (),koalasClientProxy.getServiceInterface ().getName (),((TApplicationException) cause).getMessage () );if (socket != null) {

genericObjectPool.returnObject ( socket );

}if(transaction!=null)

transaction.setStatus ( cause );throw new IllegalStateException("this server is error please take the error log with server" + serverObject.getRemoteServer ()+koalasClientProxy.getServiceInterface ().getName ());

}if (((TApplicationException) cause).getType () ==TApplicationException.MISSING_RESULT) {if (socket != null) {

genericObjectPool.returnObject ( socket );

}return null;

}

}if (cause instanceofRSAException) {

LOG.error ("this client privateKey or publicKey is error,please check it! --{}--serverName【{}】", serverObject.getRemoteServer (),koalasClientProxy.getServiceInterface ().getName () );if (socket != null) {

genericObjectPool.returnObject ( socket );

}if(transaction!=null)

transaction.setStatus ( cause );throw new IllegalStateException("this client privateKey or publicKey is error,please check it!" + serverObject.getRemoteServer ()+koalasClientProxy.getServiceInterface ().getName ());

}if(cause instanceofOutMaxLengthException){

LOG.error ( (cause ).getMessage (),cause );if (socket != null) {

genericObjectPool.returnObject ( socket );

}if(transaction!=null)

transaction.setStatus ( cause );throw new IllegalStateException("to big content!" + serverObject.getRemoteServer ()+koalasClientProxy.getServiceInterface ().getName ());

}if (cause.getCause () != null && cause.getCause () instanceofConnectException) {

LOG.error ("the server {}--serverName【{}】 maybe is shutdown ,retry it!", serverObject.getRemoteServer (),koalasClientProxy.getServiceInterface ().getName () );try{if (socket != null) {

genericObjectPool.returnObject ( socket );

ifreturn= true;

}if(retryRequest)continue;

}catch(Exception e1) {

LOG.error ("invalidateObject error!", e1 );

}

}if (cause.getCause () != null && cause.getCause () instanceofSocketTimeoutException) {

LOG.error ("read timeout SocketTimeoutException,retry it! {}--serverName【{}】", serverObject.getRemoteServer (),koalasClientProxy.getServiceInterface ().getName () );if (socket != null) {try{

genericObjectPool.invalidateObject ( socket );

ifreturn= true;

}catch(Exception e1) {

LOG.error ("invalidateObject error ,", e );if(transaction!=null)

transaction.setStatus ( e1 );throw new IllegalStateException("SocketTimeout and invalidateObject error" + serverObject.getRemoteServer () +koalasClientProxy.getServiceInterface ().getName ());

}

}if(retryRequest)continue;

}if(cause instanceofTTransportException){if(((TTransportException) cause).getType () ==TTransportException.END_OF_FILE){

LOG.error ("TTransportException,END_OF_FILE! {}--serverName【{}】", serverObject.getRemoteServer (),koalasClientProxy.getServiceInterface ().getName () );if (socket != null) {try{

genericObjectPool.invalidateObject ( socket );

}catch(Exception e1) {

LOG.error ("invalidateObject error", e );if(transaction!=null)

transaction.setStatus ( e1 );throw new IllegalStateException("TTransportException and invalidateObject error" + serverObject.getRemoteServer () +koalasClientProxy.getServiceInterface ().getName ());

}

}if(transaction!=null)

transaction.setStatus ( cause );throw new IllegalStateException("the remote server error!" + serverObject.getRemoteServer () +koalasClientProxy.getServiceInterface ().getName ());

}if(cause.getCause ()!=null && cause.getCause () instanceofSocketException){if(genericObjectPool.isClosed ()){

LOG.warn ("serverObject {} is close!,retry it",serverObject );if(retryRequest)continue;

}

}

}if (socket != null && !ifreturn)

genericObjectPool.returnObject ( socket );

LOG.error ("invoke server error,server ip -【{}】,port -【{}】--serverName【{}】", serverObject.getRemoteServer ().getIp (), serverObject.getRemoteServer ().getPort (),koalasClientProxy.getServiceInterface ().getName () );if(transaction!=null)

transaction.setStatus ( cause );throwe;

}

}

IllegalStateException finallyException= new IllegalStateException("error!retry time out of:" + retryTimes + "!!! " +koalasClientProxy.getServiceInterface ().getName () );if(transaction!=null)

transaction.setStatus ( finallyException );throwfinallyException;

}finally{if(transaction!=null)

transaction.complete ();if(serviceTop)

TraceThreadContext.remove ();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值