<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于云存儲實(shí)現(xiàn)用Windows Azure Storage增強(qiáng)應(yīng)用程序的引擎

          基于云存儲實(shí)現(xiàn)用Windows Azure Storage增強(qiáng)應(yīng)用程序的引擎

          作者: 時(shí)間:2010-04-17 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/151918.htm

          因?yàn)槲覀兊?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/存儲">存儲機(jī)制已經(jīng)確定,所以我們需要一個工作者角色作為;以便在我們的電子商務(wù)站點(diǎn)的后臺處理消息。為此,我們定義了一個從 Microsoft.ServiceHosting.ServiceRuntime.RoleEntryPoint 類繼承的類,并將其與云服務(wù)項(xiàng)目中的工作者角色關(guān)聯(lián)(請參見圖 5)。

            圖 5 作為的工作者角色

          public class WorkerRole : RoleEntryPoint 
          { 
            ShoppingCartQueue cartQueue; 
            ToastQueue toastQueue; 
            UserTextNotificationRepository toastRepository; 
           
            public override void Run() 
            { 
              // This is a sample worker implementation. 
              //Replace with your logic. 
              Trace.WriteLine(WorkerRole1 entry point called, 
              Information); 
              toastRepository = new UserTextNotificationRepository(); 
              InitQueue(); 
              while (true) 
              { 
                Thread.Sleep(10000); 
                Trace.WriteLine(Working, Information); 
           
                ProcessNewTextNotifications(); 
                ProcessShoppingCarts(); 
              } 
            } 
            private void InitQueue() 
            { 
              cartQueue = new ShoppingCartQueue(); 
              toastQueue = new ToastQueue(); 
            } 
            private void ProcessNewTextNotifications() 
            { 
              CloudQueueMessage cqm = toastQueue.GetMessage(); 
              while (cqm != null) 
              { 
                ToastQueueMessage message = 
                QueueMessageBase.FromMessageToastQueueMessage>(cqm); 
           
                toastRepository.AddNotification(new 
                UserTextNotification() 
                { 
                  MessageText = message.MessageText, 
                  MessageDate = DateTime.Now, 
                  TargetUserName = message.TargetUserName, 
                  Title = message.Title 
                }); 
                toastQueue.DeleteMessage(cqm); 
                cqm = toastQueue.GetMessage(); 
              } 
            } 
            private void ProcessShoppingCarts() 
            { 
              // We will add this later in the article! 
            } 
            public override bool OnStart() 
            { 
              // Set the maximum number of concurrent connections 
              ServicePointManager.DefaultConnectionLimit = 12; 
           
              DiagnosticMonitor.Start(DiagnosticsConnectionString); 
              // For information on handling configuration changes 
              // see the MSDN topic at 
              //http://go.microsoft.com/fwlink/?LinkId=166357. 
              RoleEnvironment.Changing += RoleEnvironmentChanging; 
              return base.OnStart(); 
            } 
            private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) 
            { 
              // If a configuration setting is changing 
              if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)) 
              { 
                // Set e.Cancel to true to restart this role instance 
                e.Cancel = true; 
              } 
            } 
          }

          讓我們看一下工作者角色代碼。在初始化和設(shè)置所需的隊(duì)列和表之后,此代碼將進(jìn)入一個循環(huán)。每 10 秒鐘,它就會處理一次隊(duì)列中的消息。每次我們通過處理循環(huán)時(shí)都將獲取隊(duì)列中的消息,直到最終返回 null,這表示隊(duì)列為空。

            您從隊(duì)列中看到的消息永遠(yuǎn)不會超過 20 個,如果不信,您可以反復(fù)嘗試來驗(yàn)證一下。對隊(duì)列進(jìn)行的任何處理都有時(shí)間限制,必須在該時(shí)間范圍內(nèi)對每個隊(duì)列消息執(zhí)行有意義的操作,否則隊(duì)列消息將被視為超時(shí),并在隊(duì)列中顯示備份,以便可以由其他工作者來處理此消息。每個消息都會作為用戶通知添加到表中。關(guān)于工作者角色需要記住的重要一點(diǎn)是:一旦入口點(diǎn)方法完成,工作者角色也就結(jié)束了。這就是您需要在一個循環(huán)中保持邏輯運(yùn)行的原因。

            從客戶端的角度來說,我們需要能夠以 JSON 形式返回消息,以便 jQuery 可以異步輪詢并顯示新的用戶通知。為此,我們會將一些代碼添加到消息控制器中,以便可以訪問這些通知(請參見圖 6)。

            圖 6 以 JSON 形式返回消息

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

           在 Visual Studio 2010 beta 2 下的 ASP.NET MVC 2(我們用于撰寫本文的環(huán)境)中,如果沒有 JsonRequestBehavior.AllowGet 選項(xiàng),您無法將 JSON 數(shù)據(jù)返回到 jQuery 或其他客戶端。在 ASP.NET MVC 1 中,不需要此選項(xiàng)。現(xiàn)在,我們可以編寫 JavaScript,它每 15 秒將調(diào)用一次 GetMessages 方法并將以 toast 形式消息顯示通知(請參見圖 7)。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();