2009-05-27 7 views
1

J'écris un programme C# qui surveille un compte Gmail dédié à l'aide de POP3 pour les courriels de commande spécialisés et réagit de manière appropriée.Synchronisation du moniteur de messagerie électronique

Pour une fiabilité maximale, je vais exécuter ce programme sur plusieurs ordinateurs à travers le pays. J'ai actuellement une condition de concurrence où deux instances du programme peuvent lire le même message avant que l'un d'entre eux le supprime, provoquant le traitement du message deux fois.

Comment puis-je m'assurer que chaque commande est traitée exactement une fois?

L'accès POP3 de Gmail ne servait à chaque fois qu'une seule fois (faisant de RETR et DELE une seule opération atomique), mais je ne peux plus reproduire ce comportement.

La seule méthode de communication entre les ordinateurs est un SQL Server et un serveur HTTP (que je contrôle).

Répondre

1

Une option à laquelle j'ai pensé est d'utiliser la commande UIDL de POP3 et d'avoir une table dans SQL Server avec une colonne unique d'UIDL qui ont déjà été traitées. Puis, avant de télécharger chaque message, le démon insère le code UIDL dans la table et, en cas d'erreur, ignore le message. (Je suppose que la commande INSERT de SQL Server est une opération atomique).

+0

Dans tous les cas, cela semble être la seule solution réalisable dans les circonstances avec lesquelles vous devez travailler. – jerryjvl

+0

un exemple de code en C# ?? – Kiquenet

0

D'abord, je dois admettre que je ne sais pas ce que les commandes POP3 supports, mais ... si vous pouvez faire une explicite « DELE » et obtenir une erreur si le message n'existe plus, alors je dirais:

  • RETR le message
  • DELE le message
  • processus que si DELE a réussi

EDIT:

Après avoir lu RFC1939, cette approche devrait fonctionner; de la 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 

Ceci suppose bien sûr que l'implémentation de Gmail honore réellement la RFC.

+0

La commande DELE marque le message à supprimer. Le message n'est réellement effacé qu'après l'envoi de QUIT. (Voir RFC1939) Par conséquent, si deux démons suppriment le même message, ils ne recevront aucune erreur. – SLaks

+0

Merci pour le numéro RFC là-bas;) ... dommage que cela n'aidera pas. – jerryjvl

+0

En fait ... lire le RFC maintenant, indique que l'utilisation d'un numéro de message dans le DELE qui a déjà été marqué comme supprimé est une erreur. Si Gmail implémente fidèlement RFC1939, ma suggestion devrait fonctionner, en ce sens que vous obtiendriez une réponse 'ERR' plutôt qu'une réponse 'OK' pour un message déjà marqué comme supprimé. – jerryjvl

Questions connexes