Azure Toolsを使ってVisual StuidoでWorkerRoleを作成すると初期状態でRunメソッドの中で10秒ごとの無限ループが組まれています(詳しくは「Windows Azureワーカーロールの甘い罠」参照)。
Public Overrides Sub Run()
' これは CZ1009CloudWorkerRole の実装例です。実際のロジックに置き換えてください。
Trace.WriteLine("CZ1009CloudWorkerRole entry point called.", "Information")
While (True)
Thread.Sleep(10000)
Trace.WriteLine("Working", "Information")
End While
End Sub
このループを削除してしまうとリッスンしているエンドポイントがないというエラーになってしまいます。
無限ループで処理をする
「10 行でズバリ !! Windows Azure の Worker ロール サービス開発 (VB)」には、このループの中でqueueからデータを取得して処理するが紹介されています。
Public Overrides Sub Run()
' これは CZ1009CloudWorkerRole の実装例です。実際のロジックに置き換えてください。
Trace.WriteLine("CZ1009CloudWorkerRole entry point called.", "Information")
' 無限ループを活用し一定間隔でバックグラウンド処理
Do While (True)
' キュー メッセージの取得と削除 (Dequeue)
Dim msg As CloudQueueMessage = queue.GetMessage()
If msg IsNot Nothing Then
DoSomething(msg)
queue.DeleteMessage(msg)
Thread.Sleep(1000)
Else
' 3秒間間隔でキューを再確認する
Thread.Sleep(3000)
End If
Loop
End Sub
このようにすることで
-------引用開始
Windows Azure で定期実行する処理や非常に時間のかかる処理を行いたい場合には、Worker ロールによるバックグラウンド処理が便利です。Worker ロールを利用する場合、Windows Azure ストレージのキューを介して Web ロールと連携するのが、Windows Azure では最もシンプルで基本的な仕組みとなっています。併せて、.NET Framework 標準の Trace.WriteLine メソッドにより Windows Azure へログ出力が行えるため、バックグラウンド処理で発生するさまざまな情報もログという形で閲覧できます。
-------引用終了
との事です。
無限ループ以外で処理をする
WorkerRoleを実際に使ってみると、無限ループ部分はそのままにしてPublic Function hogehogeなどを定義すると、例えばWebRoleから
Dim workerProc As New CZ1009CloudWorkerRole.WorkerRole
ds = workerProc.GetRecords()
のように同期的にも利用する事が出来ます。
結局のところ・・・・・
二番目に紹介した同期的な方法というのもOKな使い方なのでしょうか。非同期じゃないのでWorkerRoleが重たければWebRoleもそれに引きずられて重くなってしまうのでしょうけれど。