无法在c#中访问Amazon SQS消息属性
本文关键字:Amazon SQS 消息 属性 访问 | 更新日期: 2023-09-27 18:02:29
我有一个进程创建SQS消息并将其放置在SQS队列中,另一个进程读取这些消息并根据消息体的内容和属性执行某些逻辑。
我可以成功地在具有主体和属性的SQS队列上创建消息,但是我在读取消息属性时遇到了问题!
我确信我的消息创建过程是正确的,我可以在AWS SQS控制台中看到队列的属性。我只是不明白为什么我不能读取这些属性。
创建消息的代码:
IAmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient();
var sendMessageRequest = new SendMessageRequest();
sendMessageRequest.QueueUrl = "myURL";
Dictionary<string, MessageAttributeValue> MessageAttributes = new Dictionary<string, MessageAttributeValue>();
MessageAttributeValue messageTypeAttribute = new MessageAttributeValue();
messageTypeAttribute.DataType = "String";
messageTypeAttribute.StringValue = "HIGH";
MessageAttributes.Add("MESSAGEPRIORITY", messageTypeAttribute);
sendMessageRequest.MessageAttributes = MessageAttributes;
sendMessageRequest.MessageBody = "Thats the message body";
sqs.SendMessage(sendMessageRequest);
上面的工作和一个具有messagpriority =HIGH属性的消息被创建(我可以在SQS控制台看到消息和属性)。
当读取回消息时(我跳过了显示队列URL等的部分代码):
IAmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient();
ReceiveMessageResponse receiveMessage = new ReceiveMessageResponse();
ReceiveMessageRequest request = new ReceiveMessageRequest();
request.QueueUrl = "myURL";
receiveMessage = sqs.ReceiveMessage(request);
string messageBody = receiveMessage.Messages[0].Body;
Dictionary<string, MessageAttributeValue> messageAttributes = receiveMessage.Messages[0].MessageAttributes;
使用上面的代码,我得到了消息的正文,但是属性是空的!在直接使用SQS队列手动创建消息时,我也遇到了同样的问题。我不知道为什么?任何帮助都太好了。多谢,
好了,我算出来了。在调用提取消息之前,需要将属性名称指定为ReceiveMessageRequest对象的属性。
因此,上面的代码需要更改为:IAmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient();
ReceiveMessageResponse receiveMessage = new ReceiveMessageResponse();
ReceiveMessageRequest request = new ReceiveMessageRequest();
//Specify attribute list
List<string> AttributesList = new List<string>();
AttributesList.Add("MESSAGEPRIORITY");
//Assign list and QueueURL to request
request.MessageAttributeNames = AttributesList;
request.QueueUrl = "myURL";
//Receive the message...
receiveMessage = sqs.ReceiveMessage(request);
//Body...
string messageBody = receiveMessage.Messages[0].Body;
//...and attributes
Dictionary<string, MessageAttributeValue> messageAttributes = receiveMessage.Messages[0].MessageAttributes;
以上内容适用于我。希望对大家有用....
要检索消息的所有属性而不指定每个属性,您可以在属性列表中添加"*"或" all "。像这样:
//Specify attribute list
List<string> AttributesList = new List<string>();
AttributesList.Add("*");
AWS SQS ReceiveMessage文档
从SQS中读取的完整方法
public async Task ReadFromSQS()
{
IAmazonSQS sqs = new AmazonSQSClient(RegionEndpoint.EUWest1);
try
{
List<string> AttributesList = new List<string>();
AttributesList.Add("NameOfTheAttribute");
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
receiveMessageRequest.QueueUrl = IdQueue;
receiveMessageRequest.MessageAttributeNames = AttributesList;
ReceiveMessageResponse receiveMessageResponse = await sqs.ReceiveMessageAsync(receiveMessageRequest);
foreach (Message message in receiveMessageResponse.Messages)
{
Debug.WriteLine("Body: "+ message.Body);
Debug.WriteLine("Values: " + message.MessageAttributes.Count);
foreach (var entry in message.MessageAttributes)
{
Debug.WriteLine("Attribute");
Debug.WriteLine("Name: "+ entry.Key);
Debug.WriteLine("Value1: "+ entry.Value.StringValue);
}
}
String messageRecieptHandle = receiveMessageResponse.Messages[0].ReceiptHandle;
//Deleting a message
Debug.WriteLine("Deleting the message.'n");
DeleteMessageRequest deleteRequest = new DeleteMessageRequest();
deleteRequest.QueueUrl = IdQueue;
deleteRequest.ReceiptHandle = messageRecieptHandle;
await sqs.DeleteMessageAsync(deleteRequest);
}
catch (AmazonSQSException ex)
{
Debug.WriteLine("Caught Exception: " + ex.Message);
Debug.WriteLine("Response Status Code: " + ex.StatusCode);
Debug.WriteLine("Error Code: " + ex.ErrorCode);
Debug.WriteLine("Error Type: " + ex.ErrorType);
Debug.WriteLine("Request ID: " + ex.RequestId);
}
Debug.WriteLine("Press Enter to continue...");
Console.Read();
}