Sono relativamente nuovo ai servizi SQS di AWS. Ho scritto del codice per avvolgere l'API di Amazon SQS.AWS.SimpleQueueService.NonExistentQueue Eccezione generata quando si accede alla coda SQS esistente
Sono in grado di eseguire funzionalità di base con le code create, ma nonostante ciò (in realtà ho usato questo codice per sempre senza problemi e sto creando test JUnit come formalità), sto fallendo il mio test JUnit perché di un errore che ha poco senso per me.
Ho creato un nome di coda SerenaQForTest utilizzando la console di gestione AWS. Quando guardo la Console AWS posso vedere che la coda che ho creato è elencata. Ho impostato le autorizzazioni sulla coda da aprire per tutti. Sto codificando in Java.
Quando tento di interagire con la coda, ottengo un AmazonServiceException con il codice di errore AWS.SimpleQueueService.NonExistentQueueerror.
Ecco il mio codice.
Nella classe 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);
}
ed esiste() è definito come segue:
/**
* 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;
}
uscita della console:
JUnit prova esiste. URL SerenaForTest: https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest La coda esiste. ERR: AmazonServiceException. Codice di errore: AWS.SimpleQueueService.NonExistentQueue
Ecco l'stacktrace:
AmazonServiceException: Codice di stato: 400, AWS servizio: AmazonSQS, AWS Request ID: a2809a40-223f-5c4d-b369-d0c3301a8e4e, Codice AWS errore : AWS.SimpleQueueService.NonExistentQueue, AWS Error Message: la coda specificata non esiste per questa versione wsdl. a com.amazonaws.http.AmazonHttpClient.handleErrorResponse (AmazonHttpClient.java:644) a com.amazonaws.http.AmazonHttpClient.executeHelper (AmazonHttpClient.java:338) a com.amazonaws.http.AmazonHttpClient.execute (AmazonHttpClient. java: 190) a com.amazonaws.services.sqs.AmazonSQSClient.invoke (AmazonSQSClient.java:875) a com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl (AmazonSQSClient.java:364) a com.tutelatechnologies. SQLiteConverter.cloud.CloudSQS.exists (CloudSQS.java:301) a com.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists (CloudSQSTest.java:169) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) al sole .reflect.NativeMethodAccessorImpl.invoke (NativeMethod AccessorImpl.java:57) a sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) a java.lang.reflect.Method.invoke (Method.java:601) a org.junit.runners.model. FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:45) su org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15) su org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java : 42) all'indirizzo org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:20) all'indirizzo org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28) presso org .junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java: 30) a org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:263) a org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:68) a org.junit.runners.BlockJUnit4ClassRunner. runChild (BlockJUnit4ClassRunner.java:47) presso org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:231) presso org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:60) presso org. junit.runners.ParentRunner.runChildren (ParentRunner.java:229) presso org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:50) presso org.junit.runners.ParentRunner $ 2.valore (ParentRunner.java: 222) presso org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28) presso org.juni t.internal.runners.statements.RunAfters.evaluate (RunAfters.java:30) all'indirizzo org.junit.runners.ParentRunner.run (ParentRunner.java:300) all'indirizzo org.eclipse.jdt.internal.junit4.runner. JUnit4TestReference.run (JUnit4TestReference.java:50) all'indirizzo org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) all'indirizzo org.eclipse.jdt.internal.junit.runner.RemoteTestRunner. runTests (RemoteTestRunner.java:467) all'indirizzo org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) all'indirizzo org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) all'indirizzo org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)
Da ciò si può vedere che la funzione è in grado di catturare l'URL della coda e che viene trovata una corrispondenza. Ma lancia comunque un'eccezione.
Qualcuno ha qualche idea del perché questo sta accadendo? Io chiamo exist() ogni volta che ho bisogno di lanciare qualcosa o di togliere qualcosa dalla coda in modo che stia fallendo tutti i miei test JUnit ma per gli stessi motivi.
Grazie in anticipo !!!
Grazie per la risposta, Rob. Il fatto è che sono effettivamente in grado di stampare l'oggetto listQueuesResult restituito da .listQueues(). È possibile che restituisca la lista correttaQueueResult e generi comunque un'eccezione? Mi dispiace infastidire se questa è una domanda stupida. Im un totale n00b con AWS SQS. –
È necessario stampare la traccia dello stack e controllare esattamente quale chiamata sta causando l'eccezione. Se aggiungi la traccia dello stack alla domanda sopra, posso aiutarti a cercare di capirlo. – Rob
Aggiornato con stacktrace. Grazie Rob. La traccia dello stack ti dice letteralmente che la coda che sto richiedendo non esiste (per questa versione di wsld. Non sono sicuro di cosa significhi veramente ma l'ho trovato sul forum di AWS: https://forums.aws.amazon.com /message.jspa?messageID=107862 Tuttavia, sto utilizzando una coda che ho creato tramite la console di gestione AWS meno di una settimana fa). Spero che lo stacktrace ci avvicini di un passo alla risoluzione del problema. Grazie ancora! –