コード例 #1
0
    def run(self):

        if self.is_forwarder:
            spawn_greenlet(Forwarder, self.name, self.pid)
        else:
            self.publisher = Publisher(self.name, self.pid)
            self.subscriber = Subscriber(self.on_message_callback, self.name, self.pid)
            spawn_greenlet(self.subscriber.serve_forever)
コード例 #2
0
ファイル: api.py プロジェクト: xulong2005/zato
class IPCAPI(object):
    """ API through which IPC is performed.
    """
    def __init__(self,
                 is_forwarder,
                 name=None,
                 on_message_callback=None,
                 pid=None):
        self.is_forwarder = is_forwarder
        self.name = name
        self.on_message_callback = on_message_callback
        self.pid = pid

    def run(self):

        if self.is_forwarder:
            spawn_greenlet(Forwarder, self.name, self.pid)
        else:
            self.publisher = Publisher(self.name, self.pid)
            self.subscriber = Subscriber(self.on_message_callback, self.name,
                                         self.pid)
            spawn_greenlet(self.subscriber.serve_forever)

    def publish(self, payload):
        self.publisher.publish(payload)

    def _get_response(self,
                      fifo,
                      buffer_size,
                      fifo_ignore_err=fifo_ignore_err,
                      empty=('', None)):

        try:
            buff = StringIO()
            data = object(
            )  # Just a sentinel because '' or None are expected from os.read

            while data not in empty:
                data = os.read(fifo, 1)
                buff.write(data)

            response = buff.getvalue()

            status = response[:IPC.STATUS.LENGTH]
            response = response[IPC.STATUS.LENGTH +
                                1:]  # Add 1 to account for the separator
            is_success = status == IPC.STATUS.SUCCESS

            if is_success:
                response = loads(response) if response else ''

            buff.close()

            return is_success, response

        except OSError, e:
            if e.errno not in fifo_ignore_err:
                raise
コード例 #3
0
ファイル: api.py プロジェクト: danlg/zato
    def _get_pid_publisher(self, cluster_name, server_name, target_pid):

        # We do no have a publisher connected to that PID, so we need to create it ..
        if target_pid not in self.pid_publishers:

            # Create a publisher and sleep for a moment until it connects to the other socket
            publisher = Publisher(self.get_endpoint_name(cluster_name, server_name, target_pid), self.pid)

            # We can tolerate it because it happens only the very first time our PID invokes target_pid
            sleep(0.1)

            # We can now store it for later use
            self.pid_publishers[target_pid] = publisher

        # At this point we are sure we have a publisher for target PID
        return self.pid_publishers[target_pid]