技术开发 频道

【第11篇】Windows Azure兰州拉面馆-日志与队列的使用

  第五步:在Button btnSend的Click中加入btnSend_Click。代码如下:

protected void btnSend_Click(object sender, EventArgs e)
{
//读取Queue服务的配置。注意:RoleManager.GetConfigurationSetting获取的是  
//service configuration(即ServiceConfiguration.cscfg文件)里的配置。
Uri baseUri = new Uri(RoleManager.GetConfigurationSetting("QueueEndpoint"));
string accountName = RoleManager.GetConfigurationSetting("AccountName");
string accountKey = RoleManager.GetConfigurationSetting("AccountSharedKey");
//初始化StorageAccountInfo实体。
StorageAccountInfo account = new StorageAccountInfo(
baseUri,
null,
accountName,
accountKey);
//创建一个QueueStorage(即Queue Storage服务)的实体
QueueStorage service = QueueStorage.Create(account);
//创建一个MessageQueue(即队列)的实体。
//这个queue就是咱们Azure拉面馆的“记菜本”了
//我们把这个记菜本取名为"message"。
MessageQueue queue = service.GetQueue("messages");
//判断当前Queue Storage服务中是否已经存在"message"
if (!queue.DoesQueueExist())
{
queue.CreateQueue();
}
//把点菜信息记录到记菜本中!
Message msg = new Message(txtMessage.Text);
queue.PutMessage(msg);
txtLog.Text
+= "\n你在"+DateTime.Now.ToString("HH点mm分ss秒")+"点了一份\"" + txtMessage.Text.Trim()+'\"';
txtMessage.Text
= string.Empty;
}

  最关键的就是一步:queue.PutMessage(msg); 就这样很轻松地把消息存入队列了。

  第六步:

  打开WorkerRole项目里的WorkerRole.cs。我们首先要对Start()进行override 。

  Start()函数可以理解为Worker Role的入口函数。一旦Worker Role被部署,就会触发Start()。

  我们讨论过,Worker Role的牛X之处就是可以让一段程序一直在运行。如何做到呢?只需把Start()方法写成一个死循环方法就好了。

public override void Start()
{
// 初始化账户信息
Uri baseUri = new Uri(RoleManager.GetConfigurationSetting("QueueEndpoint"));
string accountName = RoleManager.GetConfigurationSetting("AccountName");
string accountKey = RoleManager.GetConfigurationSetting("AccountSharedKey");
StorageAccountInfo account
= new StorageAccountInfo(
baseUri,
null,
accountName,
accountKey);
           QueueStorage service
= QueueStorage.Create(account);           // 取得对这个名叫"message"的记菜本Queue的引用
MessageQueue queue = service.GetQueue("messages");
// 构造死循环           while (true)
{              // 死循环中的程序每一秒执行一次               Thread.Sleep(10000);
if (queue.DoesQueueExist())
{                  
// 取得记菜本中的当前应该处理的消息                   Message msg = queue.GetMessage();
if (msg != null)
{                    
// 记录Windows Azure Log                                    RoleManager.WriteToLog("Critical",
string.Format("大厨已经在{0}把{1} 做好了。",DateTime.Now.ToString("HH点mm分ss秒"), msg.ContentAsString()));
                    
// 记录删除刚才已经处理的那条消息                      queue.DeleteMessage(msg);
}
}
}
}
0
相关文章