From 8417bd2152b14f56cea98b56500f11b1e8ff0e24 Mon Sep 17 00:00:00 2001 From: "william.liangf" Date: Tue, 15 Nov 2011 05:27:59 +0000 Subject: [PATCH] =?UTF-8?q?DUBBO-39=20=E5=A2=9E=E5=8A=A0hessian=E5=BC=82?= =?UTF-8?q?=E5=B8=B8code=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@272 1a56cb94-b969-4eaa-88fa-be21384802f2 --- .../protocol/hessian/HessianRpcInvoker.java | 29 +++++++++++++++++-- .../protocol/hessian/HessianProtocolTest.java | 3 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianRpcInvoker.java b/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianRpcInvoker.java index e6f4f8acf4..fc70d423b0 100644 --- a/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianRpcInvoker.java +++ b/dubbo-rpc-hessian/src/main/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianRpcInvoker.java @@ -15,6 +15,8 @@ */ package com.alibaba.dubbo.rpc.protocol.hessian; +import java.net.SocketTimeoutException; + import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.rpc.Invocation; @@ -25,8 +27,10 @@ import com.alibaba.dubbo.rpc.RpcException; import com.alibaba.dubbo.rpc.RpcResult; import com.alibaba.dubbo.rpc.protocol.AbstractInvoker; import com.caucho.hessian.HessianException; +import com.caucho.hessian.client.HessianConnectionException; import com.caucho.hessian.client.HessianConnectionFactory; import com.caucho.hessian.client.HessianProxyFactory; +import com.caucho.hessian.io.HessianMethodSerializationException; /** * hessian rpc invoker. @@ -65,16 +69,37 @@ public class HessianRpcInvoker extends AbstractInvoker { if (e != null) { String name = e.getClass().getName(); if (name.startsWith(HESSIAN_EXCEPTION_PREFIX)) { - throw new RpcException("Failed to invoke remote service: " + getInterface() + ", method: " + RpcException re = new RpcException("Failed to invoke remote service: " + getInterface() + ", method: " + invocation.getMethodName() + ", cause: " + e.getMessage(), e); + throw setRpcExceptionCode(e, re); } } return result; } catch (RpcException e) { - throw e; + throw setRpcExceptionCode(e.getCause(), e); + } catch (HessianException e) { + throw setRpcExceptionCode(e, new RpcException("Failed to invoke remote service: " + getInterface() + ", method: " + + invocation.getMethodName() + ", cause: " + e.getMessage(), e)); } catch (Throwable e) { return new RpcResult(e); } + } + + private RpcException setRpcExceptionCode(Throwable e, RpcException re) { + if (e != null) { + if (e instanceof HessianConnectionException) { + re.setCode(RpcException.NETWORK_EXCEPTION); + if (e.getCause() != null) { + Class cls = e.getCause().getClass(); + if (SocketTimeoutException.class.equals(cls)) { + re.setCode(RpcException.TIMEOUT_EXCEPTION); + } + } + } else if (e instanceof HessianMethodSerializationException) { + re.setCode(RpcException.SERIALIZATION_EXCEPTION); + } + } + return re; } } \ No newline at end of file diff --git a/dubbo-rpc-hessian/src/test/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianProtocolTest.java b/dubbo-rpc-hessian/src/test/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianProtocolTest.java index 6828b473e3..6d366b9b99 100644 --- a/dubbo-rpc-hessian/src/test/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianProtocolTest.java +++ b/dubbo-rpc-hessian/src/test/java/com/alibaba/dubbo/rpc/protocol/hessian/HessianProtocolTest.java @@ -80,9 +80,10 @@ public class HessianProtocolTest { Invoker invoker = protocol.refer(HessianService.class, url); HessianService client = proxyFactory.getProxy(invoker); try { - client.timeOut(100000); + client.timeOut(6000); fail(); } catch (RpcException expected) { + Assert.assertEquals(true, expected.isTimeout()); }finally{ invoker.destroy(); exporter.unexport();