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 !!!
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. –
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
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! –