1

我通过 SuperFeedr 订阅了 RSS 提要,最近注意到很多重复的通知。我已经通过网络应用程序仔细检查了我的订阅,但我只看到 1。我还研究了确保我返回了正确的响应代码。文档说应该发送 200 作为响应,重试结构是在 5、10 和 15 秒之后,但在我的日志中,我看到重复发送的时间间隔为毫秒,这让我相信这些不是重试。

我的 doPost() 方法的第一行是:

    response.setStatus(HttpServletResponse.SC_OK);
    response.flushBuffer();

那里的尝试是让 superfeedr 知道我收到了消息,本质上是一个 ack。

作为短期补救措施,我决定在数据存储中保留代表“最新消息”的记录。

我知道通常在 servlet 的上下文中,您不会在 servlet 实例本身上进行同步,因为这会导致请求队列,但在这种情况下,Superfeedr 是唯一使用此 servlet 的服务,它不会被消耗普通用户,所以这正是我想要的,只是想确保这种方法不会有任何不良副作用。

我想为来自 Superfeedr 的请求留出时间,分析消息,确保它不是重复的,如果不是,更新数据存储中代表最新消息的值,一次一个。这是我所拥有的:

    synchronized(this) {
        //check datastore entry to see if the message coming in is a duplicate
        if(messageIsADuplicate(title)){
            logger.log(Level.SEVERE, "DUPLICATE MESSAGE RECEIVED");
            return;
        }
        //delete the entry in the datastore that represents the most recent message
        if(!mostRecentMessageDeletedFromDatastore()){
            logger.log(Level.SEVERE, "UNABLE TO DELETE MOST RECENT MSG");
            return;
        }
        //add an entry to the datastore that represents the most recent message from superfeedr
        if(!mostRecentMessageUpdatedInDatastore(title)){
            logger.log(Level.SEVERE, "UNABLE TO UPDATE MOST RECENT MSG");
            return;
        }
    }

那么,假设我想要一次访问这个特定的代码块,这看起来合适吗?

4

1 回答 1

0

我认为您遇到的问题是您的 GAE 应用程序在通知之间关闭,因为它的活动太少。结果是我们的通知通常在您的 GAE 应用程序“启动”期间超时,您看到的重复项是重试。

您可以通过检查 HTTP 标头轻松检查这一点。如果它们包含X-Superfeedr-Retried,您可以看到它们正在重试。(有关详细信息,请参阅文档

于 2015-03-03T22:25:33.743 回答