簡體   English   中英

Amazon SQS 消息屬性

[英]Amazon SQS Message Attributes

我無法正確添加屬性。 我使用的是 AWS 1.7 添加它們時,它們顯示在消息正文中,而不是屬性中。 當我登錄到 AWS 控制台時,我可以看到這一點。

我使用以下代碼添加消息屬性:

                Message awsMessage = new Message();         

    Map<String, MessageAttributeValue> messageAttributes = 
new HashMap<String, MessageAttributeValue>();

                messageAttributes.put("email", new MessageAttributeValue()
                .withDataType("String")
                .withStringValue(email));
                messageAttributes.put("data", new MessageAttributeValue()
                .withDataType("String")
                .withStringValue(newFileName));
                messageAttributes.put("template", new MessageAttributeValue()
                .withDataType("String")
                .withStringValue(filename));

                awsMessage.setMessageAttributes(messageAttributes);

我嘗試使用它來提取屬性:

List<Message> messages = SQSUtilityClass.getMessagesFromQueue(QUEUE_URL);
    int size = messages.size();
    Map<String, String> attributes = new HashMap<String, String>();
    System.out.println("Size: "+size);
    for(int x =0;x<size;x++){
        Message message = messages.get(x);
        //System.out.println(message.getBody());
        attributes = message.getAttributes();
        for(String key: attributes.keySet()){
            System.out.println(key + " - "+ attributes.get(key));
        }
    }

盡管如此,當我通過 AWS 控制台查看時,我的屬性仍在消息正文中。

第一的。 您需要指定要通過消息接收哪些屬性。 以下代碼將接收屬性emaildatatemplate (如您的示例):

final AmazonSQS sqs = // your code to get SQS instance
final String queue = // queue url
final List<Message> messages = sqs.receiveMessage(
    new ReceiveMessageRequest(queue)
        .withMessageAttributeNames("email", "data", "template")
).getMessages();

第二。 您應該使用message.getMessageAttributes()而不是message.getAttributes()

final String email =
    message.getMessageAttributes().get("email").getStringValue()

您可以使用以下庫生成 SQS。

  <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>amazon-sqs-java-messaging-lib</artifactId>
      <version>${aws-messaging-lib-version}</version>
      <type>jar</type>
  </dependency>

這是要生成的示例代碼。

    SendMessageRequest request = new SendMessageRequest();
    request.withMessageAttributes(mapMessageAttributes(messageAttributes));
    request.setMessageBody(message);
    request.setQueueUrl(queueUrl);
    sqsClient.sendMessage(request);

其中 mapMessageAttributes(messageAttributes) 返回一個 Map,而 sqsClient 是 AmazonSQSClient 的一個實例。

將屬性傳遞給 SQS 后,我將使用 JMS 庫通過將它們設置為 Spring DefaultMessageListenerContainer 來使用它們。

        SQSConnectionFactory connectionFactory =
                SQSConnectionFactory.builder()
                        .withRegion(AWSSQSUtils.getAWSRegion(region))
                        .withAWSCredentialsProvider(new DefaultAWSCredentialsProviderChain())
                        .withNumberOfMessagesToPrefetch(prefetchCount)
                        .withClientConfiguration((new ClientConfiguration())
                                .withMaxConnections(connectionsCount)
                                .withProxyHost(proxyHost)
                                .withProxyPort(proxyPort))
                        .build();

        LOG.info("Connection factory initialized..");

        // Create the connection.
        SQSConnection connection = connectionFactory.createConnection();

        // Create the transacted session with UNORDERED_ACKNOWLEDGE mode.
        Session session = connection.createSession(false, SQSSession.UNORDERED_ACKNOWLEDGE);
        Queue immediateQueue = session.createQueue(safInputQueueImmediate);
        Queue normalQueue = session.createQueue(safInputQueueNormal);

        LOG.info("Connection established and session created..");

        //Create listeners
        immediateListnerContainer = new
                DefaultMessageListenerContainer();
        immediateListnerContainer.setConnectionFactory(connectionFactory);
        immediateListnerContainer.setMaxConcurrentConsumers(consumerConcurrency);
        immediateListnerContainer.setSessionAcknowledgeMode(SQSSession.UNORDERED_ACKNOWLEDGE);
        immediateListnerContainer.setCacheLevel(DefaultMessageListenerContainer.CACHE_CONSUMER);
        immediateListnerContainer.setDestination(immediateQueue);
        immediateListnerContainer.setMessageListener(
                new StoreAndForwardListener(jobService, persistentMessagingDao));
        immediateListnerContainer.setMaxMessagesPerTask(maxMessagesPerTask);
        immediateListnerContainer.afterPropertiesSet();
        immediateListnerContainer.start();

我使用的是程序化方法與聲明性方法,因為 SQS 支持無序知識,而 Spring JMS 尚不支持這種方法。

在 MessageListener 的 onMessage 方法中,您將收到一個 javax.jms.Message 對象,可以用來獲取所有消息屬性,如下所示。

Enumeration<String> headers = message.getPropertyNames();
while(headers.hasMoreElements()){
   attributeName = headers.nextElement();
   print(message.getStringProperty(attributeName))
}

希望有幫助。

我確實在 AWS 上開了一張票,其中一些屬性在傳輸過程中被丟棄了。 即我設置了 M 個屬性,並且只有 M-1 或 M-2 屬性使其成為 SQS。 一旦我有更新,我會在這里添加它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM