Azure Queue队列存储(2)

原创 2015年06月23日 16:55:05

我们接上一篇来继续讨论queue存储, 在(1)中我们已经按步骤完成了配置和连接。 下面我们就来看如何来使用具体的存储。

以编程方式访问Queue队列存储
获取组件

您可以使用NuGet来获取Microsoft.WindowsAzure.Storage.dll组件。 在Solution Explorer里右键点击你的Project, 然后选择Manage Nuget Packages, 在线搜索 “WindowsAzure.Storage” 然后点击安装Azure存储包和相关包。

Azure SDK .NET版也包含Microsoft.WindowsAzure.Storage.dll, 您可以在.NET k开发者中心拿到。 该组件安装在%Program Files%\Microsoft SDKs\Azure.NET SDK\\ref\ 目录下。

名字空间声明
把下面的代码加到你的C#程序的最上面以便于您访问Azure存储:

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Queue;

确保您引用Microsoft.WindowsAzure.Storage.dll组件

检索连接字符串

您可以使用CloudStorageAccount 类型来展示您的存储账户信息。 如果您使用Azure项目模板或者您有一个关于Microsoft.WindowsAzure.CloudConfigurationManager名字空间的引用, 您也可以是用CloudConfigurationManager 类型从Azure服务配置表来检索您的存储连接字符串和账户信息。

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

如果您的应用没有引用Microsoft.WindowsAzure.CloudConfigurationManager, 并且您的连接字符串存放在web.config或者app.config里, 那您就可以使用ConfigurationManager来获取连接字符串了。 不过您还需要添加一个对于System.Configuration.dll 的引用, 然后再添加一个命名空间的声明。
using System.Configuration;

using System.Configuration;
...
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    ConfigurationManager.ConnectionStrings["StorageConnectionString"]);

创建一个queue
CloudQueueClient 可以让您访问到queues的reference objects。 下面的代码新建一个 CloudQueueClient 对象。 本示例中所用的所有的代码都使用Azure应用服务配置中的同一个存储连接串。

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

使用queueClient 对象来拿到您想使用的queue的引用。 如果queue不存在, 可以创建一个

// Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Create the queue if it doesn't already exist
queue.CreateIfNotExists();

向queue中插入一条消息message
向一个已经存在的queue中插入一条消息, 需要首先新建一个CloudQueueMessage, 然后调用AddMessage 方法。 CloudQueueMessage既可以从从一个string(UTF-8)或者从一个byte数组创建。 下面是示例代码

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Create the queue if it doesn't already exist.
queue.CreateIfNotExists();

// Create a message and add it to the queue.
CloudQueueMessage message = new CloudQueueMessage("Hello, World");
queue.AddMessage(message);

peek下一条消息
你可以通过调用PeekMessage 方法来查看queue的头的一条消息而不需要删除消息本身。

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Peek at the next message
CloudQueueMessage peekedMessage = queue.PeekMessage();

// Display message.
Console.WriteLine(peekedMessage.AsString);

修改加入queue队列的消息
您可以在原处修改一个queue中的内容。 如果消息本身是work任务, 那您可以使用这个功能来来更新work任务的状态。 下面的示例代码展示了更新queue消息的新内容, 把可视性timeout的时间延长了60秒。

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Get the message from the queue and update the message contents.
CloudQueueMessage message = queue.GetMessage();
message.SetMessageContent("Updated contents.") ;
queue.UpdateMessage(message,
    TimeSpan.FromSeconds(0.0),  // Make it visible immediately.
    MessageUpdateFields.Content | MessageUpdateFields.Visibility);

De-queue下一条消息
可以通过两步来De-queue queue中的消息。 调用GetMessage来获得queue中的下一条消息. GetMessage返回的消息将会对已其它的代码变成不可见。 默认的情况下, 这个不可见性持续30秒。要想完全删除这条消息, 你需要调用DeleteMessage方法。

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Get the next message
CloudQueueMessage retrievedMessage = queue.GetMessage();

//Process the message in less than 30 seconds, and then delete the message
queue.DeleteMessage(retrievedMessage);

针对common Queue storage APIs使用Async-Await模式

下面的示例代码展示了针对common Queue storage APIs使用的Async-Await模式

// Create the queue if it doesn't already exist
if(await queue.CreateIfNotExistsAsync())
{
    Console.WriteLine("Queue '{0}' Created", queue.Name);
}
else
{
    Console.WriteLine("Queue '{0}' Exists", queue.Name);
}

// Create a message to put in the queue
CloudQueueMessage cloudQueueMessage = new CloudQueueMessage("My message");

// Async enqueue the message
await queue.AddMessageAsync(cloudQueueMessage);
Console.WriteLine("Message added");

// Async dequeue the message
CloudQueueMessage retrievedMessage = await queue.GetMessageAsync();
Console.WriteLine("Retrieved message with content '{0}'", retrievedMessage.AsString);

// Async delete the message
await queue.DeleteMessageAsync(retrievedMessage);
Console.WriteLine("Deleted message");

其它de-queuing消息的方法
通常可以有两种方式来自定义消息中的检索。 首先, 您可以拿到一批消息(最多32)。 第二您可以设置更长的不可见时间来允许代码完成消息的操作。

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");

foreach (CloudQueueMessage message in queue.GetMessages(20, TimeSpan.FromMinutes(5)))
{
    // Process all messages in less than 5 minutes, deleting each message after processing.
    queue.DeleteMessage(message);
}

得到queue队列的长度
你可以拿到queue中估计的消息数。FetchAttributes 方法向queue服务抓取queue属性信息, 其中包括消息数。

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Fetch the queue attributes.
queue.FetchAttributes();

// Retrieve the cached approximate message count.
int? cachedMessageCount = queue.ApproximateMessageCount;

// Display number of messages.
Console.WriteLine("Number of messages in queue: " + cachedMessageCount);

删除一个queue
调用Delete方法来删除queue对象

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Delete the queue.
queue.Delete();

相关文章推荐

Azure Queue队列存储(1)

继前面介绍了一些关于Table和Blob等的存储之外, 今天再给大家介绍一下Queue队列存储。和以往一样, 这篇文章的示例还是以C#代码以及Azure Storage Client for .NET...

WebMatrix 2发布了!添加了新的Windows Azure 功能

你可能还记得这篇关于WebMatrix的博客文章,Windows Azure Web Sites和PHP将在六月份到来。好吧,对于WebMatrix 2 带来的东西我们感到很兴奋!这篇文章涉及到一些主...

现在可用:跨地域备份和Windows Azure 存储的Blob、Table 和 Queue的新特性

在BUILD Day的两个主旨发言中,我们宣布跨地域备份和新版本的REST API的发布,使得Windows Azure Blobs、Tables 和 Queues的功能得到改善。现在我们正在对两...

2_Windows_Azure_计算和存储

  • 2012年03月20日 16:11
  • 1.93MB
  • 下载

Azure Table存储(2)

今天我们继续接上一篇来谈一下Table存储。以编程方式访问Table存储 获取组件您可以使用NuGet来获取Microsoft.WindowsAzure.Storage.dll组件。 在Soluti...

Azure Blob存储(2)

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

【CDP-云设计模式】第8章,2.优先级队列模式(Priority Queue Pattern)

要解决的问题:有时会有大量工作需要处理,而且这些工作可能需要重新定义优先级。例如,未付款用户和订阅用户(如截止出版时间)可享受的不同级别的服务之间存在区别,举个例子,从web浏览器上传出版物的描述文件...
  • QXK2001
  • QXK2001
  • 2016年09月20日 08:59
  • 634

Codeforces Round #303 (Div. 2)-D. Queue(优先队列)

D. Queue time limit per test 1 second memory limit per test 256 megabytes input st...

Windows Azure的MSMQ--Queue Storage 例子

  • 2011年07月01日 14:22
  • 722KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Azure Queue队列存储(2)
举报原因:
原因补充:

(最多只允许输入30个字)