Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化 Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证

编程之家收集整理的这篇文章主要介绍了Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化 Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

上一篇中,我们介绍了消息的顺序收发保证:

Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证

在本文中我们主要介绍下复杂对象消息是否需要支持序列化以及消息的持久化。

在实际的业务应用开发中,我们经常会将复杂业务对象放到消息里面,实现异构系统之间的集成、模块间的解耦等等。

同时,我们还比较关注消息队列服务是否支持消息的持久化,消息队列如果宕机后持久化的消息是否可以还原?

在Azure Messaging的官方说明中,没有特地的介绍复杂对象消息是否需要支持序列化的要求,但是,我们在上篇博文中,有个消息创建方法,as following,

BrokeredMessage类的构造函数

//
        // Summary:
             Constructor that creates a BrokeredMessage from a given object using the
             provided XmlObjectSerializer
         Parameters:
           serializableObject:
             The serializable object.
           serializer:
             The serializer object.
         Exceptions:
           System.ArgumentNullException:
             Thrown when null serializer is passed to the method with a non-null serializableObject
         Remarks:
             You should be aware of the exceptions that their provided Serializer can
             throw and take appropriate actions. Please refer to for a possible list of
             exceptions and their cause.
        public BrokeredMessage(object serializableObject,XmlObjectSerializer serializer);

看来消息的构造,支持动态传入XmlObjectSerializer,so,

 1         /// <summary>
 2         /// 构造消息
 3         </summary>
 4         <param name="serializableObject">可序列化的对象</param>
 5         <returns>消息</returns>
 6         public BrokeredMessage Create(Object serializableObject)
 7         {
 8             var serializer = new DataContractSerializer(serializableObject.GetType(), 9                 new DataContractSerializerSettings() { IgnoreExtensionDataObject = true,PreserveObjectReferences = true });
10             var message =  BrokeredMessage(serializableObject,serializer);
11             message.Properties.Add("Type",serializableObject.GetType().ToString());
12 
13             return message;
14         }

接下来,我们用上一篇中的代码,做一个复杂对象消息收发的测试,我们还是用上次的SalesOrder类,但是增加一个SalesOrderItem集合和双向关联,来描述销售订单和销售订单明细的的1:n的业务领域模型。

using System;
 System.Collections.Generic;
 System.Linq;
 System.Text;
 System.Threading.Tasks;

namespace AzureMessaging.FIFO
{
    <summary>
     销售订单类
    </summary>
    public class SalesOrder
    {
        <summary>
         订单ID
        </summary>
        string OrderID { get; set; }

