Azure存储队列-CloudQueueMessage不同类型
我在Azure存储中有一个队列,我希望能够将不同的消息类型添加到队列中,并将它们解析为它们的特定类型 比如说Azure存储队列-CloudQueueMessage不同类型,azure,azure-storage,azure-queues,azure-storage-queues,Azure,Azure Storage,Azure Queues,Azure Storage Queues,我在Azure存储中有一个队列,我希望能够将不同的消息类型添加到队列中,并将它们解析为它们的特定类型 比如说 public class Customer { public Customer() { } public string Name { get; set;} public string Email { get; set;} public string Address { get; set;} } public class Employee {
public class Customer
{
public Customer()
{
}
public string Name { get; set;}
public string Email { get; set;}
public string Address { get; set;}
}
public class Employee
{
public Employee()
{
}
public string Id { get; set;}
public string Name { get; set;}
public string Email { get; set;}
}
我可以将它们序列化为JSON并将它们添加到队列中,但是如何在不知道消息类型的情况下将它们反序列化为其特定类型呢
我如何知道下一条消息是客户还是员工?我是否可以在留言中添加一些属性:“这是客户”或“这是员工”
因为我有一个工作者角色,它将在队列中查找消息,并根据类型执行特定操作
get message from queue
If message = customer
do this
else if message = employee
do that
else
do nothing
我在一个项目中做了以下工作 将消息类型存储为
代理消息
的属性(其中实体
是我要发送的类):
在接收方,我使用此扩展方法来获取正确类型的消息:
public static object GetBodyOfType(this BrokeredMessage msg)
{
var ofType = Type.GetType(msg.ContentType);
var method = typeof(BrokeredMessage).GetMethod("GetBody", new Type[] { });
var generic = method.MakeGenericMethod(ofType);
return generic.Invoke(msg, null);
}
然后,我的实际接收者执行此操作(receivedMessage
是一条代理消息
):
这给了我msg
,这是我排队的类型
我使用这个的模式与您描述的相似。我将命令排入ServiceBus队列,并具有单个工作角色,该角色处理通过命令处理程序接收到的任何命令。到目前为止,它工作得很好
编辑:我刚刚意识到您提到了存储队列,而上面是我用于服务总线的。希望该解决方案能够应用。Azure存储客户端库不提供对队列消息反序列化的明确支持。因此,请检查用于此目的的序列化程序。例如,如果您正在使用,则可以在序列化/反序列化期间使用来处理继承。我以前曾经这样做过。我已经将对象的类型记录为字符串,然后添加了一些分隔符:
,然后添加了json序列化字符串
因此,我的信息如下所示:
MyProject.Domain.Model.Product#{'Id':'42','ProductName':'SuperHumanEnchancer'}
在返回的过程中,您读取分隔符符号之前的任何内容,并将其视为类型名。分隔符符号后的字符串将是json序列化字符串。您的解决方案适用,除非他需要创建自己的包装器数据类型。包装器可以公开有关消息类型的信息,就像BrokeredMessage类型一样。
var msg = receivedMessage.GetBodyOfType();
MyProject.Domain.Model.Product#{'Id':'42','ProductName':'SuperHumanEnchancer'}