2016-04-02 10 views
1

Ich habe eine Node.js timerTrigger Azure-Funktion, die eine Sammlung verarbeitet und die Verarbeitungsergebnisse für die weitere Verarbeitung in eine Warteschlange stellt (durch eine Node.js queueTrigger-Funktion).Kann ich mehrere Elemente aus einer einzigen Ausführung einer Azure-Funktion in eine Warteschlange stellen?

Der Code ist so etwas wie die folgenden:

module.exports = function (context, myTimer) { 
    collection.forEach(function (item) { 
     var items = []; 

     // do some work and fill 'items' 

     var toBeQueued = { items: items }; 

     context.bindings.myQueue = toBeQueued; 
    }); 

    context.done(); 
}; 

Dieser Code wird nur die letzte toBeQueued Warteschlange und nicht jeder, den ich in die Warteschlange bin versucht.

Gibt es eine Möglichkeit, mehr als einen Artikel in die Warteschlange zu stellen?

aktualisieren

klar sein, ich spreche über eine toBeQueued in jeder Iteration von forEach Warteschlangen, nicht nur ein Array Warteschlangen. Ja, es gibt ein Problem mit Azure-Funktionen, aufgrund dessen ich ein Array nicht in die Warteschlange stellen kann, aber ich habe einen Workaround dafür; d.h. { items: items }.

Antwort

3

Noch nicht, aber wir werden das innerhalb der Woche angehen, bleib dran :) Du wirst in der Lage sein, ein Array an die Bindung zu übergeben, wie du oben versuchen willst.

Wir haben ein Problem, das dies in unserem öffentlichen Repo here verfolgt. Danke für die Berichterstattung.

+0

Danke für die Antwort und für den Verweis auf das Repository in GitHub. Ich denke, wir reden über 2 verschiedene Themen, habe ich recht? Ich aktualisiere die Frage, um diesen Punkt zu klären. – TheBlueSky

+0

Ich sehe die Unterscheidung. Für Node.js nach dem obigen Array-Fix ​​wird dieses Array von Nachrichten nur verarbeitet, ** nachdem ** Ihre Funktion zurückgibt. I.e. Es findet keine tatsächliche Nachrichtenwarteschlange statt, bis Ihre Funktion beendet ist. Ich denke, das wird die häufigsten Szenarien ansprechen. In Bezug auf die obige Problemumgehung für das Einreihen in ein Array - das führt nicht dazu, dass mehrere einzelne Warteschlangennachrichten geschrieben werden. Die Array-Unterstützung ist für Szenarien geeignet, in denen mehrere einzelne Nachrichten in die Warteschlange eingereiht werden müssen. – mathewc

+0

Ja, verstanden .. und wie du gesagt hast, habe ich die Problemumgehung nur verwendet, um das Array-Problem zu beheben. Also zurück zu meiner Frage, das Szenario, das ich versuche zu erreichen, wird nicht unterstützt, (1) wird es sein?, Und (2) was sind meine Optionen? – TheBlueSky

3

Mathewcs Antwort ist die richtige mit Knoten.

Für C# können Sie heute ICollector<T> als den Typ Ihrer Ausgabewarteschlangenparameter angeben.

Unten ist ein Beispiel von zwei Ausgabewarteschlangen, von denen ich eine über eine for-Schleife hinzufüge.

public static void Run(Item inbound, DateTimeOffset InsertionTime, ICollector<Item> outbound, ICollector<LogItem> telemetry, TraceWriter log) 
{ 
    log.Verbose($"C# Queue trigger function processed: {inbound}"); 

    telemetry.Add(new LogItem(inbound, InsertionTime)); 

    if(inbound.current_generation < inbound.max_generation) 
    { 
     for(int i = 0; i < inbound.multiplier; i++) { 
      outbound.Add(Item.nextGen(inbound)); 
     } 
    } 
} 
+2

Und es gibt auch einen IAsyncCollector mit AddAsync(). –