google-cloud-platform - 具有 CustomAttributes 的 PubSub - 未调用接收器函数,但出现 json 解析异常
问题描述
谷歌云和 PubSub 服务。
我在下面的示例代码行中实现了一个简单的 CustomAttributeReceiver
我如何得到以下异常
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 预期的字符串,但在 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 中添加了默认构造函数。
推荐阅读
- java - 使用 Chronometer - 在 setText 之后,Textview 只显示文本一秒钟
- python - 如何禁用 QSplashScreen 的默认“点击关闭”行为?
- node.js - MongoDB - NodeJS 动态更新指定索引处的数组元素
- python - docker-compose up: OSError: [Errno 99] 无法分配请求的地址
- sql - 如何在目标与源不匹配的特定日期删除合并语句中的行
- excel - 如何将此功能从 InputBox 更改为 UserForm?
- swift - WKWebview 在 macOS 上的默认浏览器中打开目标 =“_blank”链接
- android - 每个 Google 帐户可以创建多少个 Firebase 项目?我可以将多少个应用附加到一个 Firebase 项目?
- database - 服务器和数据库上的不同时区
- javascript - 在for循环中调用函数,异步问题