我通过 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;
}
}
那么,假设我想要一次访问这个特定的代码块,这看起来合适吗?