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

标签 java amazon-web-services amazon-sqs

我对 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);
}

并且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;
}

控制台输出:

JUnit 测试存在。
SerenaForTest 网址:https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest
队列存在。
错误:亚马逊服务异常。错误代码: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)
在 com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:338)
在 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.tuteltechnologies.SQLiteConverter.cloud.CloudSQS.exists(CloudSQS.java:301)
在 com.tutelatetechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists(CloudSQSTest.java:169)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在 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)
在 org.junit.internal.runners.model.ReflectiveCallable.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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
在 org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
在 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.runners.ParentRunner$1.schedule(ParentRunner.java:60)
在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
在 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
在 org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
在 org.junit.runners.ParentRunner.run(ParentRunner.java:300)
在 org.eclipse.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.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

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

任何人都知道为什么会发生这种情况?每次我需要向队列中扔东西或从队列中取出东西时,我都会调用exists(),因此它实际上使我的所有JUnit 测试都失败了,但出于相同的原因。

提前致谢!!!

最佳答案

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

关于java - 访问现有 SQS 队列时抛出 AWS.SimpleQueueService.NonExistentQueue 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157167/

相关文章:

java - Spring Webflux Webclient |内容类型标题设置问题

amazon-web-services - AWS 容器服务 : set max_map_count

amazon-web-services - 如何扇出AWS kinesis流?

amazon-web-services - Amazon SQS 是否有任何服务水平协议(protocol) (SLA)?例如,它的正常运行时间

java - -XX :MinHeapFreeRatio and -XX:MaxHeapFreeRatio 的目的是什么

java - 如何初始化公历,日期为 YYYY-MM-DD 格式?

java - 完成 future : How to apply a function to multiple CompletableFutures?

amazon-web-services - AWS RDS T3 实例是否使用 "unlimited"标志启动?

python - 如何获取SNS发布的消息

java - 具有背压的响应式(Reactive) SQS 轮询器