AWS.SimpleQueueService.NonExistentQueue Exception thrown when Accessing Existing SQS queue

miss.serena picture miss.serena · Aug 10, 2013 · Viewed 19.8k times · Source

I am relatively new to AWS SQS services. I have written some code to wrap the Amazon SQS api.

I am able perform basic functionality with created queues, but despite that (in fact I have been using this code for ever with no problem, and I am creating JUnit tests as a formality), I am failing my JUnit test because of an error that makes little sense to me.

I have created a queue names SerenaQForTest using the AWS Management console. When I look at the AWS Console I can see that the queue I have created is listed. I have set the permissions on the queue to open for everyone. I am coding in Java.

When I try to interact with the queue, I get an AmazonServiceException with error code AWS.SimpleQueueService.NonExistentQueueerror.

Here is my code.

In the Junit Class:

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

and exists() is defined as follows:

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

Console Output:


JUnit Test EXISTS. SerenaForTest url : https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest Queue exists. ERR: AmazonServiceException. Error code: AWS.SimpleQueueService.NonExistentQueue

Here is the stacktrace:

AmazonServiceException: Status Code: 400, AWS Service: AmazonSQS, AWS Request ID: a2809a40-223f-5c4d-b369-d0c3301a8e4e, AWS Error Code: AWS.SimpleQueueService.NonExistentQueue, AWS Error Message: The specified queue does not exist for this wsdl version. at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:644) at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:338) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:190) at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:875) at com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl(AmazonSQSClient.java:364) at com.tutelatechnologies.SQLiteConverter.cloud.CloudSQS.exists(CloudSQS.java:301) at com.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists(CloudSQSTest.java:169) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 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) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.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.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

From that you can see that the function is able to grab the queue URL and that a match is found. But it still throws an exception.

Any one have any ideas why this is happening? I call exists() every time I need to throw something on or take something off of the queue so its actually failing all of my JUnit tests but for the same reasons.

Thanks in advance!!!

Answer

Srikar Appalaraju picture Srikar Appalaraju · Oct 3, 2014

Stumbled on the same problem. Solution is pretty simple after reading the Java docs more carefully :) Simply set client.setEndPoint(...) when creating your SQSClient

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

Endpoint values found at AWS Link