2015-02-27 3 views
1

У меня есть подписка на канал RSS через SuperFeedr, и в последнее время мы заметили много дубликатов уведомлений. Я дважды проверял подписки через веб-приложение, но я вижу только 1. Я также изучил, что верну правильный код ответа. В документации говорится, что в качестве ответа следует отправить 200, а структура повтора - через 5, 10 и 15 секунд, но в моих журналах я вижу, что дубликаты отправляются миллисекундами друг от друга, что заставляет меня думать, что это не повторы.Обработка дубликатов уведомлений от superfeedr

В первых строках моего doPost метода() являются:

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

Попытки есть позволить superfeedr знать, что я получил сообщение, ПДТ по существу.

В качестве краткосрочного средства защиты я решил сохранить запись в хранилище данных, которое представляет «последнее сообщение».

Я знаю, что, как правило, в контексте сервлета вы не синхронизировались с самим экземпляром сервлета, потому что это вызывало бы очередь запросов, но в этом случае Superfeedr является единственным сервисом, использующим этот сервлет, он не потребляется обычными пользователями, так что это именно то, что я хочу, просто хотел убедиться, что не будет никаких побочных эффектов такого подхода.

Я хочу предоставить время для запроса в 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; 
     } 
    } 

Таким образом, если предположить, что я хочу один на время доступа к этому конкретному блоку кода, делает это представляется целесообразным?

+1

они управляют распределенным сервисом, поэтому я предполагаю, что это может произойти. IIRC отправляют идентификатор вместе, и вы можете проверить, получили ли вы это? –

ответ

0

Я думаю, что вы столкнулись с проблемой, так как ваше приложение GAE отключается между уведомлениями, поскольку оно слишком мало. Следствием этого является то, что наши уведомления, как правило, устраняются во время «загрузки» вашего приложения GAE, и дубликаты, которые вы видите, повторяются.

Вы можете легко проверить это, проверив заголовки HTTP. Если они содержат X-Superfeedr-Retried, вы можете видеть, что они были попытками. (См. docs for details)

Смежные вопросы