2 votes

Un WebJob C# continu peut-il traiter automatiquement différents types de messages dans une seule file d'attente ServiceBus ?

J'ai créé un Azure WebJob pour gérer dos différents messages personnalisés dans un simple File d'attente du ServiceBus.

Est-ce que cela est pris en charge par la désérialisation automatique ?

c'est-à-dire que je peux créer deux fonctions, chacune avec la même ServiceBusTrigger mais un paramètre de message différent :

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

J'ai essayé mais ça ne marche pas, je dois donc gérer BrokeredMessage et désérialiser et traiter manuellement les messages comme il convient ?

0voto

Thomas Points 7717

Le problème ici est que le SDK de webjob n'a aucune idée de quel message est de type A ou B.

Donc, comme vous l'avez dit, vous avez la possibilité de désérialiser manuellement le message négocié. Je pense que vous devriez ajouter une propriété sur votre message brokered pour spécifier le type du message.

Donc pour envoyer un message, ça pourrait être quelque chose comme ça :

// 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
...

Donc maintenant vous n'avez qu'une seule fonction dans votre webjob

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
    }
}

Sinon, vous pouvez créer des files d'attente distinctes pour chaque type de message. Ou créer une sujet sur le bus de service avec deux abonnements.

Lors de la création d'un abonnement, vous pouvez spécifier un filtre.

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'"));

Maintenant, vous pouvez avoir deux fonctions différentes dans votre webjob pour gérer MessageA et MessageB.

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

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

0voto

user1075679 Points 21

Essayez ceci : ajoutez un attribut de contrat de données à la définition de votre classe, quelque chose comme :

[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
}

Si vos deux classes sont différentes, le sérialiseur sera peut-être capable de les distinguer. Il est important que l'émetteur et le récepteur partagent le même espace de noms et que la définition de la classe soit la même des deux côtés.

Faites-nous savoir si ça vous aide, je suis curieux de le savoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X