【问题标题】:Deleting AWS SQS messages using Java sdk使用 Java sdk 删除 AWS SQS 消息
【发布时间】:2017-04-21 12:28:12
【问题描述】:

我正在探索 AWS SQS 服务。当尝试使用 java sdk 从队列中删除消息时,我遇到了一些问题。

在 SQS 中创建了一个队列,它包含三个消息。该队列由 AWS S3 存储支持,用于处理大型消息。

这里是通过多次轮询来接收消息的方法。

接收 SQS 消息:

private static void receiveMessage(String queueUrl) {
        // Receive messages
        ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl).withMaxNumberOfMessages(10)
                .withWaitTimeSeconds(10).withVisibilityTimeout(100);
        List<Message> messages = sqsExtended.receiveMessage(receiveMessageRequest).getMessages();
        System.out.println("Number of mesasges : First poll : " + messages.size());
        while (messages.size() > 0) {
            messages = pollForMessages(messages, receiveMessageRequest, queueUrl);
            System.out.println("Messages in next poll : " + messages.size());
        }
        if (messages.size() > 0) {
            System.out.println("displaying last set of messages ");
            for (int i = 0; i < messages.size(); i++) {
                System.out.println("\nMessage received:");
                System.out.println(" ID: " + messages.get(i).getMessageId());
                System.out.println(" Receipt handle: " + messages.get(i).getReceiptHandle());
                System.out.println("approx. num of messages : "
                        + messages.get(i).getAttributes().get("ApproximateNumberOfMessages"));
                System.out.println(" Message body (first sentence): " + messages.get(i).getBody().substring(0, 56));
                // deleteMessage(messages.get(i), queueUrl);
            }
            deleteMessage(messages, queueUrl);
        }
    }

轮询消息的方法:

private static List<Message> pollForMessages(List<Message> messages, ReceiveMessageRequest receiveMessageRequest,
            String queueUrl) {
        // display the received messages
        for (int i = 0; i < messages.size(); i++) {
            System.out.println("\nMessage received:");
            System.out.println(" ID: " + messages.get(i).getMessageId());
            System.out.println(" Receipt handle: " + messages.get(i).getReceiptHandle());
            System.out.println(
                    "approx. num of messages : " + messages.get(i).getAttributes().get("ApproximateNumberOfMessages"));
            System.out.println(" Message body (first sentence): " + messages.get(i).getBody().substring(0, 56));
            // deleteMessage(messages.get(i), queueUrl);
        }
        deleteMessage(messages, queueUrl);
        messages = sqsExtended.receiveMessage(receiveMessageRequest).getMessages();
        return messages;
    }

删除 SQS 消息:

private static void deleteMessage(List<Message> messages, String queueUrl) {
        // Delete the messages
        for (Message message : messages) {
            DeleteMessageRequest dmr = new DeleteMessageRequest();
            dmr.withQueueUrl(queueUrl).withReceiptHandle(message.getReceiptHandle());
            sqsExtended.deleteMessage(dmr);
            System.out.println("Deleted the message with Id : " + message.getMessageId());
        }

    }

当调用deleteMessage方法时,程序遇到如下异常:

java.lang.AbstractMethodError: com.amazon.sqs.javamessaging.AmazonSQSExtendedClient.deleteMessage(Lcom/

日志消息:

Apr 21, 2017 5:32:56 PM com.amazon.sqs.javamessaging.ExtendedClientConfiguration setLargePayloadSupportEnabled
INFO: Large-payload support enabled.
Number of mesasges : First poll : 1

Message received:
 ID: f4f00368-b308-4763-84cf-8e33e1931fed
 Receipt handle: AQEBwhLDOIMobJazre1KoSYoMlHajHD1A6j7gZClk1h4FYWAmFd0p6wIFU69rSuhhVdQef+qF6E6RQIQLWaLqS2r0/Kfw3rUrmppIkTcowsVRW36uJ3p4UqnNjZu0cxncNMw78kHfHRej0gwH0gvvMedZXvEimoXUYZq1+K3Gz35etKsUR9EPKuroYaHZ6Aghdu0Osb4cQu+iLxlBrANhFl63762V7EDEEjSeULyQm52wS/OQq7JiktRWFgyGkp/41tHlN3ARB0v2MM3wXaoZMBt8bAyGURXb+Nx+5e3UoSI5J8pQccSwFnk70N1lV7XUswBTk4549uJ0FPlEMoFef6cxeFi1nxEXkfwIJQ9e93wMJUGLnhsx7rNWhS9w6UCVv4yZoARBsMrQbg287LkACLLnw==
approx. num of messages : null
 Message body (first sentence): {
  "Type" : "Notification",
  "MessageId" : "fc1b19bc-6
Exception in thread "main" java.lang.AbstractMethodError: com.amazon.sqs.javamessaging.AmazonSQSExtendedClient.deleteMessage(Lcom/amazonaws/services/sqs/model/DeleteMessageRequest;)Lcom/amazonaws/services/sqs/model/DeleteMessageResult;
    at org.nfjs.aws.sqs.SQSExtendedClient.deleteMessage(SQSExtendedClient.java:149)
    at org.nfjs.aws.sqs.SQSExtendedClient.pollForMessages(SQSExtendedClient.java:139)
    at org.nfjs.aws.sqs.SQSExtendedClient.receiveMessage(SQSExtendedClient.java:108)
    at org.nfjs.aws.sqs.SQSExtendedClient.main(SQSExtendedClient.java:63)

我无法准确找出异常的原因。 我在上面使用 java sdk 的代码 sn-p 中遗漏了什么吗?

提前感谢您的任何建议。

【问题讨论】:

    标签: java amazon-web-services amazon-sqs aws-java-sdk


    【解决方案1】:

    我自己没有使用Amazon SQS Extended Client Library for Java,所以我无法真正判断细节,但它看起来与AWS Java SDK不同步。

    请参阅Exeption on AmazonSQSExtendedClient.deleteMessage 了解有关此问题的(迄今为止未解决的)问题,以及SQS Extended Client Lib not compatible with Core SDK 1.11.xx 了解更一般的问题。

    后者指向最终有用的 support aws-sdk-java 1.11.8 拉取请求,尽管那个请求现在也已经过时了。

    【讨论】:

    • 感谢 Henrik 的建议。问题似乎在于从 Maven 存储库中挑选的 jar。
    【解决方案2】:

    当从https://github.com/awslabs/amazon-sqs-java-extended-client-lib(下载源代码并编译)中选择库 jar 时,SQS 消息被成功删除。

    但是,当它从 maven 存储库中挑选时,如下所示 它存在最初发布的问题中提到的问题。

    <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>amazon-sqs-java-extended-client-lib</artifactId>
            <version>1.0.0</version>
    </dependency>
    

    我在 github (https://github.com/awslabs/amazon-sqs-java-extended-client-lib/issues/18) 中提出了同样的问题。

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 2012-04-28
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      相关资源
      最近更新 更多