【Azure Services Platform Step by Step-第11篇】Windows Azure兰州拉面馆-日志与队列的使用...
在第9篇里,为了便于大家理解,我把Windows Azure的环境比喻成了"Azure兰州拉面馆"。本篇我们继续沿用这个比喻,讲讲Windows Azure中的队列(Queue Storage)与日志的使用。
Queue Storage在【Azure Services Platform Step by Step-第9篇】Windows Azure Storage概览里介绍过,这里就不再重复了。顾名思义,Queue就是队列,按照先进先出的顺序来处理数据。在上图的“Azure兰州拉面馆”中,Queue就充当了记录点菜情况的小本子,前台服务员将顾客点的菜记录在Queue中,后台厨房的厨师则按照Queue中的顺序,一个一个地做菜(处理数据)。
Windows Azure Log是整个Azure平台运行情况的日志。微软官方把Windows Azure比喻成“云平台的操作系统”,既然是操作系统,当然会维护日志了!Windows Azure里提供了非常简单记录日志的办法,但很遗憾地是没有提供同样简单地查看日志的办法——换句话说,通过程序记录日志容易,查看日志繁琐。为了不偏题,本篇只展示如何在Development Fabric里查看日志。对于如何编程读取日志,感兴趣的读者可以参考WPF应用程序AzureLogViewer的源代码(见篇末附件)。
实验步骤:
第一步:
在VS2008中新建Web And Worker Cloud Service。这也是本系列文章中第一次用到Worker Role。
与第9篇一样,添加对StorageClient的引用。
第二步:
运行Azure SDK里的 和 ,并启动Development Storage里的Queue服务。
第三步:
配置好ServiceConfiguration.cscfg和ServiceDefinition.csdef。如有疑问,请参考【Azure Services Platform Step by Step-第8篇】开发部署Azure留言板或本文篇末附件内的示例代码。
第四步:
打开Web Role项目的Default.aspx,拖入以下控件:
TextBox txtMessage
Button btnSend
TextBox txtLog
第五步:
在Button btnSend的Click中加入btnSend_Click。代码如下。
protected void btnSend_Click(object sender, EventArgs e) { //读取Queue服务的配置。注意:RoleManager.GetConfigurationSetting获取的是 //service configuration(即ServiceConfiguration.cscfg文件)里的配置。 Uri baseUri = new Uri(RoleManager.GetConfigurationSetting("QueueEndpoint")); string accountName = RoleManager.GetConfigurationSetting("AccountName"); string accountKey = RoleManager.GetConfigurationSetting("AccountSharedKey"); //初始化StorageAccountInfo实体。 StorageAccountInfo account = new StorageAccountInfo( baseUri, null, accountName, accountKey); //创建一个QueueStorage(即Queue Storage服务)的实体 QueueStorage service = QueueStorage.Create(account); //创建一个MessageQueue(即队列)的实体。 //这个queue就是咱们Azure拉面馆的“记菜本”了 //我们把这个记菜本取名为"message"。 MessageQueue queue = service.GetQueue("messages"); //判断当前Queue Storage服务中是否已经存在"message" if (!queue.DoesQueueExist()) { queue.CreateQueue(); } //把点菜信息记录到记菜本中! Message msg = new Message(txtMessage.Text); queue.PutMessage(msg); txtLog.Text += "\n你在"+DateTime.Now.ToString("HH点mm分ss秒")+"点了一份\"" + txtMessage.Text.Trim()+'\"'; txtMessage.Text = string.Empty; }
最关键的就是一步:queue.PutMessage(msg); 就这样很轻松地把消息存入队列了。
第六步:
打开WorkerRole项目里的WorkerRole.cs。我们首先要对Start()进行override 。
Start()函数可以理解为Worker Role的入口函数。一旦Worker Role被部署,就会触发Start()。
我们讨论过,Worker Role的牛X之处就是可以让一段程序一直在运行。如何做到呢?只需把Start()方法写成一个死循环方法就好了。
public override void Start() { // 初始化账户信息 Uri baseUri = new Uri(RoleManager.GetConfigurationSetting("QueueEndpoint")); string accountName = RoleManager.GetConfigurationSetting("AccountName"); string accountKey = RoleManager.GetConfigurationSetting("AccountSharedKey"); StorageAccountInfo account = new StorageAccountInfo( baseUri, null, accountName, accountKey); QueueStorage service = QueueStorage.Create(account);
// 取得对这个名叫"message"的记菜本Queue的引用 MessageQueue queue = service.GetQueue("messages"); // 构造死循环
while (true) {
// 死循环中的程序每一秒执行一次
Thread.Sleep(10000); if (queue.DoesQueueExist()) {
// 取得记菜本中的当前应该处理的消息
Message msg = queue.GetMessage(); if (msg != null) {
// 记录Windows Azure Log
RoleManager.WriteToLog("Critical", string.Format("大厨已经在{0}把{1} 做好了。",DateTime.Now.ToString("HH点mm分ss秒"), msg.ContentAsString()));
// 记录删除刚才已经处理的那条消息
queue.DeleteMessage(msg); } } } }
这段程序中,值得注意的有三处:
- 获取当前应该处理的数据:Message msg = queue.GetMessage(); 既然是队列,就必须按照先进先出的顺序来操作数据。使用者也只能通过GetMessage方法取得队列中最靠前的那条数据,不能取到其他数据。就像是排队买火车票,售票员只能卖给排到队伍最靠前的那个人。
- 删除消息:queue.DeleteMessage(msg); 这又像是排队买火车票,当排在最前面的那位仁兄买到票后,他应该马上从队伍中消失。
- RoleManager.WriteToLog(string eventLogName,string message)方法。
这就是上文提到的,非常简单好用的记录日志的方法。用过log4net的程序员一看就明白,这简直是一个“山寨版”的log4net。它借鉴了log4net记录日志的模式,又阉割了log4net的配置和自定义格式功能。
Azure Log支持的EventLog类型共有Critical,Error,Warning,Information,Verbose这5种。如果你没用过log4net或不明白EventLog类型的意思,可以尝试这样理解:Azure Log把日志分为5类;分类记录日志更加便于查看。本例中使用的是"Critical”,也只是为了方便查看而已。
第七步:
F5运行程序。此时我们的Azure兰州拉面馆就正式在Development Fabric中开业了!
打开Development Fabric看看。
选择我们刚部署的服务中的Worker Role,点击右键,选择"Clear logs”清屏,再选择Logging Level- Critical 。这就是对日志进行分类查看,我们选择了查看Criticial类别是因为我们在记录点菜信息时使用了Critical 。
第八步:
测试一下吧 :)
看,我们点菜,大厨依次做菜!
随便看一条数据吧,比如“(兰州版)扬州炒饭”这一项,我们在01点29分58秒的时候将它写入Queue。大厨发现Queue中有它后,在00点30分04秒中处理了它。
梳理一下流程:
点菜 - 把菜名写入Queue - 大厨每秒钟查看一次Queue,如果Queue中有需要做的菜,则按照先来后到的顺序做菜 -从记菜本中删除刚做好的菜 - 把做菜信息写入Azure Log中
到目前为止,我们掌握了:获取Queue Storage的引用、建立Queue、插入数据到Queue中(入队)、从Queue中取出数据(出队)、记录Azure系统日志、查看Azure系统日志。
———患侏儒症的分割线———
【附件】:
传说中的万能StorageClient:StorageClient.rar
WPF应用程序Azure Log Viewer源代码:AzureLogViewer.zip
本文实验全部源代码:QueueStorage.rar
【Azure Services Platform Step by Step-第11篇】Windows Azure兰州拉面馆-日志与队列的使用...相关推荐
- 【Azure Services Platform Step by Step-第1篇】INTRODUCING THE AZURE SERVICES PLATFORM
Azure,这个简单优美的单词,从2008年11月28日开始,被赋予了另所有程序员心潮澎湃的意义.对,她就是庞大的微软帝国的一次豪赌. Azure,全程Azure Services Platform. ...
- 【Azure Services Platform Step by Step-第5篇】.NET Services 概述
在云端运行应用程序.存储和处理数据只是云计算的一部分.我们还想搭建云端服务(cloud-based services).云端服务当然和普通的服务不同了,需要更多的管理和约束..NET Services ...
- Azure Services Platform
配合微软的云计算战略,微软即将推出Windows 7和Windows Cloud(Windows 云),同时在开发平台方面,推出了一个新的所谓Azure Services Platform http: ...
- 【Azure Services Platform Step by Step-第14篇】使用Azure版的ASP.NET Application Providers
ASP.NET Application Providers相信大家都已经非常熟悉,它为我们开发ASP.NET应用程序提供了方便. 比如在Visual Studio控件工具箱中的Login部分,就是基于 ...
- 微软Windows Azure云应用开发实践
2009年10月27日,微软首席架构师Ray Ozzie在洛杉矶的开发者大会(PDC)上宣布了Azure Services Platform平台,2010年1月Windows Azure正式发布,20 ...
- 微软Windows Azure Platform技术解析
近两年IT领域里没有任何一项技术能够像云计算(Cloud Computing)一样引起如此多的关注,Google.Amazon.IBM.HP.Dell.Sun.Intel.Oracle和Microso ...
- 【Azure Data Platform】ETL工具(13)——ADF并行加载多个文件
本文属于[Azure Data Platform]系列. 接上文:[Azure Data Platform]ETL工具(12)--ADF 参数 本文介绍ADF 的并行导入多个文件 前言 在一个数据类的 ...
- 【Azure Data Platform】ETL工具(8)——ADF 数据集和链接服务
本文属于[Azure Data Platform]系列. 接上文:[Azure Data Platform]ETL工具(7)--ADF copy data 详解 本文介绍ADF 的数据集 和链接服务 ...
- 【Azure Data Platform】ETL工具(6)——重新认识Azure Data Factory
本文属于[Azure Data Platform]系列. 接上文:[Azure Data Platform]ETL工具(5)--使用Azure Data Factory数据流转换数据 前面开篇第一章主 ...
最新文章
- char和varchar的区别以及尾部空格问题 - sqlserver演示
- 2021-04-21--中标麒麟--yum源修改
- 索尼 android l,家庭影院级音质 索尼Xperia i1参数全曝光
- 通过jquery-ui中的sortable来实现拖拽排序
- 图像 理想低通滤波_图像处理之滤波(下)
- 飞康任命Gartner前分析师担任亚洲区市场总监
- 信息学奥赛一本通 1342:【例4-1】最短路径问题
- Week04《Java程序设计》第四周学习总结
- 南通市城管局推动“数字化城管”向“智慧城管”升级
- 2018圆通科技面试题目
- android系统测试模式,Framework基础:手机如何进入meta测试模式
- protobuf报错:protoc did not exit cleanly. Review output for more information.
- 记一次kali搭建vulfocus环境
- ISO22000认证|企业申请ISO22000认证资料自查
- Apache配置与应用
- 传统企业如何建设B2C平台做网络营销?
- origin两个图层图例合并_origin处理数据怎么添加图例 origin作图怎么添加
- 批处理find 命令使用
- 代购网店:iPad 2最快后天抵沪
- DSP关键字cregister (关于IER,IFR找不到定义)