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