         订单编号
        string Code {  创建时间
        public DateTime CreateTime {  总价格
        public Decimal TotalPrice {  产品ID
        int ProductID { ; }

        private List<SalesOrderItem> items;

         销售订单明细
        public List<SalesOrderItem> Items
        {
            get
            {
                if (items == null)
                    items = new List<SalesOrderItem>();

                 items;
            }
            
            {
                items = value;
            }
        }
    }
}
 销售订单明细
     SalesOrderItem
    {
         标识
        string ID {  客户ID
        int CustomerID {  所属的销售订单ID
        string SalesOrderID
        {
            if (Order != )
                     Order.OrderID;

                return .Empty;
            }
        }

         所属的销售订单
        public SalesOrder Order { ; }
    }
}

创建销售订单实例类方法

  private static SalesOrder CreateSalesOrder(int i)
        {
            var order = new SalesOrder() { OrderID = i.ToString(),Code = SalesOrder_" + i,CreateTime = DateTime.Now,ProductID = 17967,TotalPrice = new decimal(19999) };
            order.Items.Add(new SalesOrderItem() { ID = Guid.NewGuid().ToString(),Order = order,CustomerID = 1234567 });

             order;
        }

在构造SalesOrder和SalesOrderItems时,我们做了双向关联。
消息顺序收发测试:

 1  Microsoft.ServiceBus.Messaging;
 2  3  4  5  6  System.Threading.Tasks;
 7 
 8  AzureMessaging.FIFO
 9 {
10      Program
11     {
12         static readonly string queueName = OrderQueue;
13         void Main([] args)
14 15             MessageSend();
16             Console.ReadKey();
17 
18             MessageReceive();
19 20         }
21 
22         23          发送消息
24         25         void MessageSend()
26 27             var sbUtils =  ServiceBusUtils();
28 
29             创建队列
30             sbUtils.CreateQueue(queueName,false);
31 
32             顺序发送消息到OrderQueue
33             var queueSendClient = sbUtils.GetQueueClient(queueName);
34             for (int i = 0; i < 10; i++)
35             {
36                 var order = CreateSalesOrder(i);
37                 var message = sbUtils.Create(order);
38                 queueSendClient.Send(message);
39                 Console.WriteLine(string.Format(Send {0} MessageID: {1}40             }
41 
42             Console.WriteLine(Send Completed!43 44 
45         46          接收消息
47         48          MessageReceive()
49 50             int index = 051             BrokeredMessage msg = 52             53             var queueReveiveClient = sbUtils.GetReceiveQueueClient(queueName,ReceiveMode.ReceiveAndDelete);
54             while ((msg = queueReveiveClient.Receive(TimeSpan.FromMilliseconds(3))) != 55 56                 Console.WriteLine(Received {0} MessageID: {1}57                 index++58 59 
60             /删除队列
61             sbUtils.DeleteQueue(queueName);
62 
63             Console.WriteLine(Receive Completed!64 65 
66          i)
67 68             ) };
69             order.Items.Add(70 
71              order;
72 73     }
74 }

 

可以看出,复杂对象消息只要指定适当的XmlObjectSerializer,即可。

在双向引用这种领域模型的设计场景下,我们配置了PreserveObjectReferences = true

true });

解决了序列化时循环引用的问题。
关于消息的持久化,Azure messaging有官方的说明:所有的队列都是持久化的,持久化存储是sql Server,不提供内存中的消息队列。

毕竟是PaaS层的消息队列服务,消息的持久化和高可用性微软还是有保障的。

 

本篇中我们介绍并验证了Azure Messaging Service Bus复杂对象消息是否需要支持序列化和消息持久化,下一篇我们继续介绍消息的重复发送问题。

 

周国庆

2017/3

 

总结

以上是编程之家为你收集整理的Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化 Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证全部内容,希望文章能够帮你解决Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化 Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

相关文章

猜你在找的Azure相关文章

这个错误发生在SPFX webpart需要请求Azure AD token的时候,全部错误信息如下: {&quot;error&quot;:&quot;invalid_grant&quot;,&quo
Azure是微软提供的一个云服务平台。是全球除了AWS外最大的云服务提供商。Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务。这里的Azure是Azure国际不是
前几次我们演示了如何通过Azure静态web应用功能发布vue跟blazor的项目(使用 Azure静态web应用+Github全自动部署VUE站点、使用Azure静态Web应用部署Blazor We
什么是Azure Blob Stoage Azure Blob Stoage 是微软Azure的对象存储服务。国内的云一般叫OSS,是一种用来存储非结构化数据的服务,比如音频,视频,图片,文本等等。用
Azure Cosmos DB 是 Microsoft 提供的全球分布式多模型数据库服务。Cosmos DB是一种NoSql数据库,但是它兼容多种API。它支持SQL, MongoDB、Cassand
内容审查器 Azure 内容审查器也是一项认知服务。它支持对文本、图形、视频进行内容审核。可以过滤出某些不健康的内容,关键词。使你的网站内容符合当地的法律法规,提供更好的用户体验。 文本内容审核 其中
上一篇 Azure 内容审查器之文本审查我们已经介绍了如果使用Azure进行文字内容的审核。对于社区内容,上传的图片是否含有羞羞内容也是需要过虑的。但是最为一般开发者自己很难实现这种级别的智能识别。但
什么事Azure静态web应用 Azure 静态 Web 应用是一种服务,可从 GitHub 存储库自动构建完整的堆栈 Web 应用,并将其部署到 Azure,目前它还是预览版。 Azure 静态 W
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注