Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 504
miss.serena Avatar asked Aug 09 '13 23:08

miss.serena


People also ask

What is the error code for simplequeueservice in AWS?

(Service: AmazonSQS; Status Code: 400; Error Code: AWS.SimpleQueueService.NonExistentQueue; Request ID:XXXXXX The fix is to use the Queue’s URL instead of the name. None of the documentation I was reading pointed that out, so I’m writing it here!

What to do if I lose access to my Amazon SQS queue?

If you lose access to your Amazon SQS queue while using a Deny policy in the Amazon SQS Access Policy, try the following steps: Use your root user credentials to access the queue. Account owner root user credentials allow full access to all resources in the account.

Which queue purges a query request in AWS?

The following example query request purges a queue named MyQueue . The structure of AUTHPARAMS depends on the signature of the API request. For more information, see Examples of Signed Signature Version 4 Requests in the AWS General Reference .

What does it mean when a queue doesn't exist?

The specified queue doesn't exist. Indicates that the specified queue previously received a PurgeQueue request within the last 60 seconds (the time it can take to delete the messages in the queue). The following example query request purges a queue named MyQueue .


2 Answers

Are you sure that the queue you created is in the same region that your Java SQS client is going to? The default region in the AWS SDK for Java is US-East-1. You can verify your queue's region by looking at the management console in the top right.

like image 110
Wade Matveyenko Avatar answered Oct 22 '22 19:10

Wade Matveyenko


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

like image 20
Srikar Appalaraju Avatar answered Oct 22 '22 19:10

Srikar Appalaraju