Example #1
0
    def __init__(self, url):
        self._url = url
        self._send_queue = Queue.Queue()
        self._recv_queue = Queue.Queue()

        self._futures = FutureCollection()

        self._channel = None
        self._stub = None
        self._handle = None

        def send_generator():
            disconnect = False
            while not disconnect:
                message = None
                while message is None and not disconnect:
                    try:
                        message = self._send_queue.get(True, 1)
                        if message.message_type == 'system/disconnect':
                            disconnect = True
                    except Queue.Empty:
                        message = None

                yield validator_pb2.MessageList(messages=[message])

                if disconnect:
                    break

        self._send_generator = send_generator()
Example #2
0
 def __init__(self, url):
     self._url = url
     self._futures = FutureCollection()
     self._event = Event()
     self._event.set()
     self._send_recieve_thread = _SendReceiveThread(url,
                                                    futures=self._futures,
                                                    ready_event=self._event)
     self._send_recieve_thread.daemon = True
     self._send_recieve_thread.start()
Example #3
0
class Stream(object):
    def __init__(self, url):
        self._url = url
        self._futures = FutureCollection()
        self._send_recieve_thread = _SendReceiveThread(url, self._futures)
        self._send_recieve_thread.daemon = True
        self._send_recieve_thread.start()

    def send(self, message_type, content):
        message = validator_pb2.Message(
            message_type=message_type,
            correlation_id=_generate_id(),
            content=content)
        future = Future(message.correlation_id)
        self._futures.put(future)

        self._send_recieve_thread.put_message(message)
        return future

    def send_back(self, message_type, correlation_id, content):
        """
        Return a response to a message.
        :param message_type: validator_pb2.Message.MessageType enum value
        :param correlation_id: a random str internal to the validator
        :param content: protobuf bytes
        """
        message = validator_pb2.Message(
            message_type=message_type,
            correlation_id=correlation_id,
            content=content)
        self._send_recieve_thread.put_message(message)

    def receive(self):
        """
        Used for receiving messages that are not responses

        """
        return self._send_recieve_thread.get_message()

    def close(self):
        self._send_recieve_thread.shutdown()
Example #4
0
class Stream(object):
    def __init__(self, url):
        self._url = url
        self._futures = FutureCollection()
        self._send_recieve_thread = _SendReceiveThread(url, self._futures)
        self._send_recieve_thread.daemon = True
        self._send_recieve_thread.start()

    def send(self, message_type, content):
        message = validator_pb2.Message(message_type=message_type,
                                        correlation_id=_generate_id(),
                                        content=content)
        future = Future(message.correlation_id)
        self._futures.put(future)

        self._send_recieve_thread.put_message(message)
        return future

    def send_back(self, message_type, correlation_id, content):
        """
        Return a response to a message.
        :param message_type: one of the strs on MessageType
        :param correlation_id: a random str internal to the validator
        :param content: protobuf bytes
        """
        message = validator_pb2.Message(message_type=message_type,
                                        correlation_id=correlation_id,
                                        content=content)
        self._send_recieve_thread.put_message(message)

    def receive(self):
        """
        Used for receiving messages that are not responses

        """
        return self._send_recieve_thread.get_message()

    def close(self):
        self._send_recieve_thread.shutdown()
Example #5
0
 def __init__(self, url):
     self._url = url
     self._futures = FutureCollection()
     self._send_recieve_thread = _SendReceiveThread(url, self._futures)
     self._send_recieve_thread.daemon = True
     self._send_recieve_thread.start()
