当前位置: 首页 > 编程日记 > 正文

【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的引用。

image

image

第二步:

运行Azure SDK里的imageimage ,并启动Development Storage里的Queue服务。

image

第三步:

配置好ServiceConfiguration.cscfg和ServiceDefinition.csdef。如有疑问,请参考【Azure Services Platform Step by Step-第8篇】开发部署Azure留言板或本文篇末附件内的示例代码。

image

第四步:

打开Web Role项目的Default.aspx,拖入以下控件:

TextBox txtMessage
Button btnSend
TextBox txtLog

image

第五步:
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);
}
}
}
}

这段程序中,值得注意的有三处:

  1. 获取当前应该处理的数据:Message msg = queue.GetMessage();  既然是队列,就必须按照先进先出的顺序来操作数据。使用者也只能通过GetMessage方法取得队列中最靠前的那条数据,不能取到其他数据。就像是排队买火车票,售票员只能卖给排到队伍最靠前的那个人。
  2. 删除消息:queue.DeleteMessage(msg);   这又像是排队买火车票,当排在最前面的那位仁兄买到票后,他应该马上从队伍中消失。
  3. 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 。

image

第八步:

测试一下吧 :)

image

看,我们点菜,大厨依次做菜!

随便看一条数据吧,比如“(兰州版)扬州炒饭”这一项,我们在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

相关文章:

这才是世界排名前十位的奢侈品

​​真正的奢侈品,不是豪车大宅,不是名包贵表,而是这些…… 1. 一颗童心2. 生生不息的信念3. 背包走天下的健康体魄4. 愉悦和舒心的工作环境5. 安稳平和的睡眠6. 享受属于自己空间与时间的生活7. 牵手一个教会你爱与被爱的人8. 品味美好的心情…

配置springmvc在其他类中(spring容器外)获取注入bean

今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,Resource和Autowired都不可以注入,因为spring不能为静态变量依赖注入。因此需要额外的方法获取spring管理的bean。本文即SpringContextHolder: 1 package com.…

声智科技完成2亿元B轮融资,将持续拓展语音交互产品的规模化落地

整理 | 一一出品 | AI科技大本营寒冬之下,不少创业公司依然得到了资本青睐。AI科技大本营消息,12 月 29 日消息,声智科技(SoundAI)已于近期完成 2 亿人民币 B 轮融资,本轮投资由毅达资本领投,峰…

360度看IT行业--3月12日西安工程大学讲座

2009年3月12日,一个绿色的好日子。当天晚上7点30分,在西安工程大学的讲座开始了。西安工程大学的孩子们很热情,大一大二的居多,虽然是非计算机专业,但提前就满满的坐在会场等待了。而且很关注IT行业,提了很…

专访中国移动钱岭:大数据更像是一种“倍增器”

记者 | 杨丽出品 | AI科技大本营(rgznai100)为把握时代特征,2016 年中国移动确定并大力推动“大连接”战略,并制定了“十三五”时期做大连接规模、做优连接服务、做强连接应用的三个目标。如今,这家企业已经拥有 9.16 亿移动端用户…

创业者应该如何看待金钱

什么是真正的赢?一个高智商、高情商的商人,经营企业追求的终极目标就是一个赢字:金钱、地位、豪宅、名车、美女、权利、荣耀,为了赢得这些,很多人曾不择手段,曾不断地苦苦寻找“如何以最小的投入快速获得最…

Exchange与ADFS单点登录 PART 2:部署和配置ADFS

在第一篇文章完了之后,我们就可以在我们的服务器上部署ADFS了,安装的方法很简单,直接在服务器管理器中添加功能角色即可,选择当前服务器并在服务器角色中选择ADFS。 完成之后我们需要对ADFS进行详细的配置,在服务器管理…

路由器和交换机的综合实验

路由器和交换机的综合实验<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />主要目标&#xff1a;1. 跨交换机&#xff08;二层交换机&#xff09;的相同VLAN 之间的通讯2. 不同VLAN之间的通讯1&#xff09; 通过路由器实现不同VL…

如何写出符合Python审美的代码风格?

