エクスポート (0) 印刷
すべて展開

メッセージング オブジェクトのライフサイクルの管理

更新日: 2014年3月

TopicClientQueueClientSubscriptionClient などのメッセージング オブジェクトは、1 度作成しておいて必要なときに再利用するためのものです。.これらのオブジェクトはスレッドに準拠しており、複数のスレッドから並行して安全にメッセージを送受信できます。メッセージング オブジェクトの作成時には、Microsoft Azure Active Directory アクセス制御 (アクセス制御サービスまたは ACS) でクライアント要求の認証に関連するオーバーヘッドが若干生じるため、TopicClientQueueClient、および SubscriptionClient オブジェクト インスタンスをキャッシュすることをお勧めします。リソース使用率を最適にするため、キャッシュ スコープをそれぞれの Service Bus メッセージング オブジェクトを使用するメッセージング コンポーネントの有効期間に制限することを検討してください。

メッセージング オブジェクトのライフサイクル

メッセージング オブジェクトのライフサイクルは、新しいインスタンスが MessagingFactory オブジェクトから取得されたときに開始します。

// The following actions are often performed upon initialization of an application-level messaging component.

string issuerName = "Issuer Name is retrieved from configuration file";
string issuerSecret = "Issuer Secret also comes from configuration file";
string serviceNamespace = "contoso-cloud";
string queuePath = "PurchaseOrders";

var credentials = TokenProvider.CreateSharedSecretTokenProvider(issuerName, issuerSecret);
var address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, String.Empty);
var messagingFactory = MessagingFactory.Create(address, credentials);
var queueClient = messagingFactory.CreateQueueClient(queuePath, ReceiveMode.ReceiveAndDelete);

前述したように、指定したキューとの間でメッセージを送受信するために 1 つの QueueClient オブジェクトを再利用できます。メッセージを送受信するたびに QueueClient オブジェクトに新しいインスタンスを作成する必要はありません。

for (int i = 0; i < 5; i++)
{
    using (var msg = new BrokeredMessage(String.Format("Message #{0}", i)))
    {
        queueClient.Send(msg);
    }
}

メッセージング オブジェクトは、Azure プラットフォームがホストする Service Bus メッセージング インフラストラクチャへのアクティブな接続を維持することに注意してください。各種マルチテナント サービスと同様に、Service Bus による仲介型メッセージング サービスは、1 つのメッセージング エンティティ (キュー、トピック、サブスクリプションなど) がサポートできるアクティブな同時接続数のクォータの対象となります。同時接続数を最小限にするために、Service Bus メッセージング オブジェクトの有効期間を明示的に制御し、後で再利用する予定がない場合はオブジェクトを終了することをお勧めします。また、メッセージング ソリューションの正常な終了時に、メッセージング ファクトリ オブジェクトも終了する必要があります

note
メッセージング オブジェクトを終了しても、複数のメッセージング オブジェクトがファクトリ レベルで接続を共有しているため、基礎となる接続は終了しません。その代わりに、メッセージング ファクトリ オブジェクトを終了すると、Service Bus メッセージング インフラストラクチャへの基礎となる接続を終了します。

指定したメッセージング オブジェクトを終了するには、次のいずれかの手法を使用して Close() メソッドを呼び出す必要があります。

// When a queue client is no longer required, let's close it so that it doesn't consume a connection.

// Option #1: Closing a specific messaging object instance.
queueClient.Close();

// Option #2: Closing all messaging objects tracked by the messaging factory.
messagingFactory.Close();

メッセージング オブジェクトが正常に終了されない状態になる場合がまれにあることにも注意してください。そのような状況には、仲介型メッセージング API によって、正常に終了できない場合の接続中止を含めた適切な操作が実行されるようになります。Abort()Close() のどちらのメソッドを呼び出すかを決定するために、ステータスを確認する必要はありません。これは API によって内部で行われます。例外をスローしないと、Close() メソッドが完了する保証はないことに注意してください。このため、メッセージング オブジェクトが常に安全に終了されるようにするには、try/catch コンストラクトの形式による追加レイヤーで保護することをお勧めします

note
メッセージング オブジェクトの終了は破棄操作とは異なりますが、後で終了したインスタンスを再利用することになっても、終了したオブジェクトを再度開くことはできません。終了したメッセージング オブジェクトに対する操作を呼び出そうとすると、「This messaging entity has already been closed, aborted, or disposed (このメッセージング エンティティはすでに閉じられているか、中断されているか、破棄されています)」など、状況のわかりやすい記述で例外が表示されます。メッセージング オブジェクトを開いた状態に復元するために、クライアントが呼び出すことのできる公開 Open() メソッドはありません。メッセージング オブジェクトの新しいインスタンスを作成する必要があります。この推奨事項は、MessagingFactory オブジェクトにも適用されます。

メッセージング オブジェクトの有効期間は、Close() メソッドが呼び出されたときに終了します。キュー、トピック、サブスクリプション用メッセージング クライアントの作成に使用した MessagingFactory オブジェクトを明示的に閉じることによって、ソリューションが使用するすべてのメッセージング オブジェクトが正常に終了したことを最も簡単に確認できます。MessagingFactory を明示的に終了すると、クラスが作成および所有するすべてのメッセージング オブジェクトを暗示的に終了します。たとえば、メッセージング コンポーネントの Dispose() メソッド内にあるファクトリ オブジェクト、OnStop()RoleEntryPoint メソッド内、または UnhandledException イベント ハンドラー内からファクトリ オブジェクトを終了する場合があります。

コミュニティの追加

追加
表示:
© 2014 Microsoft