2013-08-09 11 views
6

Ich bin relativ neu in AWS SQS-Diensten. Ich habe Code geschrieben, um die Amazon SQS API zu verpacken.AWS.SimpleQueueService.NonExistentQueue Ausnahme beim Zugriff auf vorhandene SQS-Warteschlange ausgelöst

Ich bin in der Lage grundlegende Funktionalität mit erstellten Warteschlangen durchzuführen, aber trotzdem (tatsächlich habe ich diesen Code für immer ohne Problem verwendet, und ich erstelle JUnit Tests als Formalität), scheitere ich meinen JUnit-Test weil eines Fehlers, der für mich wenig Sinn macht.

Ich habe eine Warteschlange Namen SerenaQForTest mit der AWS Management-Konsole erstellt. Wenn ich mir die AWS-Konsole anschaue, kann ich sehen, dass die von mir erstellte Warteschlange aufgelistet ist. Ich habe die Berechtigungen für die Warteschlange für alle geöffnet. Ich schreibe in Java.

Wenn ich versuche, mit der Warteschlange zu interagieren, erhalte ich eine AmazonServiceException mit dem Fehlercode AWS.SimpleQueueService.NonExistentQueueerror.

Hier ist mein Code.

In der Junit Klasse:

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

und exists() ist wie folgt definiert:

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

Konsolenausgabe:


JUnit-Test VORHANDEN. SerenaForTest-URL: https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest Warteschlange existiert. Fehler: AmazonServiceException. Fehlercode: AWS.SimpleQueueService.NonExistentQueue

Hier ist die Stacktrace:

AmazonServiceException: Statuscode: 400, AWS Service: AmazonSQS, AWS ID anfordern: a2809a40-223f-5c4d-b369-d0c3301a8e4e, AWS Fehlercode : AWS.SimpleQueueService.NonExistentQueue, AWS-Fehlermeldung: Die angegebene Warteschlange ist für diese WSDL-Version nicht vorhanden. bei com.amazonaws.http.AmazonHttpClient.handleErrorResponse (AmazonHttpClient.java:644) bei com.amazonaws.http.AmazonHttpClient.executeHelper (AmazonHttpClient.java:338) bei com.amazonaws.http.AmazonHttpClient.execute (AmazonHttpClient. Java: 190) bei com.amazonaws.services.sqs.AmazonSQSClient.invoke (AmazonSQSClient.java:875) bei com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl (AmazonSQSClient.java:364) bei com.tutelatechnologies. SQLiteConverter.cloud.CloudSQS.exists (CloudSQS.java:301) bei com.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists (CloudSQSTest.java:169) bei sun.reflect.NativeMethodAccessorImpl.invoke0 (Mutter Methode) bei Sonne .reflect.NativeMethodAccessorImpl.invoke (NativeMethod AccessorImpl.java:57) bei sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) bei java.lang.reflect.Method.invoke (Method.java:601) bei org.junit.runners.model. FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:45) bei org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15) bei org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java : 42) bei org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:20) bei org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28) bei org .junit.internal.runners.statements.RunAfters.evaluate (RunAfters.Java: 30) bei org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:263) bei org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:68) bei org.junit.runners.BlockJUnit4ClassRunner. runChild (BlockJUnit4ClassRunner.java:47) bei org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:231) bei org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:60) bei org. junit.runners.ParentRunner.runner.Children (ParentRunner.java:229) bei org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:50) bei org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java: 222) bei org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28) bei org.juni t.internal.runners.statements.RunAfters.evaluate (RunAfters.java30) bei org.junit.runners.ParentRunner.run (ParentRunner.java:300) bei org.eclipse.jdt.internal.junit4.runner. JUnit4TestReference.run (JUnit4TestReference.java:50) bei org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner. runTests (RemoteTestRunner.java:467) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)

Daraus können Sie sehen, dass die Funktion in der Lage ist, die Warteschlangen-URL abzurufen und dass eine Übereinstimmung gefunden wird. Aber es löst immer noch eine Ausnahme aus.

Irgendwelche Ideen, warum dies passiert? Ich rufe exist() immer dann auf, wenn ich etwas anwerfen oder etwas aus der Warteschlange nehmen muss, so dass es tatsächlich aus allen meinen JUnit-Tests ausfällt, aber aus denselben Gründen.

Vielen Dank im Voraus !!!

Antwort

0

Ich glaube, dass listQueues() wird fehlschlagen, wenn Sie Anmeldeinformationen verwenden, die keine Berechtigung für alle Warteschlangen haben (zumindest war dies ein Problem zu einem bestimmten Zeitpunkt).

+0

Vielen Dank für die Beantwortung, Rob gefunden zu schaffen. Die Sache ist, dass ich tatsächlich das listQueuesResult-Objekt ausdrucken kann, das von .listQueues() zurückgegeben wird. Ist es möglich, dass es das richtige listQueueResult zurückgibt und immer noch eine Ausnahme auslöst? Entschuldigen Sie bitte die Frage, ob das eine dumme Frage ist. Ich bin insgesamt N00b mit AWS SQS. –

+0

Sie sollten die Stapelüberwachung drucken und genau prüfen, welcher Anruf die Ausnahme verursacht. Wenn Sie der obigen Frage den Stack-Trace hinzufügen, kann ich Ihnen helfen, es herauszufinden. – Rob

+0

Mit StackTrace aktualisiert. Danke, Rob. Der Stack-Track sagt Ihnen buchstäblich, dass die Warteschlange, die ich anfordere, nicht existiert (für diese WSLD-Version. Ich bin mir nicht sicher, was das wirklich bedeutet, aber ich fand das im AWS-Forum: https://forums.aws.amazon.com /message.jspa?messageID=107862 Ich verwende jedoch eine Warteschlange, die ich vor einer Woche über die AWS Management-Konsole erstellt habe). Ich hoffe, dass uns der Stacktrace einen Schritt näher bringt, um das Problem zu lösen. Danke noch einmal! –

4

Sind Sie sicher, dass die von Ihnen erstellte Warteschlange in derselben Region liegt, in die Ihr Java SQS-Client wechselt? Die Standardregion im AWS SDK für Java ist US-Ost-1. Sie können die Region Ihrer Warteschlange überprüfen, indem Sie die Verwaltungskonsole oben rechts aufrufen.

+0

danke für deine Antwort, Wade. Ich habe es einfach überprüft und die URL für meine Warteschlange, wie sie in der AWS Management-Konsole angezeigt wird, lautet sqs.us-west-2.amazonaws.com. Die Kunden sind auch für die Region West-2 eingerichtet. Scheißt. –

+0

Wie ändert man den Standard von Java SQS? Ich erstelle eine App in Android und es funktioniert ziemlich gut auf uns-Osten-1, aber nicht auf andere Region .. – mboy

+0

Ich fand es heraus. Sie müssen Ihren Endpunkt 'sqsClient.setEndpoint (" sqs.ap-northeast-1.amazonaws.com ");' – mboy

5

stolperte über das gleiche Problem. Lösung ist ziemlich einfach, nachdem die Java-Dokumentation genauer zu lesen :) Einfach client.setEndPoint(...) gesetzt, wenn Ihr SQSClient

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

Endpoint-Werte bei AWS Link