云模式:为 Windows Azure 设计和部署服务
2010-03-26 00:00:00 来源:WEB开发网//userid|accountid|transactionid|amount
var str = msg.AsString.Split('|');...
第二种方法是,可以将消息序列化为 XML:
using (MemoryStream m =
new MemoryStream(msg.AsBytes)) {
if (m != null) {
XmlSerializer xs = new XmlSerializer(
typeof(Core.TableStorage.UserAccountTransaction));
var t = xs.Deserialize(m) as
Core.TableStorage.UserAccountTransaction;
if (t != null) { ....... }
}
}
当 AccountStorageWorker 由于某种原因发生中断或无法处理消息时,由于消息都保存在队列中,所以不会丢失。如果 AccountStorageWorker 内进行的处理失败,消息将不会从队列中删除并且 20 秒后将重新在队列中可见。
要确保这种行为,应仅在完成工作后调用队列中的 DeleteMessage 方法。如果在超时之前 AccountStorageWorker 没有完成消息处理,则消息将再次在队列中可见,以便其他 AccountStorageWorker 实例可以尝试对其进行处理。图 10 处理存储为字符串的消息。
图 10 处理排队的消息
if (str.Length == 4){
//userid|accountid|transactionid|amount
UserAccountSqlAzureAction ds = new UserAccountSqlAzureAction(
new Core.DataAccess.UserAccountDB("ConnStr"));
try
{
Trace.WriteLine(String.Format("About to insert data to DB:{0}", str),
"Information");
ds.UpdateUserAccountBalance(new Guid(str[0]), new Guid(str[1]),
double.Parse(str[3]));
Trace.WriteLine(msg.AsString, "Information");
accountTransactionLoggQueue.DeleteMessage(msg);
Trace.WriteLine(String.Format("Deleted:{0}", str), "Information");
}
catch (Exception ex)
{
Trace.WriteLine(String.Format(
"fail to insert:{0}", str, ex.Message), "Error");
}
}
更多精彩
赞助商链接