Beispiel #1
0
    def run(self):
        # Setup consumers and input deserializers
        mode = pulsar._pulsar.ConsumerType.Exclusive
        if self.atmost_once:
            mode = pulsar._pulsar.ConsumerType.Shared
        subscription_name = str(self.instance_config.function_config.tenant) + "/" + \
                            str(self.instance_config.function_config.namespace) + "/" + \
                            str(self.instance_config.function_config.name)
        for topic, serde in self.instance_config.function_config.customSerdeInputs.items(
        ):
            serde_kclass = util.import_class(os.path.dirname(self.user_code),
                                             serde)
            self.input_serdes[topic] = serde_kclass()
            Log.info("Setting up consumer for topic %s with subname %s" %
                     (topic, subscription_name))
            self.consumers[topic] = self.pulsar_client.subscribe(
                str(topic),
                subscription_name,
                consumer_type=mode,
                message_listener=partial(self.message_listener, topic,
                                         self.input_serdes[topic]))

        for topic in self.instance_config.function_config.inputs:
            global DEFAULT_SERIALIZER
            serde_kclass = util.import_class(os.path.dirname(self.user_code),
                                             DEFAULT_SERIALIZER)
            self.input_serdes[topic] = serde_kclass()
            Log.info("Setting up consumer for topic %s with subname %s" %
                     (topic, subscription_name))
            self.consumers[topic] = self.pulsar_client.subscribe(
                str(topic),
                subscription_name,
                consumer_type=mode,
                message_listener=partial(self.message_listener, topic,
                                         self.input_serdes[topic]))

        function_kclass = util.import_class(
            os.path.dirname(self.user_code),
            self.instance_config.function_config.className)
        if function_kclass is None:
            Log.critical("Could not import User Function Module %s" %
                         self.instance_config.function_config.className)
            raise NameError("Could not import User Function Module %s" %
                            self.instance_config.function_config.className)
        try:
            self.function_class = function_kclass()
        except:
            self.function_purefunction = function_kclass

        self.contextimpl = contextimpl.ContextImpl(self.instance_config, Log,
                                                   self.pulsar_client,
                                                   self.user_code,
                                                   self.consumers)
        # Now launch a thread that does execution
        self.exeuction_thread = threading.Thread(target=self.actual_execution)
        self.exeuction_thread.start()
Beispiel #2
0
    def run(self):
        # Setup consumers and input deserializers
        mode = pulsar._pulsar.ConsumerType.Shared
        if self.instance_config.function_details.source.subscriptionType == Function_pb2.SubscriptionType.Value(
                "FAILOVER"):
            mode = pulsar._pulsar.ConsumerType.Failover

        subscription_name = str(self.instance_config.function_details.tenant) + "/" + \
                            str(self.instance_config.function_details.namespace) + "/" + \
                            str(self.instance_config.function_details.name)
        for topic, serde in self.instance_config.function_details.source.topicsToSerDeClassName.items(
        ):
            if not serde:
                serde_kclass = util.import_class(
                    os.path.dirname(self.user_code), DEFAULT_SERIALIZER)
            else:
                serde_kclass = util.import_class(
                    os.path.dirname(self.user_code), serde)
            self.input_serdes[topic] = serde_kclass()
            Log.info("Setting up consumer for topic %s with subname %s" %
                     (topic, subscription_name))
            self.consumers[topic] = self.pulsar_client.subscribe(
                str(topic),
                subscription_name,
                consumer_type=mode,
                message_listener=partial(self.message_listener, topic,
                                         self.input_serdes[topic]),
                unacked_messages_timeout_ms=int(self.timeout_ms)
                if self.timeout_ms else None)

        function_kclass = util.import_class(
            os.path.dirname(self.user_code),
            self.instance_config.function_details.className)
        if function_kclass is None:
            Log.critical("Could not import User Function Module %s" %
                         self.instance_config.function_details.className)
            raise NameError("Could not import User Function Module %s" %
                            self.instance_config.function_details.className)
        try:
            self.function_class = function_kclass()
        except:
            self.function_purefunction = function_kclass

        self.contextimpl = contextimpl.ContextImpl(self.instance_config, Log,
                                                   self.pulsar_client,
                                                   self.user_code,
                                                   self.consumers)
        # Now launch a thread that does execution
        self.exeuction_thread = threading.Thread(target=self.actual_execution)
        self.exeuction_thread.start()

        # start proccess spawner health check timer
        self.last_health_check_ts = time.time()
        Timer(30, self.process_spawner_health_check_timer).start()
