xmlrpc.py
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:2k
源码类别:

网格计算

开发平台:

Java

  1. #Licensed to the Apache Software Foundation (ASF) under one
  2. #or more contributor license agreements.  See the NOTICE file
  3. #distributed with this work for additional information
  4. #regarding copyright ownership.  The ASF licenses this file
  5. #to you under the Apache License, Version 2.0 (the
  6. #"License"); you may not use this file except in compliance
  7. #with the License.  You may obtain a copy of the License at
  8. #     http://www.apache.org/licenses/LICENSE-2.0
  9. #Unless required by applicable law or agreed to in writing, software
  10. #distributed under the License is distributed on an "AS IS" BASIS,
  11. #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. #See the License for the specific language governing permissions and
  13. #limitations under the License.
  14. import xmlrpclib, time, random, signal
  15. from hodlib.Common.util import hodInterrupt, HodInterruptException
  16. class hodXRClient(xmlrpclib.ServerProxy):
  17.     def __init__(self, uri, transport=None, encoding=None, verbose=0,
  18.                  allow_none=0, installSignalHandlers=1, retryRequests=True, timeOut=15):
  19.         xmlrpclib.ServerProxy.__init__(self, uri, transport, encoding, verbose, 
  20.                                        allow_none)
  21.         self.__retryRequests = retryRequests
  22.         self.__timeOut = timeOut
  23.         if (installSignalHandlers!=0):
  24.           self.__set_alarm()
  25.     
  26.     def __set_alarm(self):
  27.         def alarm_handler(sigNum, sigHandler):
  28.             raise Exception("XML-RPC socket timeout.")
  29.           
  30.         signal.signal(signal.SIGALRM, alarm_handler)
  31.       
  32.     def __request(self, methodname, params):
  33.         response = None
  34.         retryWaitTime = 5 + random.randint(0, 5)
  35.         for i in range(0, 30):
  36.             signal.alarm(self.__timeOut)
  37.             try:
  38.                 response = self._ServerProxy__request(methodname, params)
  39.                 signal.alarm(0)
  40.                 break
  41.             except Exception:
  42.                 if self.__retryRequests:
  43.                   if hodInterrupt.isSet():
  44.                     raise HodInterruptException()
  45.                   time.sleep(retryWaitTime)
  46.                 else:
  47.                   raise Exception("hodXRClientTimeout")
  48.         return response
  49.                 
  50.     def __getattr__(self, name):
  51.         # magic method dispatcher
  52.         return xmlrpclib._Method(self.__request, name)
  53.