Example #6
0
class Stream(object):
    def __init__(self, url):
        self._url = url
        self._futures = FutureCollection()
        self._event = Event()
        self._event.set()
        self._send_recieve_thread = _SendReceiveThread(url,
                                                       futures=self._futures,
                                                       ready_event=self._event)
        self._send_recieve_thread.daemon = True
        self._send_recieve_thread.start()

    @property
    def url(self):
        """ Get the url of the Stream object.
        """
        return self._url

    def send(self, message_type, content):
        """Send a message to the validator

        :param: message_type(validator_pb2.Message.MessageType)
        :param: content(bytes)
        :return: (future.Future)
        :raises: (ValidatorConnectionError)
        """

        if not self._event.is_set():
            raise ValidatorConnectionError()
        message = validator_pb2.Message(message_type=message_type,
                                        correlation_id=_generate_id(),
                                        content=content)
        future = Future(message.correlation_id)
        self._futures.put(future)

        self._send_recieve_thread.put_message(message)
        return future

    def send_back(self, message_type, correlation_id, content):
        """
        Return a response to a message.
        :param message_type: validator_pb2.Message.MessageType enum value
        :param correlation_id: a random str internal to the validator
        :param content: protobuf bytes
        :raises (ValidatorConnectionError):
        """
        if not self._event.is_set():
            raise ValidatorConnectionError()
        message = validator_pb2.Message(message_type=message_type,
                                        correlation_id=correlation_id,
                                        content=content)
        self._send_recieve_thread.put_message(message)

    def receive(self):
        """
        Receive messages that are not responses
        :return: concurrent.futures.Future
        """
        return self._send_recieve_thread.get_message()

    def wait_for_ready(self):
        """Blocks until the background thread has recovered
        from a disconnect with the validator.
        """
        self._event.wait()

    def is_ready(self):
        """Whether the background thread has recovered from
        a disconnect with the validator

        :return: (bool) whether the background thread is ready
        """
        return self._event.is_set()

    def close(self):
        self._send_recieve_thread.shutdown()
Example #7
0
 def __init__(self, url):
     self._url = url
     self._futures = FutureCollection()
     self._send_recieve_thread = _SendReceiveThread(url, self._futures)
     self._send_recieve_thread.daemon = True
     self._send_recieve_thread.start()
Example #8
0
class Stream(object):
    def __init__(self, url):
        self._url = url
        self._send_queue = Queue.Queue()
        self._recv_queue = Queue.Queue()

        self._futures = FutureCollection()

        self._channel = None
        self._stub = None
        self._handle = None

        def send_generator():
            disconnect = False
            while not disconnect:
                message = None
                while message is None and not disconnect:
                    try:
                        message = self._send_queue.get(True, 1)
                        if message.message_type == 'system/disconnect':
                            disconnect = True
                    except Queue.Empty:
                        message = None

                yield validator_pb2.MessageList(messages=[message])

                if disconnect:
                    break

        self._send_generator = send_generator()

    def connect(self):
        self._channel = grpc.insecure_channel(self._url)
        self._stub = validator_pb2.ValidatorStub(self._channel)
        self._handle = self._stub.Connect(self._send_generator)

        def done_callback(call):
            if call.code() != grpc.StatusCode.OK:
                print "ERROR: Connect() failed with status code: {}: {}".\
                    format(str(call.code()), call.details())

        self._handle.add_done_callback(done_callback)

        recv_thread = RecvThread(self._handle, self._futures, self._recv_queue)
        recv_thread.start()

    def send(self, message_type, content):
        message = validator_pb2.Message(message_type=message_type,
                                        correlation_id=_generate_id(),
                                        content=content)

        future = Future(message.correlation_id)
        self._futures.put(future)

        self._send_queue.put(message)

        return future

    def send_back(self, message_type, correlation_id, content):
        message = validator_pb2.Message(message_type=message_type,
                                        correlation_id=correlation_id,
                                        content=content)
        self._send_queue.put(message)

    def receive(self):
        return self._recv_queue.get()

    def close(self):
        message = validator_pb2.Message(message_type='system/disconnect',
                                        correlation_id=_generate_id(),
                                        content='')
        self._send_queue.put(message)

        while not self._handle.done():
            time.sleep(1)