云模式:为 Windows Azure 设计和部署服务
2010-03-26 00:00:00 来源:WEB开发网public TransactionResponse ReliableInsertMoney(
AccountTransactionRequest accountTransactionrequest) {
//last parameter (true) means that we want to serialize
//message to the queue as XML (serializeAsXml=true)
return UserAccountHandler.ReliableInsertMoney(
accounttransactionRequest.UserId,
accounttransactionRequest.AccountId,
accounttransactionRequest.Amount, true);
}
UserAccountHandler 是返回 IUserAccountAction 的属性,将注入到运行时中。这使将实现与约定分离继而更改实现变得更容易:
public IUserAccountAction<Models.UserAccount> UserAccountHandler
{get;set;}
public UserAccountService(
IUserAccountAction<Models.UserAccount> action) {
UserAccountHandler = action;
}
在将消息发送到其中一个可靠的操作之后,该消息将被置于队列中。图 9 中的第一种方法显示了如何将数据存储为可序列化的 XML,第二种方法显示了如何将数据存储为队列中的字符串。请注意,Windows Azure Queues 中存在消息大小限制,最大为 8KB。
图 9 存储数据
public TransactionResponse ReliableHandleMoneyInQueueAsXml(
UserAccountTransaction accountTransaction){
using (MemoryStream m = new MemoryStream()){
XmlSerializer xs =
new XmlSerializer(typeof(UserAccountTransaction));
xs.Serialize(m, accountTransaction);
try
{
QueueManager.AccountTransactionsQueue.AddMessage(
new CloudQueueMessage(m.ToArray()));
response.StatusForTransaction = TransactionStatus.Succeded;
}
catch(StorageClientException)
{
response.StatusForTransaction = TransactionStatus.Failed;
response.Message =
String.Format("Unable to insert message in the account transaction queue userId|AccountId={0}, messageId={1}",
accountTransaction.PartitionKey, accountTransaction.RowKey);
}
}
return response;
}
public TransactionResponse ReliableHandleMoneyInQueue(
UserAccountTransaction accountTransaction){
TransactionResponse response = this.CheckIfTransactionExists(
accountTransaction.PartitionKey, accountTransaction.RowKey);
if (response.StatusForTransaction == TransactionStatus.Proceed)
{
//userid|accountid is partkey
//userid|accountid|transactionid|amount
string msg = string.Format("{0}|{1}|{2}",
accountTransaction.PartitionKey,
accountTransaction.RowKey,
accountTransaction.Amount);
try
{
QueueManager.AccountTransactionsQueue.AddMessage(
new CloudQueueMessage(msg));
response.StatusForTransaction = TransactionStatus.Succeded;
}
catch(StorageClientException)
{
response.StatusForTransaction = TransactionStatus.Failed;
response.Message =
String.Format("Unable to insert message in the account transaction queue userId|AccountId={0}, messageId={1}",
accountTransaction.PartitionKey, accountTransaction.RowKey);
}
}
return response;
}
更多精彩
赞助商链接