我们可以通过消息属性过滤来自Amazon SQS队列的消息吗?

时间:2018-05-17 10:13:43

标签: c# amazon-web-services amazon-sqs

现在我尝试根据Message Attribute Name =“Class”过滤消息。正如您在下面的代码中看到的那样

//Specify attribute list
        List<string> AttributesList = new List<string>();
        AttributesList.Add("Class");
        receiveMessageRequest.MessageAttributeNames = AttributesList;
        receiveMessageRequest.QueueUrl = urlSQS;
        receiveMessageRequest.MaxNumberOfMessages = 10;
        ReceiveMessageResponse receiveMessageResponse = objClient.ReceiveMessage(receiveMessageRequest);

但是消息未根据提供的MessageAttributeName =“class”进行过滤。

4 个答案:

答案 0 :(得分:2)

receiveMessageRequest.MessageAttributeNames = AttributesList;

这告诉SQS如果邮件中存在消息,则希望它返回哪些消息属性。它不是消息过滤器。如果属性不存在,则不会发生任何事情。

但是你的困惑似乎是可以理解的 - 虽然它甚至具有这种功能,但实际上并不明显,尽管它可能是SQS仅支持比现在更小的消息的保留,或者可能是这样的你可以避免花时间从你最终会丢弃的响应中解析信息。我几乎总是要求All

答案 1 :(得分:2)

请注意有关 AWS 上的消息传递服务的这一点

SQS:不支持过滤(在接收消息时)

SNS : 支持基于属性的过滤:订阅者可以设置订阅属性(订阅过滤策略),应用于传入的消息,只有相关的消息才能发送给订阅者。

EventBridge:Amazon EventBridge 支持使用事件模式的声明式过滤。通过事件模式内容过滤,您可以编写仅在非常特定的条件下触发的复杂规则。例如,您可能需要一个规则,该规则仅在事件的字段在特定数字范围内、事件来自特定 IP 地址或仅在事件 JSON 中不存在特定字段时触发。< /p>

有关 AWS 上主要消息传递框架之间的详细区别,请参阅我的文章。

https://www.linkedin.com/pulse/mastering-art-decoupling-application-architecture-aws-amit-meena/

enter image description here

答案 2 :(得分:0)

这取决于有问题的消息如何进入队列。如果您是通过SNS推送消息,那么您可以过滤消息; https://docs.aws.amazon.com/sns/latest/dg/message-filtering.html

目前还不存在任何其他过滤机制。

希望有所帮助!

答案 3 :(得分:0)

按照AWS SDK方法,我们可以使用以下代码进行过滤。

 ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest("QUEUE URL" );        
    receiveMessageRequest.setMaxNumberOfMessages(Integer.valueOf(1));
private static AmazonSQS sqs;   
List<Message> messages = sqs.receiveMessage(receiveMessageRequest.withMessageAttributeNames("Attribute Name")).getMessages();

如果您想要所有消息,请使用给定的代码

    ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest("QUEUE URL" );        
    receiveMessageRequest.setMaxNumberOfMessages(Integer.valueOf(1));
private static AmazonSQS sqs;   
List<Message> messages = sqs.receiveMessage(receiveMessageRequest.withMessageAttributeNames("All")).getMessages();