具有CustomAttributes的PubSub-未调用Receiver函数,但即将出现json解析异常

问题描述

Google Cloud和PubSub服务。

我在下面的示例代码行中实现了一个简单的CustomAttributeReceiver

https://github.com/googleapis/java-pubsub/blob/master/samples/snippets/src/main/java/pubsub/PublishWithCustomAttributesExample.java

我如何遇到以下例外情况

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为STRING,但在com.google.gson.Gson.fromJson(Gson.java:944)的路径$处为BEGIN_OBJECT com.google.gson.Gson.fromJson(Gson.java:1003)在 com.google.cloud.functions.invoker.NewBackgroundFunctionExecutor $ TypedFunctionExecutor.serviceLegacyEvent(NewBackgroundFunctionExecutor.java:257)在

上的com.google.cloud.functions.invoker.NewBackgroundFunctionExecutor.serviceLegacyEvent(NewBackgroundFunctionExecutor.java:343)

有人可以告诉我我在这里想念的东西吗?

发布方

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.google.api.core.ApiFuture;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.protobuf.ByteString;
import com.google.pubsub.v1.PubsubMessage;
import com.google.pubsub.v1.TopicName;
import PubSubMessage;


            TopicName topicName = TopicName.of(projectId,topicId);
        System.out.println("informlistenersAboutSucessfulRegisteration=" + topicName);
        Publisher publisher = null;
        try {
            publisher = Publisher.newBuilder(topicName).build();
            PubSubMessage newUserRegisterMsg = new PubSubMessage();
            Map<String,String> attributes = new HashMap<String,String>();
            attributes.put(PubSubMessage.newUserLanguage,newUserLanguage);
            newUserRegisterMsg.setAttributes(attributes);
            ByteString data = ByteString.copyFromUtf8("NewUserRegisteration");
            PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(data).putAllAttributes(attributes).build();
            ApiFuture<String> messageIdFuture = publisher.publish(pubsubMessage);
            String messageId = messageIdFuture.get();
            System.out.println("Published message ID: " + messageId);
        } catch (Exception e) {
            Logger.getLogger(PubSubMessenger.name).log(Level.SEVERE,"Exception while publishing message",e);
        } finally {
            if (publisher != null) {
                publisher.shutdown();
                publisher.awaitTermination(1,TimeUnit.MINUTES);
            }
        }

接收方

    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
    
    import com.google.cloud.functions.BackgroundFunction;
    import com.google.cloud.functions.Context;
    import PubSubMessage;

    
public class SendEmailFromSendGrid implements BackgroundFunction<PubSubMessage> {
    public SendEmailFromSendGrid() {
    }

    public void accept(PubSubMessage message,Context context) throws Exception {
        System.out.println("invoked accept");
        String name = "World";
        if (message != null && message.getData() != null) {
            name = new String(Base64.getDecoder().decode(message.getData().getBytes(StandardCharsets.UTF_8)),StandardCharsets.UTF_8);
        }
        System.out.println(String.format("Hello %s!",name));
        return;
    }
}

PubSubMessage定义

    import java.util.Map;

    public class PubSubMessage {

    public static final String newUserLanguage = "userLanguage";

    private String data;
    private Map<String,String> attributes;
    private String messageId;
    private String publishTime;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public Map<String,String> getAttributes() {
        return attributes;
    }

    public void setAttributes(Map<String,String> attributes) {
        this.attributes = attributes;
    }

    public String getMessageId() {
        return messageId;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    public String getPublishTime() {
        return publishTime;
    }

    public void setPublishTime(String publishTime) {
        this.publishTime = publishTime;
    }
}

谢谢

解决方法

此答案由@ user1241724在评论部分中提供:

重做整个练习,它现在正在工作。唯一的区别是 在PubSubMessage中添加了默认构造函数。