我对 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。 com.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists 存在(CloudSQS.java:301)(CloudSQSTest.java:
从那里您可以看到该函数能够获取队列 URL 并找到匹配项。但它仍然会引发异常。
有人知道为什么会这样吗?每次我需要在队列中添加一些东西或从队列中取出一些东西时,我都会调用 exists() ,因此它实际上失败了我的所有 JUnit 测试,但出于相同的原因。
提前致谢!!!