Beispiel #3
0
    def run(self):
        # Setup state
        self.state_context = self.setup_state()

        # Setup consumers and input deserializers
        mode = pulsar._pulsar.ConsumerType.Shared
        if self.instance_config.function_details.source.subscriptionType == Function_pb2.SubscriptionType.Value(
                "FAILOVER"):
            mode = pulsar._pulsar.ConsumerType.Failover

        subscription_name = str(self.instance_config.function_details.tenant) + "/" + \
                            str(self.instance_config.function_details.namespace) + "/" + \
                            str(self.instance_config.function_details.name)

        properties = util.get_properties(
            util.getFullyQualifiedFunctionName(
                self.instance_config.function_details.tenant,
                self.instance_config.function_details.namespace,
                self.instance_config.function_details.name),
            self.instance_config.instance_id)

        for topic, serde in self.instance_config.function_details.source.topicsToSerDeClassName.items(
        ):
            if not serde:
                serde_kclass = util.import_class(
                    os.path.dirname(self.user_code), DEFAULT_SERIALIZER)
            else:
                serde_kclass = util.import_class(
                    os.path.dirname(self.user_code), serde)
            self.input_serdes[topic] = serde_kclass()
            Log.debug("Setting up consumer for topic %s with subname %s" %
                      (topic, subscription_name))

            self.consumers[topic] = self.pulsar_client.subscribe(
                str(topic),
                subscription_name,
                consumer_type=mode,
                message_listener=partial(self.message_listener,
                                         self.input_serdes[topic]),
                unacked_messages_timeout_ms=int(self.timeout_ms)
                if self.timeout_ms else None,
                properties=properties)

        for topic, consumer_conf in self.instance_config.function_details.source.inputSpecs.items(
        ):
            if not consumer_conf.serdeClassName:
                serde_kclass = util.import_class(
                    os.path.dirname(self.user_code), DEFAULT_SERIALIZER)
            else:
                serde_kclass = util.import_class(
                    os.path.dirname(self.user_code),
                    consumer_conf.serdeClassName)
            self.input_serdes[topic] = serde_kclass()
            Log.debug("Setting up consumer for topic %s with subname %s" %
                      (topic, subscription_name))

            consumer_args = {
                "consumer_type":
                mode,
                "message_listener":
                partial(self.message_listener, self.input_serdes[topic]),
                "unacked_messages_timeout_ms":
                int(self.timeout_ms) if self.timeout_ms else None,
                "properties":
                properties
            }
            if consumer_conf.HasField("receiverQueueSize"):
                consumer_args[
                    "receiver_queue_size"] = consumer_conf.receiverQueueSize.value

            if consumer_conf.isRegexPattern:
                self.consumers[topic] = self.pulsar_client.subscribe(
                    re.compile(str(topic)), subscription_name, **consumer_args)
            else:
                self.consumers[topic] = self.pulsar_client.subscribe(
                    str(topic), subscription_name, **consumer_args)

        function_kclass = util.import_class(
            os.path.dirname(self.user_code),
            self.instance_config.function_details.className)
        if function_kclass is None:
            Log.critical("Could not import User Function Module %s" %
                         self.instance_config.function_details.className)
            raise NameError("Could not import User Function Module %s" %
                            self.instance_config.function_details.className)
        try:
            self.function_class = function_kclass()
        except:
            self.function_purefunction = function_kclass

        self.contextimpl = contextimpl.ContextImpl(
            self.instance_config, Log, self.pulsar_client, self.user_code,
            self.consumers, self.secrets_provider, self.metrics_labels,
            self.state_context, self.stats)
        # Now launch a thread that does execution
        self.execution_thread = threading.Thread(target=self.actual_execution)
        self.execution_thread.start()

        # start proccess spawner health check timer
        self.last_health_check_ts = time.time()
        if self.expected_healthcheck_interval > 0:
            timer = util.FixedTimer(self.expected_healthcheck_interval,
                                    self.process_spawner_health_check_timer,
                                    name="health-check-timer")
            timer.start()