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