Я относительно новичок в службах AWS SQS. Я написал некоторый код, чтобы обернуть Амазонку SQS api.AWS.SimpleQueueService.NonExistentQueue Исключение, возникшее при доступе к существующей очереди SQS
Я могу выполнять основные функции с созданными очередями, но, несмотря на это (на самом деле, я использую этот код навсегда без проблем, и я создаю тесты JUnit как формальность), я терплю неудачу в своем тестировании JUnit, ошибки, которая имеет мало смысла для меня.
Я создал имена очередей SerenaQForTest, используя консоль управления AWS. Когда я смотрю на консоль AWS, я вижу, что указанная мной очередь указана. Я установил разрешения для очереди для каждого. Я кодирую на Java.
Когда я пытаюсь взаимодействовать с очередью, я получаю AmazonServiceException с кодом ошибки AWS.SimpleQueueService.NonExistentQueueerror.
Вот мой код.
В 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);
}
и существует() определяется следующим образом:
/**
* 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 url: https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest Очередь существует. ERR: AmazonServiceException. Код ошибки: AWS.SimpleQueueService.NonExistentQueue
Вот StackTrace:
AmazonServiceException: Статус Код: 400, AWS Service: 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.tutelatechnologies. SQLiteConverter.cloud.CloudSQS.exists (CloudSQS.java:301) на com.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists (CloudSQSTest.java:169) на sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) на солнце .reflect.NativeMethodAccessorImpl.invoke (NativeMethod AccessorImpl.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) 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) на org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:263) на org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:68) на 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.оценка (ParentRunner.java: 222) at org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28) at org.juni t.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) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)
Из этого вы можете видеть, что функция способна захватить URL-адрес очереди и найти совпадение. Но это все еще исключает.
У кого-нибудь есть идеи, почему это происходит? Я вызываю exists() каждый раз, когда мне нужно что-то бросать или что-то делать с очереди, поэтому на самом деле он не выполняет все мои тесты JUnit, но по тем же причинам.
Заранее благодарен!
Спасибо за реагирующий, Роб. Дело в том, что я действительно могу распечатать объект listQueuesResult, возвращенный из .listQueues(). Возможно ли, что он вернет правильный listQueueResult и все еще выдаст исключение? Простите, если это глупый вопрос. Im общий n00b с AWS SQS. –
Вы должны распечатать трассировку стека и посмотреть, какой именно вызов вызывает исключение. Если вы добавите трассировку стека к указанному выше вопросу, я могу помочь вам разобраться в этом. – Rob
Обновлено с помощью stacktrace. Спасибо, Роб. Трассировка стека буквально говорит вам, что очередь, которую я запрашиваю, не существует (для этой версии wsld. Я не уверен, что это значит, но я нашел это на форуме AWS: https://forums.aws.amazon.com /message.jspa?messageID=107862 Тем не менее, я использую очередь, которую я сделал через консоль управления AWS, неделю назад). Надеюсь, что stacktrace приблизит нас к решению проблемы. Еще раз спасибо! –