新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 如何構建應用程序引擎以及使用 Windows Azure Storage 實現異步消息傳送

        如何構建應用程序引擎以及使用 Windows Azure Storage 實現異步消息傳送

        作者: 時間:2012-02-18 來源:網絡 收藏

         圖 7 以 toast 形式顯示的通知

        本文引用地址:http://www.104case.com/article/149634.htm

        $(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) 
        });

          提交和處理購物車

          在我們的示例中,我們希望使用隊列存儲執行的另一個關鍵方案是提交購物車。Hollywood Hackers 有一個第三方履行系統(Hollywood Hackers 無法在其空間有限的倉庫中保留所有小工具),所以引擎需要對購物車進行一些處理。一旦引擎完成其處理,它會向用戶通知隊列提交一個,告知用戶已經對購物車進行了處理(或者出現了問題)。如果處理購物車時用戶處于在線狀態,該用戶將收到系統彈出的一個 toast 。如果用戶不在線,則會在其下次登錄到該站點時收到該彈出消息,如圖 8 所示。

        圖 8 示例用戶通知

        云存儲:使用 Windows Azure Storage 增強應用程序的引擎

          查看原圖(大圖)

          我們首先需要的是一些包裝類,使我們可以與購物車隊列交互。這些包裝非常簡單,如果要查看它們的源代碼,可以在 CodePlex 站點上查看。

          與標準 CRUD(創建、讀取、更新、刪除)存儲庫不同的是,隊列中的讀取操作不是單純的讀取操作。請記住,只要獲取隊列中的消息,必須在有限的時間內處理該消息,操作失敗或刪除消息都會顯示處理完成。這種模式不能順利地轉換到存儲庫模式,所以我們已經不再借助包裝類執行此操作。

          現在,我們已經擁有了要與購物車隊列交互的代碼,我們可以將一些代碼放在購物車控制器中,以便將購物車內容提交到隊列中(請參見圖 9)。

          圖 9 向隊列提交購物車

        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(); 
          }

        在實際情況下,您可能會從進程外狀態(例如會話存儲、緩存或窗體發布)獲得購物車。為了簡化本文代碼,我們僅僅構建了購物車的內容。

          最后,購物車內容已處于隊列中,我們可以修改工作者角色,以便它可以定期檢查隊列中掛起的購物車。它每次會從隊列中選擇一個購物車,用整整一分鐘對該購物車進行處理,然后向用戶通知隊列提交一個消息,告知用戶已經對該購物車進行了處理(請參見圖 10)。

          圖 10 檢查隊列中掛起的購物車

        private void ProcessShoppingCarts() 
        { 
          CloudQueueMessage cqm = cartQueue.GetMessage();       
         
          while (cqm != null) 
          {       
            ShoppingCartMessage cart =  
            QueueMessageBase.FromMessageShoppingCartMessage>(cqm); 
         
            toastRepository.AddNotification(new UserTextNotification() 
            { 
              MessageText = String.Format 
              (Your shopping cart containing {0} items has been processed.,  
              cart.CartItems.Length), 
              MessageDate = DateTime.Now,       
              TargetUserName = cart.UserName 
            }); 
            cartQueue.DeleteMessage(cqm); 
             cqm = cartQueue.GetMessage(); 
          } 
        }

          經過對用戶通知表中的隊列消息的存取操作,位于主頁面中的 jQuery Gritter 代碼然后會在下一個 15 秒的輪詢周期中檢測是否存在新消息,然后向用戶顯示購物車 toast 通知。


          總結和后續操作

          本文的目的是使開發人員可以拋開其有形的數據中心這條“安全毛毯”,認識到他們可以使用 執行很多操作,而不僅僅是創建簡單的“Hello World”網站。借助 Queues 和 表存儲的強大功能,以及利用這些強大功能在和其工作者角色之間進行消息,您可以真正使用 Windows Azure 增強的引擎了。

          為使文章簡明易懂,我們將很多代碼都保留為原樣,沒有進行重構。作為熟悉新 Windows Azure Muscle 的練習,請嘗試重構本文中的一些代碼,以加深對隊列的熟練使用,甚至創建一個獨立的程序集,其中包含為任何 ASP.NET MVC 網站進行消息和通知所需的所有代碼。

          主要是親自動手實踐,創建一些站點并看看您都可以執行哪些操作。本文中的代碼位于 Hollywood Hackers 的 CodePlex 站點中。


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 北流市| 灵台县| 镇巴县| 哈密市| 依兰县| 汉沽区| 贵德县| 开远市| 万年县| 阳春市| 雷山县| 密云县| 定襄县| 沁水县| 遂川县| 政和县| 吕梁市| 潼关县| 桃源县| 泗洪县| 车致| 安岳县| 扬州市| 运城市| 武山县| 石首市| 嫩江县| 四川省| 大埔区| 衢州市| 西贡区| 朝阳县| 齐河县| 无极县| 睢宁县| 莱阳市| 英德市| 青州市| 盐城市| 普兰店市| 呼伦贝尔市|