2016-06-23 26 views
2

处理区别消息类型我已经创建了一个天青WebJob在单个 ServiceBus队列处理不同的自定义消息。可以在连续C#WebJob自动在单个ServiceBus队列

这是由automagic deserialisation支持吗?

即我能不能创建两个函数,每个具有相同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'")); 

所以现在你可以在你的webjob中有两个不同的函数来处理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 
} 

如果你的两个类是不同的,那么也许串行器将能够区分它们。发送者和接收者共享相同的名称空间并且类定义在双方中是相同的,这一点很重要。

让我们知道它是否有帮助,我很好奇。

相关问题