增加异常的定义和处理
diff --git a/dubbo_client/__init__.py b/dubbo_client/__init__.py
index 8bf05e7..7feb134 100644
--- a/dubbo_client/__init__.py
+++ b/dubbo_client/__init__.py
@@ -3,3 +3,4 @@
from rpc import (
DubboClient,
)
+from rpcerror import *
\ No newline at end of file
diff --git a/dubbo_client/registry.py b/dubbo_client/registry.py
index fe15119..025782a 100644
--- a/dubbo_client/registry.py
+++ b/dubbo_client/registry.py
@@ -38,7 +38,7 @@
def node_listener(event):
- print event
+ # print event
event_queue.put(event)
@@ -91,7 +91,7 @@
for i in range(num_worker_threads):
t = Thread(target=worker)
- t.daemon = False
+ t.daemon = True
t.start()
diff --git a/dubbo_client/rpc.py b/dubbo_client/rpc.py
index 0ac0b81..6bbd3ba 100644
--- a/dubbo_client/rpc.py
+++ b/dubbo_client/rpc.py
@@ -1,9 +1,11 @@
import httplib
import json
import random
-from pyjsonrpc import HttpClient
+from urllib2 import HTTPError
+from pyjsonrpc import HttpClient, JsonRpcError
from dubbo_client.registry import service_provides, add_provider_listener
+from dubbo_client.rpcerror import NoProvider, ConnectionFail, dubbo_client_errors
__author__ = 'caozupeng'
@@ -42,11 +44,16 @@
def call(self, method, *args, **kwargs):
provides = service_provides.get(self.interface, {})
if len(provides) == 0:
- return None
+ raise NoProvider('can not find provide', self.interface)
location, provide = random.choice(provides.items())
print 'location is {0}'.format(location)
client = HttpClient(url="http://{0}{1}".format(location, provide.path))
- return client.call(method, *args, **kwargs)
+ try:
+ return client.call(method, *args, **kwargs)
+ except HTTPError, e:
+ raise ConnectionFail(None, e.filename)
+ except JsonRpcError, error:
+ raise dubbo_client_errors.get(error.code, None)
def __call__(self, method, *args, **kwargs):
"""
diff --git a/dubbo_client/rpcerror.py b/dubbo_client/rpcerror.py
new file mode 100644
index 0000000..fae2805
--- /dev/null
+++ b/dubbo_client/rpcerror.py
@@ -0,0 +1,88 @@
+# coding=utf-8
+__author__ = 'caozupeng'
+
+dubbo_client_errors = {}
+
+
+class DubboClientError(RuntimeError):
+ code = None
+ message = None
+ data = None
+
+ def __init__(self, message=None, data=None, code=None):
+ RuntimeError.__init__(self)
+ self.message = message or self.message
+ self.data = data
+ self.code = code or self.code
+ assert self.code, "Error without code is not allowed."
+
+ def __str__(self):
+ return "DubboError({code}): {message}".format(
+ code=self.code,
+ message=str(self.message)
+ )
+
+ def __unicode__(self):
+ return u"DubboClientError({code}): {message}".format(
+ code=self.code,
+ message=self.message
+ )
+
+
+class MethodNotFound(DubboClientError):
+ code = -32601
+ message = u"The method does not exist / is not available."
+
+ def __init__(self, message=None, data=None):
+ DubboClientError.__init__(self, message=message, data=data)
+
+
+class ConnectionFail(DubboClientError):
+ code = 504
+ message = u'connect failed {0}'
+
+ def __init__(self, message=None, data=None):
+ message = self.message.format(data)
+ DubboClientError.__init__(self, message=message, data=data)
+
+
+class NoProvider(DubboClientError):
+ code = 5050
+ message = u'No provide name {0}'
+ provide_name = u''
+
+ def __init__(self, message=None, data=None):
+ self.provide_name = data
+ DubboClientError.__init__(self, message=self.message.format(data), data=data)
+
+
+class InvalidParams(DubboClientError):
+ code = -32602
+ message = u"Invalid method parameter(s)."
+
+ def __init__(self, message=None, data=None):
+ DubboClientError.__init__(self, message=message, data=data)
+
+
+class InternalError(DubboClientError):
+ code = -32603
+ message = u"Internal JSON-RPC error."
+
+ def __init__(self, message=None, data=None):
+ DubboClientError.__init__(self, message=message, data=data)
+
+
+class InvalidRequest(DubboClientError):
+ code = -32600
+ message = u"The JSON sent is not a valid Request object."
+
+ def __init__(self, message=None, data=None):
+ DubboClientError.__init__(self, message=message, data=data)
+
+
+dubbo_client_errors[MethodNotFound.code] = MethodNotFound
+dubbo_client_errors[NoProvider.code] = NoProvider
+dubbo_client_errors[ConnectionFail.code] = ConnectionFail
+dubbo_client_errors[InvalidParams.code] = InvalidParams
+dubbo_client_errors[InternalError.code] = InternalError
+dubbo_client_errors[InvalidRequest.code] = InvalidRequest
diff --git a/test_dubbo_client/test_rpclib.py b/test_dubbo_client/test_rpclib.py
index 6bf7e04..2346359 100644
--- a/test_dubbo_client/test_rpclib.py
+++ b/test_dubbo_client/test_rpclib.py
@@ -1,7 +1,7 @@
# coding=utf-8
import time
-from dubbo_client import DubboClient
+from dubbo_client import DubboClient, DubboClientError
__author__ = 'caozupeng'
@@ -10,10 +10,14 @@
service_interface = 'com.ofpay.demo.api.UserProvider'
dubbo_client = DubboClient(service_interface)
for i in range(1000):
- print dubbo_client.getUser('A003')
- print dubbo_client.queryUser(
- {u'age': 18, u'time': 1428463514153, u'sex': u'MAN', u'id': u'A003', u'name': u'zhangsan'})
- print dubbo_client.queryAll()
- print dubbo_client.isLimit('MAN', 'Joe')
- print dubbo_client('getUser', 'A005')
+ try:
+ print dubbo_client.getUser('A003')
+ print dubbo_client.queryUser(
+ {u'age': 18, u'time': 1428463514153, u'sex': u'MAN', u'id': u'A003', u'name': u'zhangsan'})
+ print dubbo_client.queryAll()
+ print dubbo_client.isLimit('MAN', 'Joe')
+ print dubbo_client('getUser', 'A005')
+
+ except DubboClientError, client_e:
+ print client_e
time.sleep(5)