作者 | Rocky0429来源 | Python空间本文为 AI科技大本营投稿文章&#xff08;欢迎给我们投稿&#xff0c;投稿请联系微信1092722531&#xff09;写在之前每个人都有自己的代码风格&#xff0c;随着写的行数增加&#xff0c;自己对于代码的审美也会变的不一样&#xff0c;这就像…

程序员都该懂点 HTTP

作者&#xff1a;developerHaozGithub 地址&#xff1a;developerHaoz说明&#xff1a;本文主要是对 HTTP 基础知识进行总结和归纳&#xff0c;毕竟做 IT 的&#xff0c;网络这一块还是很重要的 本文的主要内容HTTP 是什么URL 详解HTTP 之请求篇HTTP 之响应篇一、HTTP是什么1、…

谁的青春不迷茫,其实我们都一样

如果你为人生画一条浅浅吃苦底线&#xff0c;就别妄想跨越深邃的幸福极限。在熠熠生辉前&#xff0c;总要捱过一段孤独不安的日子。唯有担得起厚重的经历&#xff0c;才能禁得起岁月推敲。记住&#xff1a;一定要努力&#xff0c;但别着急。加油&#xff01; 很庆幸你能以这样好…

关于Iframe在IE6下不显示的bug

IE都出到IE8了,用IE6的人渐渐少了..但还是存在的.例如QAMM们在用. 所以,IE6下存在的问题也必须解决.这两天,我就遇到一个了: html<table> <tr> <td id"tdTest" runat"server"> <iframe id"ifrTest" h…

腾讯优图吴永坚:迈向深度学习,我们面临模型训练与推荐的双重考验

整理 | 琥珀出品 | AI 科技大本营对腾讯优图的发展历程&#xff0c;吴永坚表示&#xff0c;优图是非常幸运的&#xff0c;幸运的同时也知道优图选对了方向&#xff0c;只要坚持&#xff0c;还是会有收获的。12 月 15 日&#xff0c;以"新趋势、新技术、新应用"为主题…

JS子窗口调用父窗口中的函数

很简单只需要一句话就可以了&#xff1a; window.opener.changeColor(); 这里的changeColor()就是父窗口中JS的一个函数 本文转自sucre03 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/sucre/377011&#xff0c;如需转载请自行联系原作者

父亲节遇上端午节,你难道不回家吗?

创业者是孤独的 他们选择了更加艰险的人生。 同时&#xff0c;他们又是幸运的 因为他们背后有一位伟大的父亲。 决定创业时 他说&#xff1a;“大胆去闯吧&#xff0c;有爸爸在” 创业失败时 他说&#xff1a;“累了就回家&#xff0c;有爸爸在” 简单朴实的话语包含的是无私广…

蜘蛛爬虫网络高像素图片抓取工具[搜索引擎]

ZSpider—— 是一款Photo crawler工具。主要功能&#xff1a;免费抓取网络高像素图片&#xff0c;并下载到本地。使用说明&#xff1a;1. 软件环境&#xff1a;Windows XP, 20003, Vista, 2008, Windows 7.NET Framework 3.52. 双击Spider.exe&#xff0c;选择菜单&#xff0c;…

技术流 | 手把手教你用Python设计一个命令行界面

作者 | Yannick Wolff 译者 | 刘旭坤 整理 | Jane出品 | Python大本营对 Python 程序来说&#xff0c;完备的命令行界面可以提升团队的工作效率&#xff0c;减少调用时可能碰到的困扰。今天&#xff0c;我们就来教大家如何设计功能完整的 Python 命令行界面。对 …

送给那些还在迷茫的人

在现在这个高节奏的高效率的时代&#xff0c;两级分化特别厉害。有钱的会越来越有钱&#xff0c;没钱的要么安于现状&#xff0c;要么就越来越穷。  这种思维的产生根源就是不懂得把握机会&#xff0c;其实机会这个东西很奇妙&#xff0c;有时候我们自己也能发现有个机会就摆…

cisco路由器与QOS技术

1 前言随着因特网的普及&#xff0c;网络和人们生活的关系愈加密切&#xff0c;多样化的业务&#xff08;数据、语音、视频等&#xff09;应运而生。通常&#xff0c;这些业务对于通信条件的要求各不相同&#xff1a;数据业务对传递的可靠性要求非常高&#xff0c;误码率是最重…

shell介绍,命令历史,命令补全和别名 ,通配符, 输入输出重定向

