Windows Azure入门教学系列 (五):使用Queue Storage

本文是Windows Azure入门教学的第五篇文章。

本文将会介绍如何使用Queue Storage。Queue Storage提供给我们一个云端的队列。我们可以用Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信)。

一个使用Queue Storage经典的场景是,在一个Web应用程序中,用户通过表单递交给服务器数据,服务器收到数据后将进行处理,而这一处理将花费很多时间。这种情况下,服务器端通过Queue Storage可以把用户递交的信息存储在队列中,后台再运行一个程序从队列中取得数据进行信息的处理。

以往如果程序时运行在Windows操作系统上,那么我们可以使用MSMQ来做类似的工作。而Queue Storage的出现为我们提供了另一种选择。特别是在非Windows操作系统上,我们依然可以使用Queue Storage的REST API来很方便地使用它。

有关Queue Storage REST API的详细信息,请参见Queue 服务 API

为了方便.NET开发人员,我们在SDK中提供了Microsoft.WindowsAzure.StorageClient类来帮助发送REST请求。

在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的Windows Azure开发工具。本教学使用Visual Studio 2010作为开发工具。

步骤一:创建解决方案和项目

由于我们要在本地模拟环境下测试Queue Storage,首先,请确保Storage Emulator已经启动。我们可以找到管理器的进程手动启动或者让Visual Studio 2010帮助我们启动他。

右击工具栏中Windows Azure模拟器的图标,选择”Show Storage Emulator UI”。弹出如下图所示的窗口:

我们要关注的是Service management中Queue所在的一行。要确保Status为Running。

确认完毕后启动Visual Studio 2010,并且新建两个Console项目。我们将演示如何在一个Console程序中往Queue Storage中添加信息然后另外一个Console程序如何读取并处理信息。

步骤二:添加SDK程序集引用

请在项目属性页里确认项目的Target framework的值是.NET Framework 4或.NET Framework 3.5。然后在两个Console项目中均添加C:Program FilesWindows Azure SDKv1.3refMicrosoft.WindowsAzure.StorageClient.dll的引用。该路径为SDK默认安装路径,如果你不能在这个路径中找到Microsoft.WindowsAzure.StorageClient.dll请从SDK安装路径中寻找。

步骤三:添加代码

首先在两个项目中的Program.cs中均引用命名空间:


1

2

3

4

5

using System.Threading;

 

using Microsoft.WindowsAzure;

 

using Microsoft.WindowsAzure.StorageClient;

然后在其中一个项目(为了叙述方便,后面称之为Client项目)的Main方法中加入如下代码,我们将用它来向Queue Storage中添加信息。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

static void Main(string[] args)

 

{

 

    var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;

 

    var queueStorage = storageAccount.CreateCloudQueueClient();

 

  

 

    // 检查名为helloworldqueue的队列是否被创建,如果没有,创建它

 

    var queue = queueStorage.GetQueueReference("helloworldqueue");

 

    queue.CreateIfNotExist();

 

  

 

    Console.WriteLine("Client is running...");

 

  

 

    while (true)

 

    {

 

        // 插入数据到队列中

 

        queue.AddMessage(new CloudQueueMessage(string.Format("client sent information: {0}", DateTime.UtcNow.ToString())));

 

  

 

        // 每次插入数据后线程休息3秒

 

        Thread.Sleep(3000);

 

    }

 

}

接着在另外一个项目(为了叙述方便,后面称之为Server项目)的Main方法中加入如下代码,我们将用它来从Queue Storage中读取信息和进行处理。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

static void Main(string[] args)

 

{

 

    var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;

 

    var queueStorage = storageAccount.CreateCloudQueueClient();

 

  

 

    // 检查名为helloworldqueue的队列是否被创建,如果没有,创建它

 

    var queue = queueStorage.GetQueueReference("helloworldqueue");

 

    queue.CreateIfNotExist();

 

  

 

    Console.WriteLine("Server is running...");

 

  

 

    while (true)

 

    {

 

        // 从队列中读取一条信息

 

        // 收到信息后可以根据收到的信息做处理,为了演示方便我们这里只是把信息显示出来

 

        // 在云端发送消息后这条消息将对于后续的请求不可见,但是并未被删除。我们需要显示删除它。

 

        // 否则在一段时间后该消息将重新可见。这一设计的好处是确保了所有消息都能够被处理。

 

        // 如果程序在收到消息后处理消息前就异常终止了那么数据依然在一段时间后可以被重新处理。

 

        // 详情请参考MSDN文档

 

        var message = queue.GetMessage();

 

  

 

        if (message != null)

 

        {

 

            Console.WriteLine(string.Format("Message retrieved: {0}", message.AsString));

 

  

 

            // 处理完数据后必须显示删除消息

 

            queue.DeleteMessage(message);

 

        }

 

  

 

        // 每次读取数据后线程休息3秒

 

        Thread.Sleep(3000);

 

    }

 

}

步骤四:观察并分析代码

步骤三中的代码中,首先我们通过CloudStorageAccount.DevelopmentStorageAccount来说明我们使用的本地的Development Storage自带账户而不是真正的云端存储服务账户。(如果要用真实账户可以使用

// DefaultEndpointsProtocol=https可以改成DefaultEndpointsProtocol=http表示用HTTP而不是HTTPS

CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=[用户名];AccountKey=[密码]");

来实例化对象)然后通过该账户类来实例化一个Queue客户端类。这两步是使用SDK中StorageClient程序集来调用Queue Storage服务的必要步骤。

