2016-07-15 16 views
0

Ich habe drei Warteschlangen und einen Arbeiter, die ich überwachen mag, dass die drei Warteschlangen (oder nur zwei von ihnen)Wie Azure Service Bus-Nachrichten aus mehreren Warteschlangen mit einem Arbeiter

Eine Warteschlange ist qPirate Eine Warteschlange ist qShips lesen Eine Warteschlange ist qPassagiers

Die Idee ist, dass Arbeiter entweder alle 3 von ihnen, 2 von ihnen oder einer von ihnen betrachten und verschiedene Dinge tun, je nachdem, was die Nachricht sagt.

Der Schlüssel ist jedoch, dass eine Nachricht fehlschlägt, weil ship1 offline ist, alle Warteschlangen in qships werden aktualisiert, Arbeiter, die das betrachten und andere Warteschlangen werden etwas davon aufgehängt, da sie versuchen werden, die Nachrichten zu verarbeiten für diese Warteschlange, während nur die anderen Warteschlangen ein wenig betrachtet werden, während die anderen Arbeiter, die die anderen 2 Warteschlangen betrachten und qship überspringen, weiterhin über Nachrichten ohne Überfall oder Verzögerungen arbeiten werden.

Sich online umsehend Ich denke, das ist nicht etwas, das möglich ist, aber es scheint, als wäre es? Vielen Dank im Voraus oder so!

Edit1: Ich werde die Job-Host als auch hinzufügen, um zu versuchen, Dinge zu klären, ein wenig

 JobHostConfiguration config = new JobHostConfiguration() 
     { 
      DashboardConnectionString = "DefaultEndpointsProtocol=https;AccountName=PiratesAreUs;AccountKey=Yarr", 
      StorageConnectionString = "DefaultEndpointsProtocol=https;AccountName=PiratesAreUs;AccountKey=Yarr", 
      NameResolver = new QueueNameResolver() 
     }; 

     ServiceBusConfiguration serviceBusConfig = new ServiceBusConfiguration() 
     { 
      ConnectionString = "Endpoint=AllPirateQueuesLocatedHere;SharedAccessKeyName=PiratesAreUs;SharedAccessKey=Yarr"    
     }; 

     serviceBusConfig.MessageOptions.AutoComplete = false; 
     serviceBusConfig.MessageOptions.AutoRenewTimeout = TimeSpan.FromMinutes(1); 
     serviceBusConfig.MessageOptions.MaxConcurrentCalls = 1;    

     config.UseServiceBus(serviceBusConfig); 


     JobHost host = new JobHost(config); 

     host.RunAndBlock(); 

Auch die QueueNameResolverClass ist einfach

public class QueueNameResolver : INameResolver 
    { 
     public string Resolve(string name) 
     { 
      return name; 
     } 
    } 

ich nicht angezeigt haben um den NameResolver trotzdem mehrere Warteschlangen zu haben, kann ich sagen, dass ich möchte, dass der Jobhost einen bestimmten ServiceBus betrachtet. Ich weiß nicht, wie ich ihm sagen soll, dass er alle Warteschlangen im ServiceBus betrachten soll.

Ich möchte mehrere Servicebustriggers auf diesem Arbeiter, so dass, wenn eine Nachricht an qpirate1 und qships1 gesendet wird, die beide im Servicebus AllPirateQueuesHere befinden, der Arbeiter die Nachricht in qpirate1 aufnehmen, verarbeiten und dann auswählen kann up die Nachricht in qships1 und verarbeiten sie.

+0

Diese Nachrichten werden von Azure Webjobs verarbeitet? – JTaub

+0

Blick auf die Unterschrift, ja John. –

+0

@ ivan-s, kannst du bitte etwas mehr erklären? Ich habe wirklich einige Schwierigkeiten zu verstehen, was Sie erreichen möchten ... Danke – Thomas

Antwort

0

Ermittelt die Antwort ... Dies ist möglich und es ist einfacher als ich dachte, ich bin mir nicht sicher, warum ich die Punkte nicht verbunden habe, aber ich bin immer noch neugierig, warum es nicht mehr Dokumentation darüber gibt. Anscheinend ist es einfach, eine Funktion pro Warteschlange zu erstellen, in der ein Worker mehrere Warteschlangen betrachten soll. Wenn Sie also drei Warteschlangen haben, möchten Sie etwas wie das Folgende haben (Sie können jede Nachricht anders behandeln).

public static void GotMessage1([ServiceBusTrigger("%qPirate1%")] BrokeredMessage message) 
{ 
    var handler = new MessageHandler(); 

    var manager = new MessageManager(
     handler, 
     "Pirates" 
     ); 

    manager.ProcessMessageViaHandler(message); 
} 

    public static void GotMessage2([ServiceBusTrigger("%qShip1%")] BrokeredMessage message) 
{ 
    var handler = new MessageHandler(); 

    var manager = new MessageManager(
     handler, 
     "Ships" 
     ); 

    manager.ProcessMessageViaHandler(message); 
} 

    public static void GotBooty([ServiceBusTrigger("%qBooty%")] BrokeredMessage message) 
{ 
    var handler = new MessageHandler(); 

    var manager = new MessageManager(
     handler, 
     "Booty" 
     ); 

    manager.ProcessMessageViaHandler(message); 
}