def __init__(self, moduleName, centralHost=PUBLISHER_OPT_DEFAULTS['centralHost'], context=None, centralSubscribeEndpoint=PUBLISHER_OPT_DEFAULTS['centralSubscribeEndpoint'], publishEndpoint=PUBLISHER_OPT_DEFAULTS['publishEndpoint'], heartbeatPeriodMsecs=PUBLISHER_OPT_DEFAULTS['heartbeatPeriodMsecs'], # highWaterMark=PUBLISHER_OPT_DEFAULTS['highWaterMark'] ): self.moduleName = moduleName self.centralHost = centralHost if context is None: context = zmq.Context.instance() self.context = context self.centralSubscribeEndpoint = parseEndpoint(centralSubscribeEndpoint, defaultPort=DEFAULT_CENTRAL_SUBSCRIBE_PORT, centralHost=self.centralHost) self.publishEndpoint = parseEndpoint(publishEndpoint, defaultPort='random') self.heartbeatPeriodMsecs = heartbeatPeriodMsecs #self.highWaterMark = highWaterMark self.pubStream = None self.heartbeatTimer = None self.serializer = serializers.get_serializer('json')()
def __init__( self, moduleName, centralHost=PUBLISHER_OPT_DEFAULTS['centralHost'], context=None, centralSubscribeEndpoint=PUBLISHER_OPT_DEFAULTS[ 'centralSubscribeEndpoint'], publishEndpoint=PUBLISHER_OPT_DEFAULTS['publishEndpoint'], heartbeatPeriodMsecs=PUBLISHER_OPT_DEFAULTS['heartbeatPeriodMsecs'], # highWaterMark=PUBLISHER_OPT_DEFAULTS['highWaterMark'] ): self.moduleName = moduleName self.centralHost = centralHost if context is None: context = zmq.Context.instance() self.context = context self.centralSubscribeEndpoint = parseEndpoint( centralSubscribeEndpoint, defaultPort=DEFAULT_CENTRAL_SUBSCRIBE_PORT, centralHost=self.centralHost) self.publishEndpoint = parseEndpoint(publishEndpoint, defaultPort='random') self.heartbeatPeriodMsecs = heartbeatPeriodMsecs #self.highWaterMark = highWaterMark self.pubStream = None self.heartbeatTimer = None self.serializer = serializers.get_serializer('json')()
def __init__(self, moduleName, centralHost=SUBSCRIBER_OPT_DEFAULTS['centralHost'], context=None, centralPublishEndpoint=SUBSCRIBER_OPT_DEFAULTS[ 'centralPublishEndpoint'], replay=None): self.moduleName = moduleName self.centralHost = centralHost if context is None: context = zmq.Context.instance() self.context = context self.centralPublishEndpoint = parseEndpoint( centralPublishEndpoint, defaultPort=DEFAULT_CENTRAL_PUBLISH_PORT, centralHost=self.centralHost) self.replayPaths = replay if self.replayPaths is None: self.replayPaths = [] self.handlers = {} self.counter = 0 self.deserializer = serializers.get_deserializer('json') self.stream = None
def __init__(self, moduleName, centralHost=SUBSCRIBER_OPT_DEFAULTS['centralHost'], context=None, centralPublishEndpoint=SUBSCRIBER_OPT_DEFAULTS['centralPublishEndpoint'], replay=None): self.moduleName = moduleName self.centralHost = centralHost if context is None: context = zmq.Context.instance() self.context = context self.centralPublishEndpoint = parseEndpoint(centralPublishEndpoint, defaultPort=DEFAULT_CENTRAL_PUBLISH_PORT, centralHost=self.centralHost) self.replayPaths = replay if self.replayPaths is None: self.replayPaths = [] self.handlers = {} self.counter = 0 self.deserializer = serializers.get_deserializer('json') self.stream = None
def start(self): # respect --bindInterface argument self.opts.rpcEndpoint = self.opts.rpcEndpoint.format( bindInterface=self.opts.bindInterface) self.opts.publishEndpoint = self.opts.publishEndpoint.format( bindInterface=self.opts.bindInterface) self.opts.subscribeEndpoint = self.opts.subscribeEndpoint.format( bindInterface=self.opts.bindInterface) # open log files now = datetime.datetime.utcnow() self.logDir = os.path.abspath(self.opts.logDir) if self.opts.messageLog != 'none': self.messageLogPath = self.readyLog(self.opts.messageLog, now) self.messageLog = open(self.messageLogPath, 'a') if self.opts.consoleLog != 'none': self.consoleLogPath = self.readyLog(self.opts.consoleLog, now) rootLogger = logging.getLogger() rootLogger.setLevel(logging.DEBUG) fmt = logging.Formatter('%(asctime)s - %(levelname)-7s - %(message)s') fmt.converter = time.gmtime if self.opts.consoleLog != 'none': fh = logging.FileHandler(self.consoleLogPath) fh.setFormatter(fmt) fh.setLevel(logging.DEBUG) rootLogger.addHandler(fh) if self.opts.foreground: ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(fmt) rootLogger.addHandler(ch) # daemonize if self.opts.foreground: logging.info('staying in foreground') else: logging.info('daemonizing') pid = os.fork() if pid != 0: os._exit(0) os.setsid() pid = os.fork() if pid != 0: os._exit(0) os.chdir('/') os.close(1) os.close(2) nullFd = os.open('/dev/null', os.O_RDWR) os.dup2(nullFd, 1) os.dup2(nullFd, 2) try: # set up zmq self.context = zmq.Context.instance() self.rpcStream = ZMQStream(self.context.socket(zmq.REP)) self.rpcStream.bind(self.opts.rpcEndpoint) logging.info('bound rpcEndpoint %s', self.opts.rpcEndpoint) self.rpcStream.on_recv(self.handleRpcCall) self.forwarder = ThreadDevice(zmq.FORWARDER, zmq.SUB, zmq.PUB) self.forwarder.setsockopt_in(zmq.IDENTITY, THIS_MODULE) self.forwarder.setsockopt_out(zmq.IDENTITY, THIS_MODULE) self.forwarder.setsockopt_in(zmq.SUBSCRIBE, '') # self.forwarder.setsockopt_out(zmq.HWM, self.opts.highWaterMark) self.forwarder.bind_in(self.opts.subscribeEndpoint) logging.info('bound subscribeEndpoint %s', self.opts.subscribeEndpoint) self.forwarder.bind_in(INJECT_ENDPOINT) self.forwarder.bind_out(self.opts.publishEndpoint) logging.info('bound publishEndpoint %s', self.opts.publishEndpoint) self.forwarder.bind_out(MONITOR_ENDPOINT) for entry in self.opts.subscribeTo: try: moduleName, endpoint = entry.split('@') endpoint = parseEndpoint(endpoint) except ValueError: raise ValueError( '--subscribeTo argument "%s" is not in the format "<moduleName>@<endpoint>"' % entry) self.forwarder.connect_in(endpoint) self.info[moduleName] = {'module': moduleName, 'pub': endpoint} self.forwarder.start() time.sleep(0.1) # wait for forwarder to bind sockets self.monStream = ZMQStream(self.context.socket(zmq.SUB)) self.monStream.setsockopt(zmq.SUBSCRIBE, '') self.monStream.connect(MONITOR_ENDPOINT) self.monStream.on_recv(self.handleMessages) self.injectStream = ZMQStream(self.context.socket(zmq.PUB)) self.injectStream.connect(INJECT_ENDPOINT) self.disconnectTimer = ioloop.PeriodicCallback( self.handleDisconnectTimer, 5000) self.disconnectTimer.start() except: # pylint: disable=W0702 errClass, errObject, errTB = sys.exc_info()[:3] errText = '%s.%s: %s' % (errClass.__module__, errClass.__name__, str(errObject)) logging.error(''.join(traceback.format_tb(errTB))) logging.error(errText) logging.error('[error during startup -- exiting]') sys.exit(1)
def start(self): # respect --bindInterface argument self.opts.rpcEndpoint = self.opts.rpcEndpoint.format(bindInterface=self.opts.bindInterface) self.opts.publishEndpoint = self.opts.publishEndpoint.format(bindInterface=self.opts.bindInterface) self.opts.subscribeEndpoint = self.opts.subscribeEndpoint.format(bindInterface=self.opts.bindInterface) # open log files now = datetime.datetime.now(pytz.utc) self.logDir = os.path.abspath(self.opts.logDir) if self.opts.messageLog != 'none': self.messageLogPath = self.readyLog(self.opts.messageLog, now) self.messageLog = open(self.messageLogPath, 'a') if self.opts.consoleLog != 'none': self.consoleLogPath = self.readyLog(self.opts.consoleLog, now) rootLogger = logging.getLogger() rootLogger.setLevel(logging.DEBUG) fmt = logging.Formatter('%(asctime)s - %(levelname)-7s - %(message)s') fmt.converter = time.gmtime if self.opts.consoleLog != 'none': fh = logging.FileHandler(self.consoleLogPath) fh.setFormatter(fmt) fh.setLevel(logging.DEBUG) rootLogger.addHandler(fh) if self.opts.foreground: ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(fmt) rootLogger.addHandler(ch) # daemonize if self.opts.foreground: logging.info('staying in foreground') else: logging.info('daemonizing') pid = os.fork() if pid != 0: os._exit(0) os.setsid() pid = os.fork() if pid != 0: os._exit(0) os.chdir('/') os.close(1) os.close(2) nullFd = os.open('/dev/null', os.O_RDWR) os.dup2(nullFd, 1) os.dup2(nullFd, 2) try: # set up zmq self.context = zmq.Context.instance() self.rpcStream = ZMQStream(self.context.socket(zmq.REP)) self.rpcStream.bind(self.opts.rpcEndpoint) logging.info('bound rpcEndpoint %s', self.opts.rpcEndpoint) self.rpcStream.on_recv(self.handleRpcCall) self.forwarder = ThreadDevice(zmq.FORWARDER, zmq.SUB, zmq.PUB) self.forwarder.setsockopt_in(zmq.IDENTITY, THIS_MODULE) self.forwarder.setsockopt_out(zmq.IDENTITY, THIS_MODULE) self.forwarder.setsockopt_in(zmq.SUBSCRIBE, '') # self.forwarder.setsockopt_out(zmq.HWM, self.opts.highWaterMark) self.forwarder.bind_in(self.opts.subscribeEndpoint) logging.info('bound subscribeEndpoint %s', self.opts.subscribeEndpoint) self.forwarder.bind_in(INJECT_ENDPOINT) self.forwarder.bind_out(self.opts.publishEndpoint) logging.info('bound publishEndpoint %s', self.opts.publishEndpoint) self.forwarder.bind_out(MONITOR_ENDPOINT) for entry in self.opts.subscribeTo: try: moduleName, endpoint = entry.split('@') endpoint = parseEndpoint(endpoint) except ValueError: raise ValueError('--subscribeTo argument "%s" is not in the format "<moduleName>@<endpoint>"' % entry) self.forwarder.connect_in(endpoint) self.info[moduleName] = {'module': moduleName, 'pub': endpoint} self.forwarder.start() time.sleep(0.1) # wait for forwarder to bind sockets self.monStream = ZMQStream(self.context.socket(zmq.SUB)) self.monStream.setsockopt(zmq.SUBSCRIBE, '') self.monStream.connect(MONITOR_ENDPOINT) self.monStream.on_recv(self.handleMessages) self.injectStream = ZMQStream(self.context.socket(zmq.PUB)) self.injectStream.connect(INJECT_ENDPOINT) self.disconnectTimer = ioloop.PeriodicCallback(self.handleDisconnectTimer, 5000) self.disconnectTimer.start() except: # pylint: disable=W0702 errClass, errObject, errTB = sys.exc_info()[:3] errText = '%s.%s: %s' % (errClass.__module__, errClass.__name__, str(errObject)) logging.error(''.join(traceback.format_tb(errTB))) logging.error(errText) logging.error('[error during startup -- exiting]') sys.exit(1)