Client项目中的代码相对简单。大约每隔3秒向Queue Storage中插入一条数据。Server端的项目中我们则大约每隔3秒从Queue Storage中读取一条数据。处理完毕后将之删除。对于为什么必须在读取后显示删除的问题请参考注释部分。

步骤五:运行程序

先运行Client程序然后运行Server个程序。如果一切正常,你将会看到Server项目的Console程序输出收到的消息:

注意由于是本地模拟,Client和Server程序需要要在同一台机器上运行。但是如果使用真实账户的话,Client和Server程序就可以跨越机器进行通信了。

时间: 2024-11-03 22:02:32

Windows Azure入门教学系列 (五):使用Queue Storage的相关文章

Windows Azure入门教学系列 (七):使用REST API访问Storage Service

本文是Windows Azure入门教学的第七篇文章. 本文将会介绍如何使用REST API来直接访问Storage Service. 在前三篇教学中,我们已经学习了使用Windows Azure SDK所提供的StorageClient来使用Blob Storage, Queue Storage以及Table Storage的基本方法.我们在前几篇教学中也提及最终StorageClient也是通过发送REST请求来与服务器端通信的. 在这篇教学中,我们会以Blob Storage为例,说明如何

Windows Azure入门教学系列 (一): 创建第一个WebRole程序

原文 Windows Azure入门教学系列 (一): 创建第一个WebRole程序 在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言).在开始学习之前,请确保你的机器上已经安装了: Windows Azure Tools for Microsoft Visual Studio 1.1 (February 2010) Windows Azure Software Development Kit (November 2009) 步骤

Windows Azure入门教学系列 (二):部署第一个Web Role程序

本文是Windows Azure入门教学的第二篇文章. 在第一篇教学中,我们已经创建了第一个Web Role程序.在这篇教学中,我们将学习如何把该Web Role程序部署到云端. 注意:您需要购买Windows Azure Platform 服务才能继续本教学.您可以通过点击https://mocp.microsoftonline.com/Site/Support.aspx页面上的   联系我们的支持团队来获得购买服务的具体步骤或询问其他有关购买,收费的问题. 在开始本教学之前,请确保你从Win

Windows Azure入门教学系列 (六):使用Table Storage

本文是Windows Azure入门教学的第六篇文章. 本文将会介绍如何使用Table Storage.Table Storage提供给我们一个云端的表格结构.我们可以把他想象为XML文件或者是一个轻量级的数据库(当然,不是通过SQL 语句进行数据的操作). 使用Table Storage的方法依然是调用REST API.有关Table Storage REST API的详细信息,请参见Table服务API: 为了方便.NET开发人员,我们在SDK中提供了Microsoft.WindowsAzu

Windows Azure入门教学系列 (九):Windows Azure 诊断功能

本文是Windows Azure入门教学的第九篇文章. 本文将会介绍如何使用Windows Azure 诊断功能.跟部署在本地服务器上的程序不同,当我们的程序发布到云端之后,我们不能使用通常的调试方法,例如Remote Debugging等等来对我们的程序进行调试.那么当程序运行出现问题时我们如何能够得知问题的根源以便修正Bug呢?如果我要检测程序的性能,又有什么好的方法呢? 要做到上述的需求,我们需要利用Windows Azure提供的诊断功能,该功能能够记录诊断日志,保存到Windows A

Windows Azure入门教学系列 (四):使用Blob Storage

本文将会介绍如何使用Blob Storage.Blob Storage可以看做是云端的文件系统.与桌面操作系统上不同,我们是通过REST API来进行对文件的操作.有关REST API的详细信息,请参见Blob 服务 API. 为了方便.NET开发人员,我们在SDK中提供了Microsoft.WindowsAzure.StorageClient类来帮助发送REST请求. 在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的Windows Azure开发工具.本教学使

Windows Azure入门教学系列 (八):使用Windows Azure Drive

我们知道,由于云端的特殊性,通常情况下,对文件系统的读写建议使用Blob Storage来代替.这就产生了一个问题:对于一个已经写好的本地应用程序,其中使用了NTFS API对本地文件系统读写的代码是否需要进行完全重写以便迁移到Windows Azure平台上呢?答案是否定的.Windows Azure平台提供了Drive的功能. 在1.1版本的SDK中提供了CloudDrive类,能够将本地NTFS文件系统Mount到Blob Storage上.我们只要添加一小段代码来表明我们希望Mount

Windows Azure入门教学系列 (一): 创建第一个WebRole程序,互联网营销

在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言).在开始学习之前,请确保你的机器上已经安装了: Windows Azure Tools for Microsoft Visual Studio 1.1 (February 2010) Windows Azure Software Development Kit (November 2009) 步骤一:创建解决方案和项目 以管理员权限打开Visual Studio 2008 SP1,

Windows Azure AppFabric 入门教学系列 (五):初探Access Control Service

本文是Windows Azure AppFabric入门教学的第五篇文章.本文会对AppFabric中的Access Control Service(ACS)做初步的讲解.为了使后续的学习顺利进行请确保已浏览本教程的第一篇文章,并以按照该文完成了AppFabric项目和命名空间的创建.我们知道,AppFabirc由Service Bus 和 Access Control Service组成,在前一篇教程中我们已介绍过Service Bus,所以本文将简略的介绍如何使用ACS服务来确保安全性. 同