如何在 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。你只需要使用它们!
【讨论】:
字段messageId
和publishTime
的值为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'”错误消息