Google cloud platform Google PubSub/Gmail Webhook:在发送电子邮件时始终接收来自PubSub的多个POST请求

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文档的多个推送请求: 云发布/订阅为每条消息分

我安装了一个webhook,它使用Google Cloud PubSub API和Java中的Gmail API监听和处理我收件箱中的更改,并在Gmail中发送文件夹

我看到的问题是,当我向另一个用户发送消息时,PubSub似乎会在一秒钟内两次推送到我的端点,历史id和消息id略有不同,但订阅名称和用户电子邮件相同

我知道PubSub保证至少一次传递
,因此收到重复的消息并不奇怪,但由于重复消息不断发生且消息id不同,我认为可能会有基于以下PubSub文档的多个推送请求:

云发布/订阅为每条消息分配一个唯一的
消息\u id
,可用于检测订阅者接收到的重复消息。但是,这不允许您检测由同一数据上的多个发布请求导致的重复

我所尝试的:

  • 确保我的谷歌云控制台上只有一个主题/订阅
  • 将确认截止时间设置为10到600秒之间的不同值
  • 调用了
    service.users().stop()
    以确保我没有多次调用
    watch()
    ,然后再次开始
    watch()
  • 我已经调查了PubSubIO,以确保只发送一次,但我认为如果我一直收到多条PubSub消息,那么我设置webhook的方式肯定有根本性的问题

    编辑: 这是我在Gmail账户中需要注意的代码。我正在使用具有域权限的服务帐户,以便访问整个域中的帐户

    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");
    

    不管怎样,都要对其进行过滤。

    您是否可以添加任何详细信息,如:使用的代码、遇到的错误问题,向社区展示您的尝试。请增强您的代码。您提供的示例非常少,无法提供解决方案。您找到解决方案了吗?我有一个类似的问题: