怎么使用Windows Azure Queue Storage 服务

如题所述

若要执行存储操作,您需要一个 Windows Azure 存储帐户。可通过以下步骤创建存储帐户。(也可以使用 REST API 创建存储帐户。)

登录到 Windows Azure 管理门户。

在导航窗格的底部,单击“新建”。

+新建

依次单击“数据服务”、“存储”和“快速创建”。

“快速创建”对话框

在 URL 中,键入要在存储帐户的 URI 中使用的子域名称。输入的名称可包含 3-24 个小写字母和数字。此值将成为用于对订阅的 Blob、队列或表资源进行寻址的 URI 中的主机名。

选择要在其中查找存储的区域/地缘组。如果要使用 Windows Azure 应用程序中的存储,请选择要在其中部署该应用程序的区域。

还可以选择启用异地复制。

单击“创建存储帐户”。

创建 Java 应用程序

在本指南中,您将使用存储功能,这些功能可在 Java 应用程序中本地运行,或在 Windows Azure 的 Web 角色或辅助角色中运行的代码中运行。假定您已下载并安装 Java 开发工具包 (JDK),并已按照下载 Windows Azure SDK for Java 中的说明进行操作来安装 Windows Azure Libraries for Java 和 Windows Azure SDK,还在 Windows Azure 订阅中创建了 Windows Azure 存储帐户。您可以使用任何开发工具(包括“记事本”)创建应用程序。您只要能够编译 Java 项目和引用 Windows Azure Libraries for Java 即可。

配置您的应用程序以访问队列存储

将下列导入语句添加到要在其中使用 Windows Azure 存储 API 以访问队列的 Java 文件的顶部:

// Include the following imports to use queue APIs
import com.microsoft.windowsazure.services.core.storage.*;
import com.microsoft.windowsazure.services.queue.client.*;
设置 Windows Azure 存储连接字符串

Windows Azure 存储客户端使用存储连接字符串来存储用于访问数据管理服务的终结点和凭据。在客户端应用程序中运行时,必须提供以下格式的存储连接字符串,并对 AccountName 和 AccountKey 值使用管理门户中列出的存储帐户的名称和存储帐户的主访问密钥。此示例演示如何声明用于保存连接字符串的静态字段:

// Define the connection-string with your values
public static final String storageConnectionString =
"DefaultEndpointsProtocol=http;" +
"AccountName=your_storage_account;" +
"AccountKey=your_storage_account_key";
在 Windows Azure 的角色中运行的应用程序中,此字符串可存储在服务配置文件 ServiceConfiguration.cscfg 中,并可通过调用 RoleEnvironment.getConfigurationSettings 方法进行访问。下面是从服务配置文件中名为 StorageConnectionString 的 Setting 元素中获取连接字符串的示例:

// Retrieve storage account from connection-string
String storageConnectionString =
RoleEnvironment.getConfigurationSettings().get("StorageConnectionString");
如何:创建队列

利用 CloudQueueClient 对象,可以获得队列的引用对象。以下代码将创建 CloudQueueClient 对象。

本指南中的所有代码都使用声明了上述两种方式之一的存储连接字符串。还可以通过其他方式创建 CloudStorageAccount 对象。有关详细信息,请参阅 Javadocs 文档中的 CloudStorageAccount。

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(storageConnectionString);

// Create the queue client
CloudQueueClient queueClient = storageAccount.createCloudQueueClient();
使用 CloudQueueClient 对象获取对要使用的队列的引用。如果队列不存在,您可以创建它。

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

// Create the queue if it doesn't already exist
queue.createIfNotExist();
如何:向队列添加消息

