#java #google-cloud-functions #google-cloud-pubsub #java-11
#java #google-cloud-функции #google-cloud-pubsub #java-11
Вопрос:
В моем коде у меня есть 2 облачные функции, cf1
и cf2
. cf1
запускается через тему pubsub t1
с помощью задания cron планировщика Google каждые 10 минут, создает список и отправляет его в тему 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="">
, пока я знаю, что сообщение не пустое (я сделал еще одну тестовую подписку на тему, которая помогает мне увидеть сообщение там)
Комментарии:
1. похоже, вы принудительно переводите его в UTF8. извлеките
.toStringUtf8()), StandardCharsets.UTF_8)
2. @Moiz даже когда я это делаю, мой
message.getData()
<ByteString@37c278a2 size=0 contents="">
Ответ №1:
Вам нужно определить, что такое сообщение PubSub. Эта часть отсутствует в вашем коде, и я не знаю, какой тип PubSubMessage вы используете:
public static class PubSubMessage {
String data;
Map<String, String> attributes;
String messageId;
String publishTime;
}
Это должно решить вашу проблему. Дайте мне знать.