我对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测试EXISTS。 SerenaForTest网址:https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest 队列存在。 错误:AmazonServiceException。错误代码:AWS.SimpleQueueService.NonExistentQueue
这是stacktrace:
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) 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) 在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测试都失败了,但出于同样的原因。
提前致谢!!!
答案 0 :(得分:5)
偶然发现同样的问题。仔细阅读Java文档后,解决方案非常简单:)
创建SQSClient时,只需设置client.setEndPoint(...)
sqsClient = new AmazonSQSClient( credentials );
sqsClient.setEndpoint("sqs.eu-west-1.amazonaws.com");
处找到的端点值
答案 1 :(得分:4)
您确定您创建的队列与Java SQS客户端所在的区域相同吗? AWS SDK for Java中的默认区域是US-East-1。您可以通过查看右上角的管理控制台来验证队列的区域。
答案 2 :(得分:0)
我相信如果您使用的权限没有所有队列的权限,listQueues()
将失败(至少在某些时候这是一个问题)。