облачная функция не захватывает сообщение pubsub, даже если оно запущено

#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;
  }
 

Это должно решить вашу проблему. Дайте мне знать.