1

POP3 を使用して専用の Gmail アカウントを監視し、特殊なコマンド メールに適切に反応する C# プログラムを作成しています。

最大限の信頼性を得るために、このプログラムを全国の複数のコンピューターで実行します。現在、プログラムの 2 つのインスタンスが同じメッセージを読み取ってから、そのうちの 1 つがメッセージを削除する可能性があり、メッセージが 2 回処理されるという競合状態があります。

各コマンドが 1 回だけ処理されるようにするにはどうすればよいですか?

Gmail の POP3 アクセスは、各メッセージを 1 回だけ提供していました (RETR と DELE を単一のアトミック操作にする) が、この動作を再現することはできなくなりました。

コンピュータ間の唯一の通信方法は、SQL Server と HTTP サーバー (私が管理) です。

4

2 に答える 2

1

私が考えた 1 つのオプションは、POP3 の UIDL コマンドを使用し、既に処理された UIDL の一意の列を持つテーブルを SQL Server に作成することです。

次に、各メッセージをダウンロードする前に、デーモンは UIDL をテーブルに INSERT し、エラーが発生した場合はメッセージをスキップします。(SQL Server の INSERT コマンドはアトミック操作であると想定しています)。

于 2009-05-27T00:57:29.297 に答える
0

最初に、POP3 がサポートするコマンドがわからないことを認めなければなりませんが、明示的な「DELE」を実行して、メッセージが存在しない場合にエラーを取得できる場合は、次のように言います。

  • メッセージをRETRする
  • メッセージを削除する
  • DELE が成功した場合のみ処理する

編集:

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 を尊重していることを前提としています。

于 2009-05-27T01:21:14.363 に答える