かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ストレージのQueueのメッセージの不可視期間を更新する

Queueを使って非同期通信で重たいバッチ処理をWorkerロールに!とやってるときに気になるのがQueueから取得したメッセージの不可視時間。これをうまいこと制御しないと、バッチ処理中なのにQueueにメッセージが復活したりとちょっと嫌な感じになってしまいます。

何で嫌な感じになるかというと、不可視時間の最大は2hなのです。2hを超えるとQueue内にメッセージが復活してしまいます。これはWorkerロールが処理中にこけて、エラーになったときの復旧手段としてはいいのですが、単に時間のかかる処理をしている時にQueueにメッセージが復活されてはたまりません。二重処理になってしまいます。そんなときはUpdateMessageメソッドをつかって、バッチ処理内で適当なタイミングで不可視時間を延長します。

// ここらへんは適当にアカウントとってクライアントとって
var acc = CloudStorageAccount.FromConfigurationSetting("hoge");
var client = acc.CreateCloudQueueClient();

// キューもとって
var queue = client.GetQueueReference("queuename");


// ここからがメッセージとってバッチ処理
var message = queue.GetMessage();

... 何か時間のかかる処理

// 今から1h後までメッセージを見えない状態にキープ
queue.UpdateMessage(message, TimeSpan.FromHours(1), MessageUpdateFields.Visibility);

... 何か時間のかかる処理

// 今から1h後までメッセージを見えない状態にキープ
queue.UpdateMessage(message, TimeSpan.FromHours(1), MessageUpdateFields.Visibility);

CloudQueueクラスのUpdateMessageに更新対象のメッセージと、新しい不可視時間と、何をアップデートするのかというフラグ(この場合は不可視時間を表すMessageUpdateFields.Visibilityを指定します。このメソッドはSDK1.6から追加されたっぽいので古いSDKでは使えないので要注意です。

ということでメモメモ。