私はシナリオを持っています.MSMQキューイングシステム...レコードはタイムリーにキューに入れられます...キューをリッスンするWCFリスナーは、レコードがキューに入れられるとすぐにレコードの処理を開始します...何らかの処理を行い、その後、電子メールを送信します (10 個のキューと 10 個のリスナーがあり、そのうち 3 個のリスナーが電子メールの送信を担当します)。私が直面している問題は、メール送信部分です。大きなデータがキューに入れられ、一部のレコードで次のエラーが発生します
Service not available, closing transmission channel. The server response was: 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel
メールを送るクラスは
public class A
{
//Method is static as it is a common method used by other processes running in parallel
public static void SendMail()
{
MailMessage mail = new MailMessage();
SmtpClient client = new SmtpClient();
///Email information goes here
client.Send(mail);
}
}
私のメソッドでさえ静的であり、smtpオブジェクトがインスタンス化されるたびに問題が発生すると思います。同時接続を増やしても問題は解決しません。いくつかの回避策がありますが、これについてもう少し説明が必要でした。
- 番号を制限します。つまり、100 のレコードがキューに入れられていて、リスナーがそれらのレコードを並行して処理し始めても、smtp プロセスは一度に 100 を超える接続を使用せず、完了するまで待ってから次の 100 を使用します。等々。しかし、これを行う方法がわかりません。
- 並列 foreach ループまたは SmtpClient.SendAsync メソッドを使用しますが、ここでもこれらのメソッドに関する習熟度は高くないため、少し恐れています (パフォーマンスに大きな影響がないことを確認する必要があります)。したがって、これを解決するための安定したより良いアプローチが必要でした。