2017-05-10 6 views
0

データベースに挿入する必要があるレコードを持つキューを処理するAzure関数があります。その働くファイン。しかし、私は30秒ごとにレコードを確認できるように、queueTriggerの代わりにTimerトリガーを使いたいと思っていました。誰か助けてもらえますか? https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timerに記載されているタイマーの基本的な実装を試しましたが、どのようにレコードを処理できるのか分かりません。Azureのタイマートリガーの使用キュー処理の機能

+0

この場合、手動でキューをポーリングする必要があります。なぜあなたはこの変更を望んでいますか? – Mikhail

+0

@Mikhailと同じ質問なぜこれを行う必要がありますか?キューを入力として持つアイデアは、キュー内のメッセージを同時に処理するだけでなく、その機能を処理するメッセージが実行されない場合もあります。 –

+0

私たちは大きなキューを持っています(一度に処理されるレコード数は100万になるかもしれません)ので、関数は新しい関数Appインスタンスを読み込んで処理します。インポートするデータの特定のバッチがあるので、消費計画を使用しますが、その後はキュー内で何日もアクティビティがない可能性があります。したがって、我々はTimerを使用して、一度にFunction Appのインスタンスが1つだけスピンされるようにしたいと考えました。 @ christian-melendez –

答えて

0

最後のコメントに基づいて、キュートリガーを使用する必要がない場合(メッセージが多すぎる場合は問題ありません。Azureは、すべてのメッセージを処理するために必要なリソースを拡大/縮小しますあなたは、しかし、それはしばらくのために実行するために高価になることができます)あなたは単にConsole Appで使用する同じコードをAzure関数にアップロードすることができます。ここで

は、C#でキューからデータを消費する方法の例です:https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-queues

あなただけ.csxスクリプト(あなたがのMainメソッドに入れたコードとして実行するコードを適応させる必要がありますコンソールアプリケーションは、.csxスクリプトのRunメソッドに入れたコードと同じコードになります)。

+0

私は既にキュートリガーの助けを借りて、キューを正常に使用しています。この関数は、キューに新しいレコードがあるときに自動的にトリガされます。 queueTriggerではなくTimerトリガーを使用してキューを遅延させ、Azureのすべてのリソースを消費しないようにしたいと考えました。 –

+0

申し訳ありませんが私は私の答えではっきりしていないと思う、私は5分未満でキューからメッセージをプルできるようにする例を入れて、Azure関数に同じコードをアップロードし、引き金。 –

0

キュー入力バインディングを使用してCloudQueueにバインドできます。

ここに、キューからメッセージをフェッチするTimerTriggerのサンプルコードを示します。

Function.json

{ 
    "bindings": [ 
    { 
     "type": "timerTrigger", 
     "name": "myTimer", 
     "schedule": "0 * * * * *", 
     "direction": "in" 
    }, 
    { 
     "type": "queue", 
     "name": "clQueue", 
     "queueName": "myqueue", 
     "connection": "", 
     "direction": "in" 
    } 
    ], 
    "disabled": false 
} 

Run.csx

#r "Microsoft.WindowsAzure.Storage" 

using Microsoft.WindowsAzure.Storage.Queue; 

public static async Task Run(TimerInfo myTimer, CloudQueue clQueue, TraceWriter log) 
{ 
    var message = await clQueue.GetMessageAsync(); 
    log.Info($"{message.As​String}");   

    clQueue.DeleteMessage(message); 
} 
+0

これはきれいに見えます。間違いなくこれを試みます。ありがとう。 –

+0

タイプをキューとして認識する際にエラーが発生しています。何か案は? –

+0

スキーマの検証に入力タイプとしてのキューがまだありません。ただし、ランタイムエラーは発生しません。コードは正常に実行されるはずです。 – Naren

0

これは私のために働いていた答えである: 使用した場合のAzureキューまたはServiceBusキューへの直接結合はありませんタイマートリガー。関数またはコンソールアプリケーションを使用していない場合は、キュー接続と書き込みロジックを自分で記述する必要があります。 ServiceBus Queueから単一のメッセージを読み取るための例として、次のようなものがあります。

var connectionString = "Endpoint = sb://.servicebus.windows.net/; SharedAccessKeyName = RootManageSharedAccessKey; SharedAccessKey =" "; var queueName = "";

var client = QueueClient.CreateFromConnectionString(connectionString、queueName); var message = client.Receive();

関連する問題