2014-05-09 30 views
6

'a erişemiyor SQS iletileri oluşturan ve bunları bir SQS kuyruğuna yerleştiren ve bu iletileri okuyan ve iletinin gövdesi ve özniteliklerine göre belirli bir mantığı gerçekleştiren başka bir işlem gerçekleştiren bir işlem var.Amazon SQS ileti öznitelikleri C#

SQS kuyruğunda, gövde ve özniteliklerle bir ileti başarıyla oluşturabilirim, ancak ileti öznitelikleri geri okunurken sorun yaşıyorum!

Mesaj oluşturma sürecimin doğru olduğundan eminim, sıranın AWS SQS konsolundaki öznitelikleri görebiliyorum. Bu özellikleri neden okuyamadığımı anlayamıyorum.

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); 

yukarıdaki işler ve nitelik MESSAGEPRIORITY bir mesaj = YÜKSEK oluşturulur (I SQS Konsolu mesajı ve niteliğini görebilir):

Kodum mesajı oluşturmak için.

mesajı geri okurken (vb Kuyruk URL'yi görüntülemesi kod ben atlanır ettik parçalar): Yukarıdaki kod ile

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; 

, ben iletinin gövdesini olsun, ama nitelikleri boş ! Doğrudan SQS sırasını kullanarak iletiyi el ile oluştururken de aynı sorun var. Nedenini anlayamıyorum? Herhangi bir yardım harika olurdu. Çok teşekkürler,

cevap

15

Tamam, bunu anladım. Öznitelik adlarının, mesajı almak için çağrı yapılmadan önce ReceiveMessageRequest nesnesinin bir özelliği olarak belirtilmesi gerekir. Benim için

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; 

yukarıdaki işler:

Yani, kod yukarıdaki değiştirmek gerekiyor. Umarım birileri için yararlı olacaktır ....

+0

İyi bulmak, ben nitelikler yanlış ayarlanmış vardı düşünerek bir süre geçirdi. MessageAttributeNames listesini satır içi yaparak işleri biraz basitleştirebilirsiniz; request.MessageAttributeNames = new List () {"MESSAGEPRIORITY"}; kısa bir öznitelikler listeniz varsa, daha net bir yol. – sixones

7

Her bir mesajı belirtmeden bir iletinin tüm özelliklerini almak için öznitelikler listenize "*" veya "Tümü" koyabilirsiniz. böylece gibi:

//Specify attribute list 
List<string> AttributesList = new List<string>(); 
AttributesList.Add("*"); 

AWS SQS ReceiveMessage documentation