若要将消息插入现有队列,请先创建一条新的 CloudQueueMessage。紧接着,调用 addMessage 方法。可从字符串(UTF-8 格式)或字节数组创建 CloudQueueMessage。以下代码将创建队列(如果队列不存在)并插入消息“Hello, World”。

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(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.createIfNotExist();

// Create a message and add it to the queue
CloudQueueMessage message = new CloudQueueMessage("Hello, World");
queue.addMessage(message);
如何:查看下一条消息

通过调用 peekMessage,可以查看队列前面的消息,而不必从队列中将其删除。

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(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();
如何:取消对下一条消息的排队

您的代码通过两个步骤取消在队列中对消息的排队。在调用 retrieveMessage 时,您将获得队列中的下一条消息。从 retrieveMessage 返回的消息变得对从此队列读取消息的任何其他代码不可见。默认情况下,此消息将持续 30 秒不可见。若要完全从队列中删除消息,您还必须调用 deleteMessage。此删除消息的两步过程可确保当您的代码因硬件或软件故障而无法处理消息时,您的其他代码实例可以获取同一消息并重试。您的代码在处理消息后会立即调用 deleteMessage。

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(storageConnectionString);

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

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

// Retrieve the first visible message in the queue
CloudQueueMessage retrievedMessage = queue.retrieveMessage();

// Process the message in less than 30 seconds, and then delete the message.
queue.deleteMessage(retrievedMessage);
如何:更改已排队消息的内容

您可以更改队列中已就位消息的内容。如果消息表示工作任务,则可以使用此功能更新工作任务的状态。以下代码使用新内容更新队列消息,并将可见性超时设置为再延长 60 秒。这将保存与消息关联的工作的状态,并额外为客户端提供一分钟的时间来继续处理消息。可使用此方法跟踪队列消息上的多步骤工作流,即使处理步骤因硬件或软件故障而失败,也无需从头开始操作。通常,您还可以保留重试计数,如果某条消息的重试次数超过 n 次,您将删除此消息。这可避免消息在每次处理时都触发应用程序错误。

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(storageConnectionString);

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

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

// Retrieve the first visible message in the queue
CloudQueueMessage message = queue.retrieveMessage();

// Modify the message content and set it to be visible in 60 seconds
message.setMessageContent("Updated contents.");
EnumSet<MessageUpdateFields> updateFields =
EnumSet.of(MessageUpdateFields.CONTENT, MessageUpdateFields.VISIBILITY);
queue.updateMessage(message, 60, updateFields, null, null);
用于对消息取消排队的其他方法

您可以通过两种方式自定义队列中的消息检索。首先,您可以获取一批消息(最多 32 个)。其次,您可以设置更长或更短的不可见超时,从而允许您的代码使用更多或更少的时间来彻底处理每条消息。

以下代码示例使用 retrieveMessages 方法通过一次调用获取 20 条消息。然后,它使用 for 循环来处理每条消息。它还将每条消息的不可见超时设置为五分钟(300 秒)。请注意,这五分钟超时对于所有消息都是同时开始的,因此在调用 retrieveMessages 五分钟后,尚未删除的任何消息都将再次变得可见。

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(storageConnectionString);

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

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

// Retrieve 20 messages from the queue with a visibility timeout of 300 seconds
for (CloudQueueMessage message : queue.retrieveMessages(20, 300, null, null)) {
// Do processing for all messages in less than 5 minutes,
// deleting each message after processing.
queue.deleteMessage(message);
}
如何:获取队列长度

您可以获得队列中消息的估计数。downloadAttributes 方法会询问队列服务一些当前值,包括队列中消息的计数。此计数仅为近似值,因为只能在队列服务响应您的请求后添加或删除消息。getApproximateMethodCount 方法返回通过调用 downloadAttributes 检索到的最后一个值,而不会调用队列服务。

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(storageConnectionString);

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

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

// Download the approximate message count from the server
queue.downloadAttributes();

// Retrieve the newly cached approximate message count
long cachedMessageCount = queue.getApproximateMessageCount();
如何:删除队列

若要删除队列及其包含的所有消息,请对队列对象调用 delete 方法。

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(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();
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网