2017-04-21 66 views
3

AWS SQSサービスを検討しています。 java sdkを使用してキューからメッセージを削除しようとすると、私はいくつかの問題に直面しています。Java SDKを使用したAWS SQSメッセージの削除

キューはSQSで作成され、3つのメッセージがあります。このキューは、大規模なメッセージを処理するためのAWS S3ストレージによってバックアップされています。

ここでは、複数回ポーリングしてメッセージを受信する方法を示します。メッセージをポーリングする

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

方法:

SQSメッセージを受信

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メソッドの呼び出しが行われると、プログラムは以下の例外発生した:私はまさに例外の理由を把握することができませんでし

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.lang.AbstractMethodError: com.amazon.sqs.javamessaging.AmazonSQSExtendedClient.deleteMessage(Lcom/ 

ログメッセージを。 上記のコードスニペットで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プルリクエストを示しますが、それは今でもかなり古くなっています。

+0

Henrikにご提案いただきありがとうございます。問題は、Mavenリポジトリからjarファイルを取得したことが原因です。 – Vignesh

0

ライブラリジャーをhttps://github.com/awslabs/amazon-sqs-java-extended-client-lib(ソースをダウンロードしてコンパイル)から選択すると、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)で同じ問題を提起しました。

関連する問題