连续的C#WebJob可以自动处理单个ServiceBus队列中的差异消息类型

时间:2016-06-23 11:16:05

标签: c# azure azure-webjobs azure-webjobssdk

我创建了一个Azure WebJob来处理单个 ServiceBus队列中的两个不同的自定义消息。

这是否由自动反序列化支持?

即。我可以创建两个函数,每个函数具有相同的ServiceBusTrigger但不同的消息参数:

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

我已经尝试了这个但它不起作用,所以我必须处理BrokeredMessage并手动反序列化并处理相应的消息吗?

2 个答案:

答案 0 :(得分: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) { }

答案 1 :(得分: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
}

如果你的两个类不同,那么序列化器可能能够区分它们。重要的是发送方和接收方共享相同的命名空间,并且类定义在两方都是相同的。

如果有帮助,请告诉我们,我很好奇。