我创建了一个Azure WebJob来处理单个 ServiceBus队列中的两个不同的自定义消息。
这是否由自动反序列化支持?
即。我可以创建两个函数,每个函数具有相同的ServiceBusTrigger
但不同的消息参数:
public static void ProcessMessageA([ServiceBusTrigger("MessageQueue")] MessageA message) { ... }
public static void ProcessMessageB([ServiceBusTrigger("MessageQueue")] MessageB message) { ... }
我已经尝试了这个但它不起作用,所以我必须处理BrokeredMessage
并手动反序列化并处理相应的消息吗?
答案 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
}
如果你的两个类不同,那么序列化器可能能够区分它们。重要的是发送方和接收方共享相同的命名空间,并且类定义在两方都是相同的。
如果有帮助,请告诉我们,我很好奇。