以前のポストで、June CTP版のサービス バスQueueの利用法をご紹介しました。
September CTP版としてすべてのユーザがAppFabricサービス バスでQueueが利用可能になったのを受け、SDKの内容も変更されました。
June CTPのコードと比べ、若干ではありますがシンプルな手順で利用可能になっています。
まず、Microsoft.ServiceBus.dllを参照設定します。この手順は今までと同一です。
参照設定するDLLは「C:\Program Files\Windows Azure AppFabric SDK\V1.5\Assemblies\NET4.0\Microsoft.ServiceBus.dll」などのパスに存在します。
ただ、参照設定するDLLがCTPと比べ減っています。1つのDLLのみを参照設定すればよくなっているので、多少ではありますが手間が省けています。
続いて、サービスを公開するためのコードをご紹介します。
まずは、コードを見てみましょう。
private Uri m_BaseAddress;
private string m_Issuer = “owner”;
private string m_SharedKey = “各Namespaceに対応するSharedKeyを指定する。”;
private TokenProvider m_TokenProvider;
private NamespaceManager m_NamespaceManager;
private MessagingFactory m_MessagingFactory;
private QueueClient m_QueueClient;
private void CreateAndSend(string messagebody)
{
//サービスバスのBaseAddressを生成
m_BaseAddress = ServiceBusEnvironment.CreateServiceUri(“sb”, “yournamespace “, string.Empty);
//資格情報の作成
m_TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(m_Issuer, m_SharedKey);
//NamespaceClientの作成
m_NamespaceManager = new NamespaceManager(m_BaseAddress, m_TokenProvider);
//Queueの初期化
if (!m_NamespaceManager.QueueExists(“YourQueue”))
{
//Queueの作成
m_NamespaceManager.CreateQueue(“YourQueue “);
}
//MessageingFactoryの作成
m_MessagingFactory = MessagingFactory.Create(m_BaseAddress, m_TokenProvider);
//Queueクライアントの作成
m_QueueClient = m_MessagingFactory.CreateQueueClient(“YourQueue “);
//メッセージの送信
m_QueueClient.Send(new BrokeredMessage ( messagebody));
}
この例では、Queueが全く存在してないことを想定して、Queueを作成することから始めています。
最初に、発行者(Issuer)と共有キー(SharedKey)を用いて、TokenProviderのインスタンスを作成しています。
このTokenProviderをもとにサービスバスに対して認証を実行しています。
続いて、Queueを初期化しています。
コメント中の「Queueの初期化」の部分がそれに該当します。指定したパスのQueueが存在しない場合のみ、新規にQueueを作成しています。
Queueの作成や削除などといったQueueの管理にはNamespaceManagerオブジェクトを利用します。
一方メッセージの送受信にはMessagingFactoryおよびQueueClientオブジェクトを使用します。
余談ですが、Topicを利用する場合にはQueueClientの代わりにTopicClientを利用するだけです。
メッセージはQueueClient.Sendを用いて送信します。メッセージはBrokeredMessageオブジェクトである必要があります。
ここであることに気づきませんか?
そう、Senderを作成していません。
June CTPではQueueClientからSenderおよびReceiverを作成してメッセージを送受信していました。
しかし、現在のバージョンではQueueClientが直接メッセージを送受信することができるように改良されています。
BrokerdMessageの本文に含めるオブジェクトはシリアライズ可能なすべてのオブジェクトを指定することが可能です。
メッセージ長は最大256KBですので、シリアライズ時のサイズが256KB以下のオブジェクトを指定しなければなりません。
それでは読み出しの部分を見てみましょう。
BrokeredMessage bm;
bm = m_QueueClient.Receive(TimeSpan.FromSeconds(1));
if (bm != null)
{
string msg= bm.GetBody< string >();
MessageBox.Show(msg);
m_QueueClient.Complete(bm.LockToken);
}
QueueClientの作成までは送信時と同一のため、コードは割愛しました。
QueueClient.Receiveメソッドを利用して読み出しを実行しています。引数は取得までの待ち時間で、指定した時間以上経過した場合には読み出しを中止し、後続の処理を実行します。
メッセージ本文はBrokeredMessage.GetBodyメソッドで取り出すことが可能です。
処理が完了した時点でQueueClient.Completeメソッドを実行します。
これを実行することで、メッセージをQueueから消去することができます。
言い換えれば、これを忘れると何度も同じメッセージに対する処理を実行してしまうことになりますので、注意してください。
[…] 前回のポストで、Windows Azure AppFabricサービス バスにおけるQueueの利用についてご紹介しました。 […]