AWS.SimpleQueueService.NonExistentQueue访问现有SQS队列时抛出异常

mis*_*ena 8 java amazon-sqs amazon-web-services

我对AWS SQS服务比较陌生.我已经编写了一些代码来包装Amazon SQS api.

我能够使用创建的队列执行基本功能,但尽管如此(事实上我一直在使用这段代码没有问题,而且我正在创建JUnit测试作为形式),我因为一个错误导致我的JUnit测试失败对我来说没什么意义.

我使用AWS管理控制台创建了一个名为SerenaQForTest的队列.当我查看AWS控制台时,我可以看到列出了我创建的队列.我已将队列的权限设置为为所有人打开.我在Java编码.

当我尝试与队列交互时,我得到一个带有错误代码AWS.SimpleQueueService.NonExistentQueueerror的AmazonServiceException.

这是我的代码.

在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);
}
Run Code Online (Sandbox Code Playgroud)

而exists()的定义如下:

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:


JUnit测试EXISTS.SerenaForTest网址:https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest Queue存在.错误:AmazonServiceException.错误代码:AWS.SimpleQueueService.NonExistentQueue

这是堆栈跟踪:

AmazonServiceException:状态代码:400,AWS服务:AmazonSQS,AWS请求ID:a2809a40-223f-5c4d-b369-d0c3301a8e4e,AWS错误代码:AWS.SimpleQueueService.NonExistentQueue,AWS错误消息:此wsdl版本不存在指定的队列.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) )在com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:875)在com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl(AmazonSQSClient.java:364)在com.tutelatechnologies.SQLiteConverter.cloud.CloudSQS.存在(CloudSQS.java:301)在com.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists(CloudSQSTest.java:169)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. Java的:57)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java:601)在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall( FrameworkMethod.java:45)at org.junit.internal.runners.model.Reflective Callable.run(ReflectiveCallable.java:15)org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) org.junit.inun.runners.statements.RunBefores.evaluate(RunBefores.java:28)org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)at org.junit.runners.ParentRunner .runLeaf(ParentRunner.java:263)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)在org.junit.runners. ParentRunner $ 3.run(ParentRunner.java:231)位于org.junit的org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:60)org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) .runners.ParentRunner.access $ 000(ParentRunner.java:50)org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:222)org.junit.internal.runners.statements.RunBefores.evaluat e(RunBefores.java:28)org.ejun上的org.junit.runners.RarentArters.run(ParentRunner.java:300)org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) .jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)在org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)在org.eclipse.jdt.internal .junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)处org.eclipse.jdt.internal.junit.runner org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) .RemoteTestRunner.run(RemoteTestRunner.java:390)at or.e.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

从中您可以看到该函数能够获取队列URL并找到匹配项.但它仍然抛出异常.

任何人都有任何想法为什么会这样?我每次需要抛出一些东西或从队列中取出一些东西时都会调用exists(),因此实际上我的所有JUnit测试都失败了,但出于同样的原因.

提前致谢!!!

Wad*_*nko 5

您确定您创建的队列与您的 Java SQS 客户端所在的区域位于同一区域吗?适用于 Java 的 AWS 开发工具包中的默认区域是 US-East-1。您可以通过查看右上角的管理控制台来验证队列的区域。


Sri*_*aju 5

偶然发现了同样的问题.在仔细阅读Java文档之后,解决方案非常简单:)只需client.setEndPoint(...)在创建SQSClient时进行设置

sqsClient = new AmazonSQSClient( credentials );
sqsClient.setEndpoint("sqs.eu-west-1.amazonaws.com");
Run Code Online (Sandbox Code Playgroud)

AWS Link上找到的端点值


Rob*_*Rob 1

我相信,listQueues()如果您使用的凭据没有所有队列的权限,那么这将会失败(至少在某些时候这是一个问题)。