2016-06-23 8 views
2

Я создал Azure WebJob для обработки два различных пользовательских сообщений в очереди ServiceBus в одного.Может непрерывные C# WebJob автоматически обрабатывать типы сообщений разницы в одной очереди ServiceBus

Поддерживается ли это путем автоматизированной десериализации?

т.е. я могу просто создать две функции, каждая из которых с одной и той же ServiceBusTrigger, но с другим параметром сообщения:

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

Я попытался это, но он не работает, так что я должен обрабатывать BrokeredMessage и вручную десериализовать и обрабатывать сообщения по мере необходимости?

ответ

0

Проблема здесь состоит в том, что webjob SDK не имеет представления о том, какое сообщение имеет тип A или B.

Так как вы сказали, что вы имеете возможность десериализации вручную посредником сообщения. Я думаю, вы должны добавить свойство в своем брокерском сообщении, чтобы указать тип сообщения.

Так, чтобы отправить сообщение, что может быть что-то вроде этого:

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

Так что теперь у вас есть только одна функция в вашем 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 
    } 
} 

В противном случае вы можете создать отдельные очереди для каждого типа сообщение Или создайте service bus topic с двумя подписками.

При создании подписки вы можете указать фильтр.

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

Итак, теперь вы можете иметь две различные функции в своем веб-блоге для обработки MessageA и MessageB.

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

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

Попробуйте это: добавить DataContract атрибут вашего определения класса, что-то вроде:

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

Если два класса различны, то, возможно, сериализатору будет иметь возможность различать их. Важно, чтобы отправитель и получатель имели одно и то же пространство имен и что определение класса будет одинаковым с обеих сторон.

Сообщите нам, если это поможет, мне это интересно.