2016-06-23 3 views
2

Ich habe eine Azure WebJob erstellt Griff zwei verschiedene benutzerdefinierte Nachrichten in einer einzigen ServiceBus Warteschlange zu behandeln.Kann ein kontinuierlicher C# WebJob automatisch Unterschied Nachrichtentypen in einer einzigen ServiceBus Warteschlange

Wird dies durch die automatische Deserialisierung unterstützt?

also lege ich nur zwei Funktionen, die jeweils mit den gleichen ServiceBusTrigger aber einem anderen Nachricht Parametern:

public static void ProcessMessageA([ServiceBusTrigger("MessageQueue")] MessageA message) { ... } 
public static void ProcessMessageB([ServiceBusTrigger("MessageQueue")] MessageB message) { ... } 

Ich habe dies versucht, aber es funktioniert nicht, so muß ich BrokeredMessage zu handhaben und manuell deserialisieren und die Nachrichten entsprechend behandeln?

Antwort

0

Das Problem hierbei ist, dass der webjob SDK keine Ahnung hat, die Nachricht vom Typ A oder B ist

So wie Sie sagen, Sie haben die Möglichkeit, Deserialisieren manuell die brokered Nachricht. Ich denke, dass Sie eine Eigenschaft auf Ihrer vermittelten Nachricht hinzufügen sollten, um den Typ der Nachricht anzugeben.

So eine Nachricht senden es so etwas wie das sein könnte:

// Create the object you want to send 
var messageA = new MessageA(); 
... 

// Create the borkered message 
var message = new BrokeredMessage(messageA); 

// Add a property 
message.Properties["messageType"] = "MessageA"; 

// Send the message 
... 

So, jetzt nur Sie eine Funktion in Ihrem webjob haben

public static void ProcessMessageA([ServiceBusTrigger("MessageQueue")] BrokeredMessage message) 
{ 
    var messageType = (string) message.Properties["messageType"]; 
    if (messageType == "MessageA") 
    { 
     // Deserialize the message 
     var messageA = message.GetBody<MessageA>(); 
     // Process the message 
    } 
    else if (messageType == "MessageB") 
    { 
     // Deserialize the message 
     var messageB = message.GetBody<MessageB>();; 
     // Process the message 
    } 
} 

Ansonsten können Sie getrennte Warteschlangen erstellen für jede Art von Nachricht Oder erstellen Sie eine service bus topic mit zwei Abonnements.

Beim Erstellen eines Abonnements können Sie einen Filter angeben.

string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); 

var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 

// Create the topic 
namespaceManager.CreateTopic("TestTopic"); 

// Create subscription to handle message A 
namespaceManager.CreateSubscription("TestTopic", "MessageA", new SqlFilter("messageType = 'MessageA'")); 
// Create subscription to handle message A 
namespaceManager.CreateSubscription("TestTopic", "MessageB", new SqlFilter("messageType = 'MessageB'")); 

So jetzt können Sie zwei verschiedene Funktionen in Ihrem Webjob haben, um MessageA und MessageB zu behandeln.

public static void ProcessMessageA([ServiceBusTrigger("TestTopic", "MessageA")] MessageA message) { } 

public static void ProcessMessageB([ServiceBusTrigger("TestTopic", "MessageB")] MessageB message) { } 
0

Versuchen Sie folgendes: ein Datacontract Attribut Klassendefinition hinzufügen, so etwas wie:

[DataContract(Namespace = "JobTransactionTopic.Notification")] 
public class Notification 
{ 
    #region Public Properties 

    [DataMember] 
    public string Description { get; set; } 

    [DataMember] 
    public int LoginId { get; set; } 


    [DataMember] 
    public string Title { get; set; } 

    #endregion 
} 

Wenn zwei Klassen unterschiedlich sind, dann vielleicht der Serializer Lage sein wird, zwischen ihnen zu unterscheiden. Es ist wichtig, dass der Sender und der Empfänger denselben Namensraum teilen und dass die Klassendefinition auf beiden Seiten gleich ist.

Lassen Sie uns wissen, ob es hilft, ich bin neugierig.

Verwandte Themen