当前位置: 首页 > 知识库问答 >
问题:

使用Java sdk删除AWS SQS消息

钮勇
2023-03-14

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

队列是在SQS中创建的,它有三条消息。该队列由AWS3存储支持,用于处理大型消息。

下面是通过多次轮询接收消息的方法。

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

    }
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的代码片段中,我是否遗漏了什么?

提前感谢任何建议。

共有1个答案

姜景焕
2023-03-14

我自己并没有使用Amazon SQS Extended Client Libraryfor Java,所以我无法真正判断细节,但它似乎与AWS Java SDK不同步。

请参阅AmazonSQSExtendedClient.DeleteMessage上的Expeption,了解有关此问题的(到目前为止尚未解决的)问题,以及与Core SDK 1.11.xx不兼容的SQS扩展客户端库,了解更一般的问题。

后者指向最终有帮助的支持AWS-SDK-Java1.11.8拉请求,尽管这个请求现在也已经相当过时了。

 类似资料:
  • 当使用JavaSDK(0.4.1)从SB队列检索消息时,即使所讨论的队列为空,也会返回非空。对该结果调用将返回一个非空的。我怎么知道我在一个空队列上打了接听电话?显然,在分布式并发系统中,查询大小不是一个选项。 我使用模式,队列是新创建的,所以我知道它是空的。 根据docs,对API的底层调用应该返回204的状态码。在返回的结果或消息中,我找不到任何方法访问该代码。

  • 我正在使用AzureJavaSDK。有没有办法使用SDK(如CPU和Memory)找出VM的使用指标? 我已经试过了 但这给了我整个地区的度量信息。有没有办法在VM的基础上获取指标?

  • 我目前正在使用亚马逊的SQS,在尝试删除当前“正在运行”的队列消息时遇到问题。 下面是一些示例代码: 现在,在接收到句柄和消息体之后,我将接收句柄字符串存储到云存储中(例如DynamoDB)。随后,我从存储服务中加载该句柄,并使用类似于以下内容的方式调用delete: 但是,当运行该行时,我收到一条“输入收据句柄无效”的错误消息。 注意,我知道这条消息没有被重新接收,所以记录的接收句柄应该是最新的

  • 我正在python3(discord.py 1.3.3,discord 1.0.1)中开发一个discord机器人,我需要删除一条用户消息,但我不知道如何正确调用协同程序。 我查看了一些其他线程,并尝试查看文档(以及discord.py文档),但我一直没有找到答案。 以下是我正在测试的内容: 运行该命令会返回带有ID号的控制台调试消息,但不会删除该消息。如果我添加一个调试打印行后它不会返回。所以这

  • 我已经尝试了下面的代码。 整个代码https://grokonez.com/java-integration/distributed-system/activemq-producer-consumer-springboot-restapis-example