Синхронизация монитора электронной почты - PullRequest
1 голос
/ 27 мая 2009

Я пишу программу на C #, которая отслеживает выделенную учетную запись Gmail с помощью POP3 для специальных командных сообщений и реагирует соответствующим образом.

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

Как я могу убедиться, что каждая команда обрабатывается ровно один раз?

Доступ Gmail по протоколу POP3, используемый для обслуживания каждого сообщения только один раз (делая RETR и DELE одной атомарной операцией), но я больше не могу воспроизвести это поведение.

Единственный способ связи между компьютерами - это SQL Server и HTTP-сервер (которым я управляю).

Ответы [ 2 ]

1 голос
/ 27 мая 2009

Один из вариантов, о котором я подумал, - это использовать команду UIDL POP3 и иметь таблицу в SQL Server с уникальным столбцом UIDL, которые уже были обработаны.

Затем, перед загрузкой каждого сообщения, демон вставит UIDL в таблицу и, если он получил ошибку, пропускает сообщение. (Я предполагаю, что команда INSERT в SQL Server является атомарной операцией).

0 голосов
/ 27 мая 2009

Сначала я должен признать, что не знаю, какие команды поддерживает POP3, но ... если вы можете сделать явное «УДАЛЕНИЕ» и получить сообщение об ошибке, если сообщение больше не существует, то я бы сказал:

  • RETR сообщение
  • УДАЛИТЬ сообщение
  • Обрабатывать только в случае успешного удаления

EDIT:

После прочтения RFC1939 этот подход должен работать; из RFC:

DELE msg

     Arguments:
         a message-number (required) which may NOT refer to a
         message marked as deleted

     Restrictions:
         may only be given in the TRANSACTION state

     Discussion:
         The POP3 server marks the message as deleted.  Any future
         reference to the message-number associated with the message
         in a POP3 command generates an error.  The POP3 server does
         not actually delete the message until the POP3 session
         enters the UPDATE state.

     Possible Responses:
         +OK message deleted
         -ERR no such message

     Examples:
         C: DELE 1
         S: +OK message 1 deleted
            ...
         C: DELE 2
         S: -ERR message 2 already deleted

Конечно, предполагается, что реализация Gmail действительно соблюдает RFC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...