简体   繁体   English

使用Java sdk删除AWS SQS消息

[英]Deleting AWS SQS messages using Java sdk

I'm exploring the AWS SQS service. 我正在探索AWS SQS服务。 When trying to delete message from queue using java sdk i'm facing some issue. 当尝试使用java sdk从队列中删除消息时,我遇到了一些问题。

A queue is created in SQS and it has three messages. 队列在SQS中创建,它有三条消息。 The queue is backed by AWS S3 storage for handling large size messages. 该队列由AWS S3存储支持,用于处理大型消息。

Here is the method used to receive the messages by polling multiple times. 以下是通过多次轮询接收消息的方法。

Receive SQS message : 接收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);
        }
    }

Method to poll for messages: 轮询消息的方法:

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

Delete SQS message: 删除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());
        }

    }

When the call to deleteMessage method is made, the program encounters the below exception: 当调用deleteMessage方法时,程序遇到以下异常:

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

Log messages: 记录消息:

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)

I couldn't exactly figure out the reason for the exception. 我无法弄清楚异常的原因。 Am I missing any thing in the above code snippet using java sdk? 我在上面的代码片段中使用java sdk缺少任何内容吗?

Thanks in advance for any suggestions. 在此先感谢您的任何建议。

I am not using the Amazon SQS Extended Client Library for Java myself, so I can not really judge the details, but it looks like it has gotten out of sync with the AWS Java SDK. 我自己没有使用Amazon SQS扩展客户端库 ,所以我无法真正判断细节,但看起来它与AWS Java SDK不同步。

See Exeption on AmazonSQSExtendedClient.deleteMessage for a (so far unresolved) issue on this, as well as SQS Extended Client Lib not compatible with Core SDK 1.11.xx for a more general one. 请参阅AmazonSQSExtendedClient.deleteMessage上的Exeption以了解(目前尚未解决的)此问题,以及与Core SDK 1.11.xx不兼容的SQS扩展客户端库,以获得更一般的问题。

The latter points to the eventually helpful support aws-sdk-java 1.11.8 pull request, though that one is pretty outdated by now as well. 后者指向最终有用的支持aws-sdk-java 1.11.8 pull请求,尽管那个现在已经过时了。

The SQS messages are getting deleted successfully when the library jars are picked from https://github.com/awslabs/amazon-sqs-java-extended-client-lib (downloaded the source and compiled). https://github.com/awslabs/amazon-sqs-java-extended-client-lib (下载源代码并编译)中挑选库jar时,SQS消息将被成功删除。

However when it is picked from maven repository as below it is having issue as mentioned in the initially posted question. 但是,如果从maven存储库中选择它,则会出现最初发布的问题中提到的问题。

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

I have raised an issue in github ( https://github.com/awslabs/amazon-sqs-java-extended-client-lib/issues/18 ) stating the same. 我在github( https://github.com/awslabs/amazon-sqs-java-extended-client-lib/issues/18 )中提出了同样的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM