如何构建应用程序引擎以及使用 Windows Azure Storage 实现异步消息传送
让我们看一下工作者角色代码。在初始化和设置所需的队列和表存储之后,此代码将进入一个循环。每 10 秒钟,它就会处理一次队列中的消息。每次我们通过处理循环时都将获取队列中的消息,直到最终返回 null,这表示队列为空。 您从队列中看到的消息永远不会超过 20 个,如果不信,您可以反复尝试来验证一下。对队列进行的任何处理都有时间限制,必须在该时间范围内对每个队列消息执行有意义的操作,否则队列消息将被视为超时,并在队列中显示备份,以便可以由其他工作者来处理此消息。每个消息都会作为用户通知添加到表存储中。关于工作者角色需要记住的重要一点是:一旦入口点方法完成,工作者角色也就结束了。这就是您需要在一个循环中保持逻辑运行的原因。 从客户端的角度来说,我们需要能够以 JSON 形式返回消息,以便 jQuery 可以异步轮询并显示新的用户通知。为此,我们会将一些代码添加到消息控制器中,以便可以访问这些通知(请参见图 6)。 图 6 以 JSON 形式返回消息 在 Visual Studio 2010 beta 2 下的 ASP.NET MVC 2(我们用于撰写本文的环境)中,如果没有 JsonRequestBehavior.AllowGet 选项,您无法将 JSON 数据返回到 jQuery 或其他客户端。在 ASP.NET MVC 1 中,不需要此选项。现在,我们可以编写 JavaScript,它每 15 秒将调用一次 GetMessages 方法并将以 toast 形式消息显示通知(请参见图 7)。 提交和处理购物车 在我们的示例应用程序中,我们希望使用队列存储执行的另一个关键方案是提交购物车。Hollywood Hackers 有一个第三方履行系统(Hollywood Hackers 无法在其空间有限的仓库中保留所有小工具),所以引擎需要对购物车进行一些处理。一旦引擎完成其处理,它会向用户通知队列提交一个消息,告知用户已经对购物车进行了处理(或者出现了问题)。如果处理购物车时用户处于在线状态,该用户将收到系统弹出的一个 toast 消息。如果用户不在线,则会在其下次登录到该站点时收到该弹出消息,如图 8 所示。 图 8 示例用户通知 查看原图(大图) 我们首先需要的是一些包装类,使我们可以与购物车队列交互。这些包装非常简单,如果要查看它们的源代码,可以在 CodePlex 站点上查看。 与标准 CRUD(创建、读取、更新、删除)存储库不同的是,队列中的读取操作不是单纯的读取操作。请记住,只要获取队列中的消息,必须在有限的时间内处理该消息,操作失败或删除消息都会显示处理完成。这种模式不能顺利地转换到存储库模式,所以我们已经不再借助包装类执行此操作。 现在,我们已经拥有了要与购物车队列交互的代码,我们可以将一些代码放在购物车控制器中,以便将购物车内容提交到队列中(请参见图 9)。 图 9 向队列提交购物车public JsonResult GetMessages()
{
if (User.Identity.IsAuthenticated)
{
UserTextNotification[] userToasts =
toastRepository.GetNotifications(User.Identity.Name);
object[] data =
(from UserTextNotification toast in userToasts
select new { title = toast.Title ?? Notification,
text = toast.MessageText }).ToArray();
return Json(data, JsonRequestBehavior.AllowGet);
}
else
return Json(null);
}
图 7 以 toast 形式消息显示的通知$(document).ready(function() {
setInterval(function() {
$.ajax({
contentType: application/json; charset=utf-8,
dataType: json,
url: /SystemMessage/GetMessages,
success: function(data) {
for (msg in data) {
$.gritter.add({
title: data[msg].title,
text: data[msg].text,
sticky: false
});
}
}
})
}, 15000)
});
public ActionResult Submit()
{
ShoppingCartMessage cart = new ShoppingCartMessage();
cart.UserName = User.Identity.Name;
cart.Discounts = 12.50f;
cart.CartID = Guid.NewGuid().ToString();
ListShoppingCartItem> items = new ListShoppingCartItem>();
items.Add(new ShoppingCartItem()
{ Quantity = 12, SKU = 10000101010,
UnitPrice = 15.75f });
items.Add(new ShoppingCartItem()
{ Quantity = 27, SKU = 12390123j213,
UnitPrice = 99.92f });
cart.CartItems = items.ToArray();
cartQueue.AddMessage(cart);
return View();
}
实现 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)
