class MyServer():

    SUCCESS = 123
    REPLY_PORT = 4010
    RUNNING_MESSAGE = 'imrunning'
    TIME_TO_EXECUTE = 2

    def __init__(self, timeModule=time):
        logging.basicConfig(level=logging.DEBUG,
                            format='%(asctime)s %(message)s')
        self._zmq = ZmqRemoteProcedureCall()
        self._replySocket = self._zmq.replySocket(self.REPLY_PORT)
        self._timeMod = timeModule
        self._isTerminated = False
        self._logger = Logger.of('MyServer')
        self.loop()

    def loop(self):
        self._logger.notice("%s" % self.RUNNING_MESSAGE)
        while not self._isTerminated:
            self._logger.notice('looping')
            self._zmq.handleRequest(self, self._replySocket, multi=False)
            self._timeMod.sleep(0.1)
        self._logger.notice("Terminating")

    def returnSuccessAfter2Seconds(self):
        self._logger.notice('invoked returnSuccessAfter2Seconds')
        self._timeMod.sleep(self.TIME_TO_EXECUTE)
        return self.SUCCESS

    def raiseAnException(self):
        self._logger.notice('invoked raiseAnException')
        raise MyException('wanted Exception')

    def getSomethingWithALogger(self, value):
        return HasALogger(value)

    @staticmethod
    def startUpServer():
        MyServer()

    @staticmethod
    def commandToSpawn():
        cmd= 'python -c "from %s import MyServer; '\
             'MyServer.startUpServer()"' % MyServer.__module__
        return cmd
class MyPublisher():
    REPLY_PORT = 4011
    PUBLISHER_PORT = 4012
    RUNNING_MESSAGE = 'imrunning'
    CYCLE_PERIOD = 0.01

    def __init__(self, timeModule=time):
        logging.basicConfig(level=logging.DEBUG,
                            format='%(asctime)s %(message)s')
        self._zmq = ZmqRemoteProcedureCall()
        self._replySocket = self._zmq.replySocket(self.REPLY_PORT)
        self._publisherSocket = self._zmq.publisherSocket(self.PUBLISHER_PORT)
        self._counter = 0
        self._timeMod = timeModule
        self._isTerminated = False
        self._logger = Logger.of('MyPublisher')
        self.loop()

    def loop(self):
        self._logger.notice("%s" % self.RUNNING_MESSAGE)
        while not self._isTerminated:
            self._logger.notice('looping counter %d' % self._counter)
            self._zmq.handleRequest(self, self._replySocket, multi=False)
            anObject = MyObject(self._counter)
            self._zmq.publishPickable(self._publisherSocket, anObject)
            self._counter += 1
            self._timeMod.sleep(self.CYCLE_PERIOD)
        self._logger.notice("Terminating")

    def getLastCounter(self):
        return self._counter

    @staticmethod
    def startUp():
        MyPublisher()

    @staticmethod
    def commandToSpawn():
        cmd= 'python -c "from %s import MyPublisher; '\
             'MyPublisher.startUp()"' % MyServer.__module__
        return cmd