2017-11-02 18 views
0

一定期間後に毒キューに一斉に移動されリプロ(約500メッセージの周りの)キューにメッセージを追加Azureのストレージ・キュー・メッセージが

を繰り返します。 キューメッセージを処理するキュートリガー関数アプリを追加します。キューから

期待される動作

すべてのメッセージが処理されます。メッセージの処理中に例外がスローされた場合、メッセージはポイズンキューに送信されます。

メッセージが処理されている起動

実際の行動。一定時間(約30〜60秒程度)の後、キューに残っているメッセージはすべてポイズンキューに移動します。その瞬間に処理されたメッセージは例外としてスローされません。

キューメッセージの有効期間がデフォルトのものであることを確認しました。7日WindowsAzure.Storageパッケージを7.2.1にダウングレードしようとしましたが、成功しませんでした。

WindowsAzure.Storageバージョンは8.5.0です。

機能アプリがクラッシュすると、すべてのメッセージがポイズンキューに移動することがありますか?

EDIT

これは、メッセージがキューに追加されている方法です。

public async Task AddMessage() 
{ 
    var queueModel = new QueueModel 
    { 
     // queue model properties 
    }; 

    await AddMessageToQueueAsync(queueModel); 
} 


public async Task AddMessageToQueueAsync(T messageObject, TimeSpan? initialVisibilityDelay = null) 
{ 
    var queue = GetQueue(); 
    var jsonMessage = JsonConvert.SerializeObject(messageObject); 
    var message = new CloudQueueMessage(jsonMessage); 

    await queue.AddMessageAsync(message, TimeSpan.FromDays(7), initialVisibilityDelay, new QueueRequestOptions(), new OperationContext()); 
} 

private CloudQueue GetQueue() 
{ 
    var queueClient = _storageAccount.CreateCloudQueueClient(); 

    var queue = queueClient.GetQueueReference(_queueName); 
    queue.CreateIfNotExists(); 

    return queue; 
} 

そして、これはメッセージを処理する機能アプリです:

[FunctionName("ProcessQueue")] 
public static async Task Run([QueueTrigger("queue-name", Connection = "AzureWebJobsStorage")]string queueItem, TraceWriter log) 
{ 
    if (String.IsNullOrEmpty(queueItem)) 
    { 
     return; 
    } 

    var queueModel = JsonConvert.DeserializeObject<QueueModel>(queueItem); 
    if (queueModel == null) 
    { 
     return; 
    } 

    try 
    { 
     // process the message 
    } 
    catch (Exception ex) 
    { 
     // message is moved to the poison-queue but no exception is thrown 
     log.Error(ex.Message, ex); 
    } 
} 
+0

関数の実行回数は分かりますか? 〜500回実行されますか? –

+0

〜500回実行されるはずですが、残りのメッセージが毒キューに移動されるまで約300回実行されます。 – GicaGG

+4

あなたのreproのコードを追加してください – Mikhail

答えて

0

は、問題を発見しました。問題は、同じキューを聴いて、現在の関数appと並行してメッセージを処理した残った関数アプリケーションでした。どちらの機能アプリも同じキューのメッセージを処理したため、ある時点でキューに残っているメッセージはすべてポイズンキューに移動されました。 (たぶんキューからメッセージを読むときにいくつかの並行性の問題が問題になった)。

関連する問題