如何在 Google Cloud Function 上的 Spring Cloud 函数中获取 Pub/Sub 事件的元数据

Posted

技术标签:

【中文标题】如何在 Google Cloud Function 上的 Spring Cloud 函数中获取 Pub/Sub 事件的元数据【英文标题】:How to get the metadata of Pub/Sub event in Spring Cloud function on Google Cloud Function 【发布时间】:2021-07-24 17:23:54 【问题描述】:

我使用 Spring Cloud Function 库创建了一个简单的 Google Cloud Function,以便在 Pub/Sub 消息到达时触发。我跟着样本function-sample-gcp-background。每当一条消息被触发到 Pub/Sub 时,它都会按预期从 Cloud Function 中打印出来。

但我想知道如何在 Cloud Functon 中获取 Pub/Sub 消息的元数据。 Google Cloud Function documentation 这么说

此元数据可通过传递给的上下文对象访问 你的函数被调用时。

如何在 Spring Cloud Function 应用程序中访问此元数据(或上下文对象)?

更新:- 版本spring-cloud-function-adapter-gcp:3.1.2

更新 2:- 我在 github 中提出了一个问题并得到了解决。感谢 Spring Cloud Function 团队。

【问题讨论】:

您需要哪些元数据? 我需要的元数据是消息发布时间和消息ID。 【参考方案1】:

当您使用后台功能时,PubSub 消息和上下文被提取并在 PubSub 消息中提供。如果您查看 PubSub 对象here;您已在其中嵌入了发布时间和消息 ID。你只需要使用它们!

【讨论】:

字段messageIdpublishTime的值为null。但我可以看到attributes 字段中出现了其他自定义属性。【参考方案2】:

根据 spring-cloud-function 团队的建议解决了问题。 Consumer函数需要接受Message<PubSubMessage>类型的参数而不是PubSubMessage才能得到Context对象。

    @Bean
    public Consumer<Message<PubSubMessage>> pubSubFunction() 
        return message -> 
            // The PubSubMessage data field arrives as a base-64 encoded string and must be decoded.
            // See: https://cloud.google.com/functions/docs/calling/pubsub#event_structure

            PubSubMessage payload = message.getPayload();
            String decodedMessage = new String(
                    Base64.getDecoder().decode(message.getPayload().getData()), StandardCharsets.UTF_8);
            System.out.println("Hello!!! Received Pub/Sub message with data: " + decodedMessage);

                        // Print out timestamp and event id
            Context ctx = message.getHeaders().get("gcf_context", Context.class);
            System.out.println(ctx.eventId());
            System.out.println(ctx.timestamp());
        ;
    

参考:- github issue #695

【讨论】:

以上是关于如何在 Google Cloud Function 上的 Spring Cloud 函数中获取 Pub/Sub 事件的元数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中运行 Google Cloud Function 中的子进程

如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期

如何从 Firebase Cloud Function 在 Google Pub/Sub 中发布消息?

如何解决 Google Cloud Function 上的“No module named 'frontend'”错误消息

如何从Google Cloud Function(Cheerio,Node.js)发出多个http请求

在 Google Cloud Function 中设置环境变量