2016-02-15 10 views
9

WebjobsがQueueTrigger経由でAzureストレージのキューからメッセージを取得すると、Webjobsはそのメッセージをリースします(見えなくなります)。 (webjobの)トリガー機能がメッセージを処理するのに時間がかかる場合、このリースは自動的に延長されますか?または、私はその機能でそれを処理する必要がありますか?このリンクWindows Azure Queues: Improved Leases, Progress Tracking, and Scheduling of Future WorkWebjobsはAzure Queueメッセージで自動的にリースを更新しますか?

、著者は

注「それはメッセージの処理を継続できるように、メッセージのリースは、元のデキューをした労働者によって拡張することができます」と述べている:私はしました20分待っているWebジョブ(QueueTrigger付き)を試しました。

//Write Log 
Thread.Sleep(1200000); 
//Write Log 

正常に完了しました。そしてこの間、他のWebジョブインスタンスは同じキュー項目を試そうとしませんでした(それは見えなくなりました)。したがって、リースの自動更新メカニズムが存在するようです。とにかく、Microsoftの従業員から、または公式のリンク(msdn、azure、...)からの回答を待っています。

答えて

10

はい、リースは自動的に延長されます。毎回10分です。

azure.microsoft.com [2]に関するドキュメントとコメントを参照しているマイクロソフトの従業員が、この回答を参照してください[1]。また

EDIT(長い回答)

、ソースコードの検査は、https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.csQueueListenerクラスで開始すると、同じことを示します。 QueueListener

コードは10分visibilityTimeout変数が定義されているライン138に関連する部分を有している:

TimeSpan visibilityTimeout = TimeSpan.FromMinutes(10); // long enough to process the job 

変数はこの方法で定義されたタイマーを開始し、ProcessMessageAsyncに沿って渡されることCreateUpdateMessageVisibilityTimerその同じ値で10分の値は、可視性のタイムアウトをいつ更新するかを決定するために使用されます(半分にしてLinearSpeedupStrategyクラスのインスタンスを作成することによって)。

最終的にクラスUpdateQueueMessageVisibilityCommand [3]では、同じ10分間の更新でキューのUpdateMessageAsyncメソッドが呼び出されます。

LinearSpeedupStrategyは、更新が失敗しない限り、1分後に再試行されない限り(QueueListenerに定義されています)、5分後に再び更新されます。

[1] Azure Storage Queue and multiple WebJobs instances: will QueueTrigger set the message lease time on triggered?

を[2] https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started/

を[3] https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/UpdateQueueMessageVisibilityCommand.cs

+0

その質問の答えの一つが私のものです。つまり、私はその質問と明らかに別の答えを見ました。そして私はまた、与えられたリンクを読んで、その例をずっと前にしました。 「あなたのリースは自動的に延長されています。毎回10分です。たぶん私は何かが恋しいです。この結論を終える段落を指定できますか? –

+1

@NuriTasdemir申し訳ありませんが、私はポスターの名前を見ませんでした。あなたは正しいです、記事は時間の延長とそれがどれくらいあるかについて言及していません。そこで、私はGitHub(https://github.com/Azure/azure-webjobs-sdk/blob/master/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.cs)のソースコードを調べました。 10分のウィンドウは138行目にハードコードされています。その値はいくつかのメソッド呼び出しに渡され、メッセージを更新するタイマーの250行目に再び使用され、可視性のタイムアウトをリセットします。 – SvenAelterman

+1

@ NuriTasdemir途中で視界のタイムアウトをリセットするので少し複雑です。したがって、処理時間の最初の5分後には、それを10分などに延長します。 'LinearSpeedupStrategy'などを介して' UpdateQueueMessageVisibilityCommand'を使用しています。しかし結論として、WebJobの代わりに10時間毎回分。 – SvenAelterman

-2

あなたはメソッド(Javaコード)を使用することができます。

queue.retrieveMessage() 

がAzureストレージ上のキューからメッセージを取得します。デフォルトでは30秒後に表示されます。

あなたがリースを延長したい場合は、以下のコードを使用することができます。

CloudQueueMessage updateMessage = queue.retrieveMessage(); 
EnumSet<MessageUpdateFields> updateFields = EnumSet.of(MessageUpdateFields.CONTENT, MessageUpdateFields.VISIBILITY); 
queue.updateMessage(updateMessage, 60, updateFields, null, null); 

これは、あなたのメッセージは別の60秒間処理することができますを意味します。

+0

私はそれをkonow。しかし、私の場合は、 "public static async Task ProcessQueueMessage([QueueTrigger(" queue_name ")] BlobInformation blobInfo)のように、webjob sdk(c#)のQueueTrigger属性からキューメッセージを取得しています。私はこの場合、それは舞台裏で扱われると思います。そして私は確信しているだけです。私の試行では、webjobプロセスには90秒かかり、キューのメッセージはキューに表示されませんでした。 –

+0

私は記事[WebJobs SDKでAzureキューストレージを使用する方法](https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues- how-to /#createqueue)を実行します。 webjob sdkには "Polling algorithm"があります。あなたのウェブジョブは、最大待機時間に達するまで処理を続けるようです。メッセージの最大待ち時間を確認できますか? –

+0

@ AlexChen-WXこの記事で説明するポーリングアルゴリズムは、WebJobが新しいキューメッセージを確認する頻度にのみ関係します。各チェックでストレージトランザクションが発生するため、これを使用して原価を管理下に保つことができます。 – SvenAelterman

関連する問題