云功能不捕获 pubsub 消息,即使它被触发
cloud function doesn't capture pubsub message, even though it is triggered
在我的代码中,我有 2 个云函数,cf1
和 cf2
。 cf1
通过 pubsub 主题 t1
触发,每 10 分钟有一个 Google 调度程序 cron 作业,并创建一个列表并将其发送到触发 cf2
的主题 t2
。当我将 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;
}
它应该可以解决您的问题。让我知道。
在我的代码中,我有 2 个云函数,cf1
和 cf2
。 cf1
通过 pubsub 主题 t1
触发,每 10 分钟有一个 Google 调度程序 cron 作业,并创建一个列表并将其发送到触发 cf2
的主题 t2
。当我将 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;
}
它应该可以解决您的问题。让我知道。