SQS,Amazon Simple Queue Service
SQS有两种模式,一种是争抢模式,另一种是FIFO(first in first out),看自己需要配置
使用aws的SQS,首先先从NuGet下载AWSSDK,AWSSDK.Core.这两个程序包属于互相有交集又有补集的程序包。Core是用在核心代码,另一个用在app层。
需要使用SQS需要在appconfig文件中添加你的账户密钥
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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" />
创建一个client
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 AmazonSQSConfig amazonSQSConfig = new AmazonSQSConfig(); 2 AmazonSQSClient amazonSQSClient = new AmazonSQSClient(amazonSQSConfig);
写入一个message
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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);
读取message
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
每个queue可以建立自己相对应的Dead Letter Queue,看自己需要
删除一个message
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 DeleteMessageRequest deleteMessageRequest = new DeleteMessageRequest(); 2 deleteMessageRequest.QueueUrl = myQueueURL; 3 deleteMessageRequest.ReceiptHandle = receiptHandle; 4 DeleteMessageResponse response = amazonSQSClient.DeleteMessage(deleteMessageRequest);
这位外国小哥哥的代码给我了一些参考,附上 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/