2013-08-09 14 views
6

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

risposta

0

Credo che listQueues() non riuscirà se si utilizzano credenziali che non dispongono dell'autorizzazione per tutte le code (almeno questo era un problema a un certo punto).

+0

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

+0

È 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

+0

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

4

Sei sicuro che la coda che hai creato si trovi nella stessa regione in cui sarà installato il tuo client Java SQS? L'area predefinita nell'SDK AWS per Java è US-East-1. Puoi verificare la regione della tua coda guardando la console di gestione in alto a destra.

+0

grazie per la tua risposta, Wade. Ho appena controllato due volte e l'url per la mia coda, come mostrato nella console di gestione AWS, è in sqs.us-west-2.amazonaws.com. I client sono anche impostati per la regione west-2. Shucks. –

+0

Come modificare l'impostazione predefinita di java SQS? Sto creando un'app in Android e funziona piuttosto bene su us-east-1 ma non su altre regioni .. – mboy

+0

L'ho capito. È necessario impostare l'endpoint 'sqsClient.setEndpoint (" sqs.ap-northeast-1.amazonaws.com ");' – mboy

5

Inciampato sullo stesso problema. La soluzione è piuttosto semplice, dopo aver letto la documentazione Java con più attenzione :) semplicemente impostare client.setEndPoint(...) durante la creazione del SQSClient

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

valori Endpoint trovate a AWS Link

Problemi correlati