Beispiel #1
0
 def received_function(cls, message):
     """
     Pub/Subメッセージで指定されたClassを実行する
     :param message: subscribeしたメッセージ
     """
     if 'target' in message.attributes:
         # メッセージAttributeの['target']で指定されたmoduleをimportし、mainメソッドを実行
         target_module_path = 'pubsub_controller.subscriber.pull.exec_classes.{}'.format(
             message.attributes['target'])
         log('Exec : {}'.format(target_module_path))
         try:
             target = importlib.import_module(target_module_path)
         except ImportError:
             error_log('Module "{}" not found.'.format(target_module_path))
             raise
         except Exception as e:
             error_log('Exec "{}". error : {}'.format(
                 target_module_path, e))
             raise
         else:
             if hasattr(target, 'main'):
                 target.main(message.data, message.attributes)
             else:
                 error_log('Module {} has not main method.'.format(
                     target_module_path))
     else:
         log('Require target module name.')
def main(message_data, message_attr):
    """
    Exec Sample
    Require define "main(message_data, message_attr)" method
    """
    log(message_data)
    if 'text' in message_attr:
        log(message_attr['text'])
Beispiel #3
0
 def signal_handler(signum, stack):
     """
     受け取ったSIGNALに応じて終了処理をハンドリングする。
     :param signum: default
     :param stack: default
     """
     sync_stop_subscriber(end=True)
     log('Stop Pull Subscriber. signal by {}'.format(signum))
     exit(0)
def publish(topic_name, message_data, **kwargs):
    """受け取った値を元にPub/SubメッセージをPublishする

    :param topic_name: Publish target Topic 
    :param message_data: Publish message data
    :param kwargs: (optional)Publish message attr
    """
    publisher = pubsub_v1.PublisherClient()
    topic_path = publisher.topic_path(GCP_PROJECT_ID, topic_name)
    log('Publishing for message on {}'.format(topic_name))

    data = _encode_byteString(message_data)
    publisher.publish(topic_path, data=data, **kwargs)

    log('Published message.')
Beispiel #5
0
def main():
    """
    常駐プロセスとして起動する。
    指定されたSubscriberをThreadとして起動する。 
    """
    log('Start Pull Subscriber.')

    def signal_handler(signum, stack):
        """
        受け取ったSIGNALに応じて終了処理をハンドリングする。
        :param signum: default
        :param stack: default
        """
        sync_stop_subscriber(end=True)
        log('Stop Pull Subscriber. signal by {}'.format(signum))
        exit(0)

    # SIGNALに応じたハンドリング
    signal.signal(signal.SIGTERM, signal_handler)
    signal.signal(signal.SIGINT, signal_handler)
    threads = []

    try:
        threads.append(subscribe_multi)

        for thread in threads:
            t = threading.Thread(target=thread)
            t.start()

        # 定期的にSubscriberClose -> Openを繰り返す
        while True:
            time.sleep(POLLING_TIME)
            sync_stop_subscriber()

    except Exception as e:
        error_log('Error Pull Subscriber. ... {}'.format(e))
        exit(1)
def main(message_data, message_attr):
    """
    "gunicorn restart"コマンドを発行する。
    :param message_data: メッセージ本文
    :param message_attr: メッセージAttribute
    """

    log('Restarting Gunicorn at Supervisor.')
    # Gunicorn Restart Command
    restart_command = 'supervisorctl restart gunicorn'
    try:
        log('start subprocess. command = {}'.format(restart_command))
        stdout = subprocess.check_output(restart_command, shell=True)
        log('subprocess output = {}'.format(stdout))
        log('subprocess finished.')
    except subprocess.CalledProcessError as process_error:
        error_log('subprocess error. cmd = {}'.format(process_error.cmd))
        error_log('subprocess error. returncode = {}'.format(
            process_error.returncode))
        error_log('subprocess error. output = {}'.format(process_error.output))
        raise
    except Exception as e:
        error_log('subprocess error : {}'.format(e))
        raise
Beispiel #7
0
    def pull(cls, subscription_name):
        """
        Pullリクエストを行い、メッセージをSubscribeする。
        callbackメソッドにてメッセージの正常応答と、メッセージに対応した処理を行う。
        :param subscription_name: "projects/"から始まるSubscription名称
        """

        while not cls.end:
            # SubscriberClientを作成
            subscriber = pubsub_v1.SubscriberClient()

            # MessageをPull出来たら実行されるCallBack
            def callback(message):
                log('Received message: {}'.format(message))
                message.ack()
                # メッセージ受信後処理をCall
                cls.received_function(message)

            # Subscriber
            flow_control = pubsub_v1.types.FlowControl()
            cls.subscription = subscriber.subscribe(subscription_name,
                                                    flow_control=flow_control)
            # Open the subscription, passing the callback.
            future = cls.subscription.open(callback)

            log('Listening for messages on {}'.format(subscription_name))

            try:
                # Publisherのメッセージを待ち受ける(ブロッキングされる)
                future.result()
                log('Closed for messages on {}'.format(subscription_name))
            except KeyboardInterrupt:
                log('Stopped Subscribe on {}'.format(subscription_name))
                cls.subscription.close()
            except Exception as e:
                error_log('subscription error. detail = {}'.format(e))
                cls.subscription.close()
Beispiel #8
0
 def callback(message):
     log('Received message: {}'.format(message))
     message.ack()
     # メッセージ受信後処理をCall
     cls.received_function(message)