微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

云函数不捕获发布订阅消息,即使它被触发

如何解决云函数不捕获发布订阅消息,即使它被触发

在我的代码中,我有 2 个云函数cf1cf2cf1 每 10 分钟通过发布订阅主题 t1 和 Google Scheduler cron 作业触发,并创建一个列表并将其发送到触发 t2主题 cf2。当我将 Google 的示例用于 cf2 时,我可以看到我的消息并且它有效。但是,当我部署自己的代码并记录消息时,我看到的是:```

cf2.accept:81) - data
.accept:83) - ms {"data_":{"bytes":[],"hash":0},"messageId_":"","orderingKey_":"","memoizedisInitialized":-1,"unkNownFields":{"fields":{},"fieldsDescending":{}},"memoizedSize":-1,"memoizedHashCode":0}

我的代码是:```

public class cf2 implements BackgroundFunction<PubsubMessage> {
 @Override
public void accept(PubsubMessage message,Context context) throws Exception {
    if (message.getData() == null) {
        logger.info("No message provided");
        return;
    }


    String messageString = new String(
            Base64.getDecoder().decode(message.getData().toStringUtf8()),StandardCharsets.UTF_8);
    logger.info(messageString);

    logger.info("Starting the job");

    String data = message.getData().toStringUtf8();
    logger.info("data "+ data);
    String ms = new Gson().toJson(message);
    logger.info("ms "+ ms);
}```

但是当我使用 Google 的示例代码时:

    package com.example;

import com.example.Example.PubSubMessage;
import com.google.cloud.functions.BackgroundFunction;
import com.google.cloud.functions.Context;
import java.util.Base64;
import java.util.Map;
import java.util.logging.Logger;

public class Example implements BackgroundFunction<PubSubMessage> {
  private static final Logger logger = Logger.getLogger(Example.class.getName());

  @Override
  public void accept(PubSubMessage message,Context context) {
    String data = message.data != null
      ? new String(Base64.getDecoder().decode(message.data))
      : "empty message";
    logger.info(data);
  }

  public static class PubSubMessage {
    String data;
    Map<String,String> attributes;
    String messageId;
    String publishTime;
  }
}

我在日志中非常清楚地看到了我的消息正文。有人可以帮助我解决我的代码有什么问题吗?

以下是我部署函数的方式:

gcloud --project=${PROJECT_ID} functions deploy \
    cf2 \
    --entry-point=path.to.cf2 \
    --runtime=java11 \
    --trigger-topic=t2 \
    --timeout=540\
    --source=folder \
    --set-env-vars="PROJECT_ID=${PROJECT_ID}" \
    --vpc-connector=projects/${PROJECT_ID}/locations/us-central1/connectors/appengine-default-connect

当我登录 message.getData() 时,我得到 <ByteString@37c278a2 size=0 contents=""> ,而我知道消息不是空的(我针对该主题进行了另一个测试订阅,以帮助我在那里看到消息)

解决方法

您需要定义什么是 PubSub 消息。您的代码中缺少这部分,我不知道您使用的是哪种 PubSubMessage 类型:

  public static class PubSubMessage {
    String data;
    Map<String,String> attributes;
    String messageId;
    String publishTime;
  }

它应该可以解决您的问题。让我知道。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。