初涉AWS 之SQS在.Net中的使用

SQS,Amazon Simple Queue Service

了解SQS

从创建到使用

SQS有两种模式,一种是争抢模式,另一种是FIFO(first in first out),看自己需要配置

使用aws的SQS,首先先从NuGet下载AWSSDK,AWSSDK.Core.这两个程序包属于互相有交集又有补集的程序包。Core是用在核心代码,另一个用在app层。

需要使用SQS需要在appconfig文件中添加你的账户密钥

1  <appSettings>
2     <add key="AWSKeyId" value="XXXXXXXXXM7YLSPZMQ" />
3     <add key="AWSSecretId" value="xxxxxxxxxxxxxxxxxx4pXoFUPMeXFxDGWzTc" />
4     <add key="AWSProfileName" value="{yourprofilename}" />
5     <add key="AWSRegion" value="cn-north-1" />
appconfig

创建一个client

1  AmazonSQSConfig amazonSQSConfig = new AmazonSQSConfig();
2             AmazonSQSClient amazonSQSClient = new AmazonSQSClient(amazonSQSConfig);
client

写入一个message

 1 SendMessageRequest sendMessageRequest = new SendMessageRequest();
 2             sendMessageRequest.QueueUrl = myQueueURL;
 3             sendMessageRequest.MessageBody = "e-mail test";
 4 
 5 
 6             MessageAttributeValue senderValue = new MessageAttributeValue();
 7             senderValue.DataType = "String";
 8             senderValue.StringValue = "riusmary";
 9             sendMessageRequest.MessageAttributes["sender"] = senderValue;
10 
11             MessageAttributeValue addressValue = new MessageAttributeValue();
12             addressValue.DataType = "String";
13             addressValue.StringValue = "riusmary@qq.com";
14             sendMessageRequest.MessageAttributes["address"] = addressValue;
15 
16             MessageAttributeValue subjectValue = new MessageAttributeValue();
17             subjectValue.DataType = "String";
18             subjectValue.StringValue = "01232018testing aws sqs";
19             sendMessageRequest.MessageAttributes["subject"] = subjectValue;
20 
21             MessageAttributeValue bodyValue = new MessageAttributeValue();
22             bodyValue.DataType = "String";
23             bodyValue.StringValue = "lalalala3";
24             sendMessageRequest.MessageAttributes["body"] = bodyValue;
25 
26 
27             amazonSQSClient.SendMessage(sendMessageRequest);
send message

读取message

 1 ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
 2             receiveMessageRequest.QueueUrl = myQueueURL;
 3             List<string> attrName = new List<string>();
 4             attrName.Add("sender");
 5             attrName.Add("subject");
 6             attrName.Add("address");
 7             attrName.Add("body");
 8             receiveMessageRequest.MessageAttributeNames = attrName;
 9 
10             ReceiveMessageResponse result = amazonSQSClient.ReceiveMessage(receiveMessageRequest);
11             string receiptHandle;
12 
13             if (result.Messages.Count != 0)
14             {
15                 for (int i = 0; i < result.Messages.Count; i++)
16                 {
17                     if (result.Messages[i].Body == myMessageBody)
18                     {
19                         receiptHandle = result.Messages[i].ReceiptHandle;
20                         try
21                         {
22                             sender = result.Messages[i].MessageAttributes["sender"].StringValue;
23                             mailSubject = result.Messages[i].MessageAttributes["subject"].StringValue;
24                             mailAddress = result.Messages[i].MessageAttributes["address"].StringValue;
25                             mailBody = result.Messages[i].MessageAttributes["body"].StringValue;
26                             SendEmail(sender, mailSubject, mailAddress, mailBody);
27 
28                             DeleteSQSMessage(amazonSQSClient, myQueueURL, receiptHandle);
29                         }
30                         catch (Exception)
31                         {
32                             var myMessage = result.Messages[i];
33                             SendToDeadLetterQueue(amazonSQSClient, myDeadQueueURL, myMessage);
34                         }
35                     }
36                 }
37             }
receive message

每个queue可以建立自己相对应的Dead Letter Queue,看自己需要

删除一个message

1  DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest();
2             deleteMessageRequest.QueueUrl = myQueueURL;
3             deleteMessageRequest.ReceiptHandle = receiptHandle;
4             DeleteMessageResponse response = amazonSQSClient.DeleteMessage(deleteMessageRequest);
delete message

这位外国小哥哥的代码给我了一些参考,附上 Consuming Amazon Web Services (SQS, S3) using C#.NET , RaisKazi, 12 Dec 2011

另,使用过程中你可能会遇到这个问题, Why do SqS messages sometimes remain in-flight on queue

P.S. 附上论坛,可能有所帮助。https://forums.aws.amazon.com/

原文地址:https://www.cnblogs.com/riusmary/p/8358660.html