2019独角兽企业重金招聘Python工程师标准>>> shell介绍 shell是一个命令解释器&#xff0c;提供用户和机器之间的交互&#xff1b; 支持特定语法&#xff0c;比如逻辑判断、循环&#xff1b; 每个用户都可以有自己特定的shell&#xff1b; CentOS7默认shell为bash (…

2018年Python开源项目Top100!只在这里!

整理 | Jane出品 | Python大本营2018 年的最后一天&#xff0c;营长为大家新鲜出炉了一份 2018 年 Python 开源项目 Top100 清单&#xff01;这些项目都是营长每月通过收集 Mybridge 的数据整理而来的&#xff0c;是不是很棒&#xff01;&#xff08;我要在留言区看到你们夸我~…

亲君圆梦,创业一起来

你想像中的创业&#xff0c;是不是办公地点找好了吗&#xff1f;需要注册公司一步一步来呢做哪个行业好呢有没有什么赚钱的项目呢没有你想的那么困难只需要一部手机发个链接点一下 玩一年 创业不花一分钱 校园创业 只需动动手指想要带你一起赚钱一起飞吗&#xff1f;我在厦门亲…

半途而废的香山之旅

今天终于下定决心去香山了&#xff01;大清早&#xff0c;就和同学小燕两个人买好了路上吃的东西。顶着北京早晨凉爽但有点阻的风骑车自行车向香山的方向进发了!这是我第一次去香山&#xff0c;路线也只能是摸索了&#xff01;我本来是准备从北四环西路一直往西骑&#xff0c;然…

POwershell 更改文件权限

今天需要给某个网络共享的大文件重新配置一个权限。这个文件夹下面有很多乱七八糟的小文件&#xff0c;很多创建人甚至已经离开公司了。如果一个个地目录手动修改所有者权限&#xff0c;再打开继承关系&#xff0c;这样比较麻烦&#xff0c;这个时候自然是用脚本比较方便了。 1…

“清华帮”AI造富

作者 | 马程&#xff1b;编辑 | 罗丽娟来源 | 全天候科技【导语】如今的AI创业者中&#xff0c;有一大批人出自精英汇聚的 “姚班”和清华的各个院系。他们们凭借技术傍身迅速打造出一批AI独角兽&#xff0c;但在发展过程中&#xff0c;他们又不得不面对资本的压力&#xff0c;…

什么时候是创业最佳时机?7个最佳的励志创业时机GET了吗

1、年轻时人们常说“出名要趁早”&#xff0c;创业也是同样的道理&#xff0c;创业越早&#xff0c;成功的几率就越大。年轻是一种巨大的财富&#xff0c;是无知和天真的完美结合&#xff0c;吸取经验可以作为愚蠢决定的借口。有人说&#xff0c;和职业篮球运动员一样&#xff…

连接ORACLE实例

public class OracleConn {public static Connection getConn() {Connection conn null;try {Class.forName("oracle:jdbc.driver.OracleDriver");String url "jdbc:oracle:thin:localhost:1521:数据库SID";String user "数据库用户名";String…

用Inno Setup来解决.NetFramework安装问题

前段时间朋友接了一个项目&#xff0c;具体是开发一个安装在局域网内的软件&#xff0c;这个软件会定时连接局域网内的服务器来更新本地客户端的一些信息&#xff0c;因为在局域网内存在着多种不同的Windows版本&#xff0c;从WindowsXP、Windows2003及Windows2008到Windows7等…

我想,有间花房

你带我走进你的花房&#xff0c;我无法逃脱花的清香&#xff0c;我不知不觉忘记了方向&#xff0c;你说我世上最坚强&#xff0c;我说你世上最善良&#xff0c;你不知不觉和花儿一样也许每一位 爱花的姑娘&#xff0c;都想有一间属于自己 的花 房 &#xff0c;在悠闲的午后&…

JS重写提示框(confirm)

<script language"javascript"> /** * 功能&#xff1a;显示提示窗口 * 作者&#xff1a;申楠 qq&#xff1a;38371354 email&#xff1a;amushen1yahoo.com.cn http;//amushen.cnblogs.com * 日期&#xff1a;2005-10-26 * 版本&#xff1a;1.1 * 备注&#…