メールを送信するためのコードがあります。メールを送信する前に、現在ログインしているユーザーのメールでデフォルトの smtp 設定を上書きする必要があり、元に戻す必要があるため、2 人以上のユーザーが試行するときに同時実行の問題があります。メールを送信するには、これを取り除く方法。
3 に答える
一般的に言えば(コードを提供しなかったため):複数のスレッドが構成してから使用する方法で単一のリソースを使用している場合、データをオブジェクトに入れる必要があります(new MailSendRequest(smtpconfig, message)
'そしてこれらをキューに入れます。別の人Thread
が監視する必要がありますこのキューをMailSendRequests
作成し、同時実行性の問題を回避して 1 つずつ処理します (この特定のケースでは、大量のメールを一度に送信することは ISP によって適切な方法とは見なされないため、いずれにせよメールの送信を遅らせる必要があります。通常、メールは送信されます。メールの小さいバッチを定期的に送信します。)
jabalの解決策は、まさに私が提案するものです。具体的には、SingleThreadExecutorサービスを使用することをお勧めします。これは、jabalが提案することを正確に実行します。つまり、メールリクエストをキューに入れることができ、1つのスレッドがそれらを順番に処理します。
ただし、レイテンシの問題が発生する可能性のあるタスクで作業していることに気付きました(これを別の場所のキューに固定する大きな理由の1つです!)。タスクにかかる最大時間を知るためにタイムアウトを明示的に設定し、途中で発生する可能性のあるエラーを処理できるようにエグゼキュータのsubmitメソッドを使用することをお勧めします。
最初の方法: ロックが必要です。これが私がすることです:
void sendMail(){
syncronize(smtp){
//alter smtp mail object
smtp.sentMail();
//revert smtp mail object
}
}
コードの実行がsyncronize
ブロックに入ると、smtp オブジェクトがロックされ、ロックされたオブジェクトに到達した人は、解決されるまで待機します。
2 番目の方法: または、共有Lock
オブジェクトを使用します。
Lock lock = new ReentrantLock();
void sendMail(){
lock.lock();
//alter smtp mail object
smtp.sentMail();
//revert smtp mail object
lock.unLock();
}
}
親切な取引です