如何构建应用程序引擎以及使用 Windows Azure Storage 实现异步消息传送
对于本文中的其他示例,我们使用了可以简化此过程的一些包装类(位于 Hollywood Hackers 的 CodePlex 站点中,网址为:hollywoodhackers.codeplex.com/SourceControl/ListDownloadableCommits.aspx)。 异步消息传送 (Toast) 当今,交互式网站不仅是一种时尚,更是一种需求。用户已经习惯了完全交互式网站,以致于当他们遇到一个静态的非交互式页面时会认为什么地方出问题了。考虑到这一点,我们希望可以在我们的用户使用这样的站点时向他们发送通知。 为此,我们将利用 Windows Azure Queue 和 Windows Azure Table 存储机制构建一个消息传递框架。客户端将使用与 jQuery Gritter 插件结合的 jQuery 在用户的浏览器中将通知显示为一个 toast,类似于当您收到新的 Outlook 电子邮件、即时消息或警报声时在 Windows 系统托盘上方淡出的消息。 当需要向某个用户发送通知时,该用户将被插入到队列中。因为工作者角色负责处理队列中的每个项目,所以该角色将动态确定如何处理每个项目。在本例中,引擎只需要执行一个操作,但在复杂的 CRM 网站或支持站点中,要执行的操作可能不计其数。 工作者角色在队列中遇到用户通知时,会将该通知存储在表存储中并将其从队列中删除。这样,消息可以保留很长时间并等待用户登录进行处理。队列存储中的消息的最大保存期限比较短,不会超过几天。当用户访问网站时,我们的 jQuery 脚本将异步获取表中的所有消息,并通过在控制器上调用可返回 JavaScript Object Notation (JSON) 的方法在浏览器中以常见的形式显示这些消息。 尽管队列只处理字符串或字节数组,但我们可以通过将任何类型的结构化数据序列化为二进制文件来将其存储在队列中,然后在我们需要使用时再将其转换回来。这成为将强类型化的对象传递到队列中的出色技术。我们会将此技术构建到我们的队列消息的基类中。然后,我们的系统消息类可以包含我们的数据,而且可以将整个对象提交到队列中并根据需要进行利用(请参见图 2)。 图 2 在队列中存储结构化数据 请记住,要使用 BinaryFormatter 类,需要以完全信任模式(可以通过服务配置文件启用此模式)运行 Windows Azure 工作者角色。 图 3 用于与队列交互的包装namespace HollywoodHackers.Storage.Queue
{
[Serializable]
public class QueueMessageBase
{
public byte[] ToBinary()
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ms.Position = 0;
bf.Serialize(ms, this);
byte[] output = ms.GetBuffer();
ms.Close();
return output;
}
public static T FromMessageT>(CloudQueueMessage m)
{
byte[] buffer = m.AsBytes();
MemoryStream ms = new MemoryStream(buffer);
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
return (T)bf.Deserialize(ms);
}
}
[Serializable]
public class ToastQueueMessage : QueueMessageBase
{
public ToastQueueMessage()
: base()
{
}
public string TargetUserName { get; set; }
public string MessageText { get; set; }
public string Title { get; set; }
public DateTime CreatedOn { get; set; }
}
现在,我们需要一个简单的包装来与我们的队列交互。从本质上说,我们需要能够将消息插入队列,获取任何挂起的消息并清除该队列(请参见图 3)。namespace HollywoodHackers.Storage.Queue
{
public class StdQueueT> :
StorageBase where T : QueueMessageBase, new()
{
protected CloudQueue queue;
protected CloudQueueClient client;
public StdQueue(string queueName)
{
client = new CloudQueueClient
(StorageBase.QueueBaseUri, StorageBase.Credentials);
queue = client.GetQueueReference(queueName);
queue.CreateIfNotExist();
}
public void AddMessage(T message)
{
CloudQueueMessage msg =
new CloudQueueMessage(message.ToBinary());
queue.AddMessage(msg);
}
public void DeleteMessage(CloudQueueMessage msg)
{
queue.DeleteMessage(msg);
}
public CloudQueueMessage GetMessage()
{
return queue.GetMessage(TimeSpan.FromSeconds(60));
}
}
public class ToastQueue : StdQueueToastQueueMessage>
{
public ToastQueue()
: base(toasts)
{
}
}
}
实现 Storage 异步 消息 传送 Azure Windows 应用程序 相关文章:
- 3DES算法的FPGA高速实现(06-21)
- 基于DSP的Max-Log-MAP算法实现与优化(05-27)
- DSP中DMA操作的无阻塞请求实现(06-18)
- 二维DCT编码的DSP实现与优化(09-08)
- 基于DSP处理器上并行实现ATR算法(01-29)
- 基于DSP的H.324终端设计(05-27)
