Google cloud platform Google PubSub/Gmail Webhook:在发送电子邮件时始终接收来自PubSub的多个POST请求
我安装了一个webhook,它使用Google Cloud PubSub API和Java中的Gmail API监听和处理我收件箱中的更改,并在Gmail中发送文件夹 我看到的问题是,当我向另一个用户发送消息时,PubSub似乎会在一秒钟内两次推送到我的端点,历史id和消息id略有不同,但订阅名称和用户电子邮件相同 我知道PubSub保证至少一次传递,因此收到重复的消息并不奇怪,但由于重复消息不断发生且消息id不同,我认为可能会有基于以下PubSub文档的多个推送请求: 云发布/订阅为每条消息分配一个唯一的Google cloud platform Google PubSub/Gmail Webhook:在发送电子邮件时始终接收来自PubSub的多个POST请求,google-cloud-platform,gmail-api,google-cloud-pubsub,Google Cloud Platform,Gmail Api,Google Cloud Pubsub,我安装了一个webhook,它使用Google Cloud PubSub API和Java中的Gmail API监听和处理我收件箱中的更改,并在Gmail中发送文件夹 我看到的问题是,当我向另一个用户发送消息时,PubSub似乎会在一秒钟内两次推送到我的端点,历史id和消息id略有不同,但订阅名称和用户电子邮件相同 我知道PubSub保证至少一次传递,因此收到重复的消息并不奇怪,但由于重复消息不断发生且消息id不同,我认为可能会有基于以下PubSub文档的多个推送请求: 云发布/订阅为每条消息分
消息\u id
,可用于检测订阅者接收到的重复消息。但是,这不允许您检测由同一数据上的多个发布请求导致的重复
我所尝试的:
service.users().stop()
以确保我没有多次调用watch()
,然后再次开始watch()
public static Map<String, String> watchInbox(Gmail service) throws IOException {
Map<String, String> watchInboxResponse = new HashMap<>();
List<String> labelsToWatch = Arrays.asList("INBOX", "SENT");
String topicName = "projects/subscription-name/topics/topic-name";
WatchRequest request = new WatchRequest();
request.setLabelIds(labelsToWatch);
request.setTopicName(topicName);
WatchResponse response = service.users().watch("me", request).execute();
watchInboxResponse.put("historyId", response.getHistoryId().toString());
watchInboxResponse.put("expiration", response.getExpiration().toString());
return watchInboxResponse;
}
publicstaticmap-watchInbox(Gmail服务)抛出IOException{
Map watchInboxResponse=new HashMap();
List labelsToWatch=Arrays.asList(“收件箱”、“已发送”);
字符串topicName=“项目/订阅名称/主题/主题名称”;
WatchRequest=newwatchrequest();
请求。SetLabelID(labelsToWatch);
请求.setTopicName(topicName);
WatchResponse=service.users().watch(“我”,请求).execute();
watchInboxResponse.put(“historyId”,response.getHistoryId().toString());
watchInboxResponse.put(“expiration”,response.getExpiration().toString());
返回watchinbox响应;
}
我将historyid和expiration插入数据库,并使用它来检查在收到webhook调用时,是否需要再次调用
watch()
,如果自上次调用watch
(由Google推荐)以来已超过24小时。我在实现Google发布/订阅监视请求时也有类似的行为
Gmail在撰写邮件时的作用是创建系统标签
“发送和起草”
并不断使用新的messageId和标签“Send and draft”保存到draft,您已订阅对“Inbox and Send”的任何更改,因此您将在webhook上被点击两次或更多时间
来自Gmail的邮件总是包含标签,您必须过滤那些带有标签草稿的邮件
我的代码使用Gmail.NETSDK,必须处理
//Explicitly avoid further processing
bool isdraft = y.Message.LabelIds.Contains("DRAFT");
不管怎样,都要对其进行过滤。您是否可以添加任何详细信息,如:使用的代码、遇到的错误问题,向社区展示您的尝试。请增强您的代码。您提供的示例非常少,无法提供解决方案。您找到解决方案了吗?我有一个类似的问题: