Windows XMLRPC Service
half.italian at gmail.com
half.italian at gmail.com
Wed Jun 20 03:15:40 EDT 2007
On Jun 19, 12:32 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Tue, 19 Jun 2007 14:57:10 -0300, <half.ital... at gmail.com> escribió:
>
> >> > #win32event.WAIT_TIMEOUT = 2 --- This just makes the loop
> >> > never execute because
> >> > # the WaitFor... part always returns 258
>
> >> WAIT_TIMEOUT is 258. How do you see it is 2?
> >> py> import win32event
> >> py> win32event.WAIT_TIMEOUT
> >> 258
>
> > I meant here that *if* I set the WAIT_TIMEOUT to 2, then I see that
> > behavior.
>
> Ah, ok! I should have stated clearly that WAIT_TIMEOUT is a Windows
> predefined constant, not your desired timeout value.
>
> > Thank you again Gabriel. I'll post back with something complete.
>
> Yes, please, a working example would be nice for future readers...
>
> --
> Gabriel Genellina
For posterity...
import sys
import win32serviceutil
import win32service
import win32event
import win32evtlogutil
import servicemanager
import SocketServer, socket
from SimpleXMLRPCServer import
SimpleXMLRPCServer,SimpleXMLRPCRequestHandler
# Threaded mix-in
class
AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer):
pass
import XMLRPC_funcs # module containing the functions wrapped in a
class
class XMLRPCservice(win32serviceutil.ServiceFramework):
_svc_name_ = "PythonXMLRPC"
_svc_display_name_ = "PythonXMLRPC"
_svc_description_ = "Multi-threaded Python XMLRPC Server"
def __init__(self, args):
# set the timeout so the service can stop...Otherwise it hangs
forever
socket.setdefaulttimeout(15)
win32evtlogutil.AddSourceToRegistry(self._svc_display_name_,
sys.executable, "Application")
win32serviceutil.ServiceFramework.__init__(self, args)
# Create an event which we will use to wait on.
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
localhost = socket.gethostbyname(socket.gethostname())
self.server = AsyncXMLRPCServer((localhost, 8000),
SimpleXMLRPCRequestHandler)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
#send the stop event
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
# log a start msg
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ' (%s)' %
self._svc_name_))
self.server.register_instance(XMLRPC_funcs.XMLRPC_funcs())
# handle requests until the stop event is received
while win32event.WaitForSingleObject(self.hWaitStop, 0) ==
win32event.WAIT_TIMEOUT:
self.server.handle_request()
# log a stopped msg
win32evtlogutil.ReportEvent(self._svc_name_,
servicemanager.PYS_SERVICE_STOPPED,
0,
servicemanager.EVENTLOG_INFORMATION_TYPE,
(self._svc_name_,""))
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(XMLRPCservice)
More information about the Python-list
mailing list