对Queue中的消息有多种操作方法,包括推入消息,删除消息,解析消息,查询消息等,有三种数据类型可以作为原始Queue消息,分别是:流,字节数组和字符串。首先我们来看看如何将消息推入到Queue中。
将消息推入Queue中
本文将使用定义的Address类作为实体类,因为XML是消息交换通用的格式,因此我们将把Address实例数据使用.Net XmlSerialization类转换成XML字符串后,再推入到Queue中,下面的代码显示了将Address实体数据转换成XML字符串,然后将其作为一个队列消息推入到Queue中。
protected void btnAddAddress_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
_GetXmlPayloadQueue().PutMessage(new Message(_ComposeXmlString()));
}
}
private string _ComposeXmlString()
{
Address address = new Address(txtAddress1.Text.Trim(),
txtAddress2.Text.Trim(),
txtCity.Text.Trim(),
(State)combState.SelectedIndex,
txtZip.Text.Trim(),
txtCounty.Text.Trim(),
txtCountry.Text.Trim(),
string.Empty);
XmlSerializer serializer = new XmlSerializer(address.GetType());
StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
serializer.Serialize(writer, address);
return writer.GetStringBuilder().ToString();
}
private BlobContainer GetXmlPayloadContainer()
{
_Initialization();
return _blobStorage.GetBlobContainer(WorkerRole.XML_CONTAINER_NAME);
}
private MessageQueue _GetXmlPayloadQueue()
{
_Initialization();
return _queueStorage.GetQueue(WorkerRole.XML_PAYLOAD_QUEUE_NAME);
}
protected void btnDelete_Click(object sender, EventArgs e)
{
Message message = _GetXmlPayloadQueue().GetMessage(UPDATE_TIMEOUT_SEC);
if (message != null)
{
_GetXmlPayloadQueue().DeleteMessage(message);
}
}
与普通的Windows队列对象不同,当一个消息放入Cloud Queue后,应用程序可以对它进行多次读取,如果没有服务明确地删除Queue中的消息,它就不会从Queue消失,消息主体存储在Message表的data字段。
图1显示了当消息提交到本地开发环境中的Queue,从本地数据库查询的结果。
图 1 Message表data字段持久化的Queue消息,消息经过编码了
删除Queue中消息
删除Queue中的消息非常简单,下面的btnDelete_Click()方法实现了,当点击一个按钮时,就从Queue中删除消息。
const int UPDATE_TIMEOUT_SEC = 5;
protected void btnDelete_Click(object sender, EventArgs e)
{
Message message = _GetXmlPayloadQueue().GetMessage(UPDATE_TIMEOUT_SEC);
if (message != null)
{
_GetXmlPayloadQueue().DeleteMessage(message);
}
}
这里指定超时的原因是,消息进入Queue有一段锁定时间,在这段时间内消息是不能删除的,消息解锁后就可以使用了。
解析Queue中的消息
接收到消息后,我们需要将其还原为原始的数据格式,Azure SDK提供的Message类包含了消息解析功能,可以将消息解析为数组或字符串。
const int UPDATE_TIMEOUT_SEC = 5;
Message message = _GetXmlPayloadQueue().GetMessage(UPDATE_TIMEOUT_SEC);
if (message != null)
{
btnDelete.Enabled = true;
LabelMessage.Text = Server.HtmlEncode(message.ContentAsString());
}
else
{
btnDelete.Enabled = false;
}
使用HTTP REST查询Queue
使用HTTP REST查询Queue的语法如下表所示。
REST API | HTTP | 示例 | 描述 |
Create Queue | PUT | http://myaccount.queue.core. windows.net/myqueue |
|
Delete Queue | DELETE | http://myaccount.queue.core. windows.net/myqueue |
|
Get Metadata | GET/HEAD | http://127.0.0.1:10001/myaccount/ myqueue?comp=metadata | 也返回消息数量,其它属性是自由格式的名称/值对 |
Set Metadata | PUT | http://127.0.0.1:10001/myaccount/ myqueue?comp=metadata |
|
Get Messages | GET | http://127.0.0.1:10001/myaccount/ myqueue/messages |
|
Peek Messages | GET | http://myaccount.queue.core. windows.net/myqueue/messages? peekonly=true |
|
Delete Message | DELETE | http://127.0.0.1:10001/myaccount/ myqueue/messages/messageid?popreceipt =string-value"lightweight commit" |
|
Clear Messages | DELETE | http://myaccount.queue.core. windows.net/myqueue/messages | 删除Queue中的所有消息 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9914854/viewspace-667103/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9914854/viewspace-667103/