2013-08-09 47 views
6

AWS SQSサービスが比較的新しいです。私はAmazon SQS APIをラップするコードを書いています。AWS.SimpleQueueService.NonExistentQueue既存のSQSキューへのアクセス時にスローされる例外

私は作成されたキューで基本的な機能を実行できますが、実際には問題なくこのコードを使用していますが、JUnitテストを形式として作成しています。私には意味をなさないエラーが発生します。

AWS管理コンソールを使用してキュー名SerenaQForTestを作成しました。 AWS Consoleを見ると、作成したキューが一覧表示されます。私はすべての人が開くようにキューのアクセス許可を設定しました。私はJavaでコーディングしています。

キューと対話しようとすると、エラーコードAWS.SimpleQueueService.NonExistentQueueerrorでAmazonServiceExceptionが発生します。

ここに私のコードです。 JUnitのクラスにおいて

次のよう

/** 
* Prefix for queues used to run junit tests. 
*/ 
private static final String TESTQ = "SerenaForTest"; 

/** 
* Ensures that the queue exists. 
*/ 
@Test 
public void testExists() { 
    System.out.println("JUnit Test EXISTS."); 
    CloudSQS cloudsqs = new CloudSQS(); 
    // this queue does exist and i can see it through the aws management console in sqs 
    assertTrue(cloudsqs.exists(TESTQ)); 
    // this queue does not exist. 
    assertTrue(cloudsqs.exists("thisQDoesNotExist") == false); 
} 

及び存在()が定義される:

/** 
* Determines if the queue exists or not. 
* 
* @param qName 
*   , name of the queue to determine existence of. 
* @return boolean, true if the queue exists; false otherwise. 
*/ 
public boolean exists(final String qName) { 
    boolean retVal = false; 
    try { 
     // create a request for the url of qName 
     GetQueueUrlRequest getQueueUrlRequest = new GetQueueUrlRequest(qName); 

     String addy = sqs.getQueueUrl(getQueueUrlRequest).getQueueUrl(); 
     System.out.println(qName + " url : " + addy); 
     if (addy != null) { 
      // get all queues on sqs 
      ListQueuesResult queues = sqs.listQueues(); 
      // for each url, 
      for (String url : queues.getQueueUrls()) { 
       // System.out.println("Comparing " + addy + " and " + url); 
       if (url.equalsIgnoreCase(addy)) { 
        System.out.println("Queue exists."); 
        retVal = true; 
        break; 
       } 
      } 
     } else { 
      System.out.println("Queue " + qName + " does not exist."); 
     } 
    } catch (AmazonServiceException ase) { 
     System.err.println("ERR: AmazonServiceException. Error code: " + ase.getErrorCode()); 
    } catch (AmazonClientException ace) { 
     System.err.println("ERR: AmazonClientException."); 
     ace.printStackTrace(); 
    } catch (Exception e) { 
     System.err.println("ERR: Regular Old Error."); 
     e.printStackTrace(); 
    } 
    return retVal; 
} 

コンソール出力:


JUnitのテストが存在します。 SerenaForTest URL:https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest キューが存在します。 ERR:AmazonServiceException。エラーコード:

AmazonServiceException:ステータスコード:400、AWSサービス:AmazonSQS、AWSリクエストID:AWS.SimpleQueueService.NonExistentQueue

ここでは、スタックトレースですa2809a40-223f-5c4d-b369-d0c3301a8e4e、AWSのエラーコード:AWS.SimpleQueueService.NonExistentQueue、AWSエラーメッセージ:このwsdlバージョンの指定されたキューは存在しません。 com.amazonaws.http.AmazonHttpClient.executeでcom.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:338) でcom.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:644) (AmazonHttpClientで 。 Javaの:com.tutelatechnologiesでcom.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl(AmazonSQSClient.java:364) でcom.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:875) で190) 。日でsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) でcom.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExistsでSQLiteConverter.cloud.CloudSQS.exists(CloudSQS.java:301) (CloudSQSTest.java:169) .reflect.NativeMethodAccessorImpl.invoke(NativeMethod )。 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.runners.model。 FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java :42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org .junit.internal.runners.statements.RunAfters.evaluate(RunAfters。Javaの:30) org.junit.runners.ParentRunner.runLeafで(org.junit.runners.BlockJUnit4ClassRunnerでorg.junit.runners.BlockJUnit4ClassRunner.runChildでParentRunner.java:263) (BlockJUnit4ClassRunner.java:68) 。 org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:60) at org。 (ParentRunner.java:50) at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:50) 222) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.juni t.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.eclipse.jdt.internal.junit4.runner。 JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner。 (RemoteTestRunner.java:687) at RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

これから、関数がキューのURLを取得し、一致するものが見つかることがわかります。しかし、それはまだ例外をスローします。

これが起こっている理由は何ですか?何かを投げたり、キューから何かを取る必要があるたびにexist()を呼び出すので、JUnitのすべてのテストで実際に失敗するのと同じ理由があります。

ありがとうございます!

答えて

0

すべてのキューのアクセス許可を持たない資格情報を使用している場合(少なくともこれはある時点で問題だった)、listQueues()が失敗すると思います。

+0

おかげで発見

sqsClient = new AmazonSQSClient(credentials); sqsClient.setEndpoint("sqs.eu-west-1.amazonaws.com"); 

エンドポイントの値を作成する際に は、単にclient.setEndPoint(...)を設定した後、非常に単純です。実際には、私は実際に.listQueues()から返されたlistQueuesResultオブジェクトを出力することができます。それは正しいlistQueueResultを返し、まだ例外をスローする可能性はありますか?それが愚かな質問であれば、ごめんなさい。 AWS SQSと合計n00bです。 –

+0

スタックトレースを出力して、例外の原因となっている呼び出しを正確に調べる必要があります。上記の質問にスタックトレースを追加すると、それを把握しようとする手助けができます。 – Rob

+0

stacktraceで更新されました。おかげでロブ。スタックトラックは文字通り、私が要求しているキューが存在しないことを示しています(このwsldバージョンでは、実際に何を意味するのか分かりませんが、AWSフォーラムでこれを見つけました:https://forums.aws.amazon.com /message.jspa?messageID=107862ただし、1週間前にAWS管理コンソールで作成したキューを使用しています)。 stacktraceが問題を解決するための一歩を踏み出すことを願っています。再度、感謝します! –

4

作成したキューがJava SQSクライアントと同じリージョンにあることを確認してください。 Java用AWS SDKのデフォルト領域はUS-East-1です。キューの領域は、右上の管理コンソールで確認できます。

+0

あなたの応答に感謝、ウェイド。 AWS管理コンソールに表示されるキューのURLは、sqs.us-west-2.amazonaws.comにあります。また、クライアントは西西-2地域向けに設定されています。シャックス。 –

+0

Java SQSのデフォルトを変更する方法は?私はAndroidでアプリを作成していて、それは私たちの東1ではかなりうまく動作しますが、他の地域ではうまく動作しません。 – mboy

+0

私はそれを理解しました。あなたのエンドポイントを設定する必要があります 'sqsClient.setEndpoint(" sqs.ap-northeast-1.amazonaws.com ");' – mboy

5

同じ問題が発生しました。ソリューションは、より慎重にJavaのドキュメントを読んで:)あなたSQSClient、ロブを対応するためのAWS Link

関連する問題