2013-08-09 1 views
6

Я относительно новичок в службах 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, но по тем же причинам.

Заранее благодарен!

ответ

0

Я считаю, что listQueues() потерпит неудачу, если вы используете учетные данные, которые не имеют разрешения для всех очередей (по крайней мере, это была проблема в какой-то момент).

+0

Спасибо за реагирующий, Роб. Дело в том, что я действительно могу распечатать объект listQueuesResult, возвращенный из .listQueues(). Возможно ли, что он вернет правильный listQueueResult и все еще выдаст исключение? Простите, если это глупый вопрос. Im общий n00b с AWS SQS. –

+0

Вы должны распечатать трассировку стека и посмотреть, какой именно вызов вызывает исключение. Если вы добавите трассировку стека к указанному выше вопросу, я могу помочь вам разобраться в этом. – Rob

+0

Обновлено с помощью stacktrace. Спасибо, Роб. Трассировка стека буквально говорит вам, что очередь, которую я запрашиваю, не существует (для этой версии wsld. Я не уверен, что это значит, но я нашел это на форуме AWS: https://forums.aws.amazon.com /message.jspa?messageID=107862 Тем не менее, я использую очередь, которую я сделал через консоль управления AWS, неделю назад). Надеюсь, что stacktrace приблизит нас к решению проблемы. Еще раз спасибо! –

4

Вы уверены, что созданная вами очередь находится в том же регионе, в котором находится ваш клиент Java SQS? Область по умолчанию в AWS SDK для Java - US-East-1. Вы можете проверить регион своей очереди, посмотрев на консоль управления в правом верхнем углу.

+0

Спасибо за ваш ответ, Уэйд. Я просто дважды проверил, и URL-адрес моей очереди, как показано на консоли управления AWS, находится в sqs.us-west-2.amazonaws.com. Клиенты также созданы для региона запад-2. Чепуха. –

+0

Как изменить значение по умолчанию для java SQS? Я создаю приложение на Android, и он работает очень хорошо на нас-восток-1, но не на другой регион. – mboy

+0

Я понял. Вам нужно установить конечную точку 'sqsClient.setEndpoint (" sqs.ap-northeast-1.amazonaws.com ");' – mboy

5

Наткнулся на ту же проблему. Решение довольно просто после более внимательного прочтения документации Java :) Просто установите client.setEndPoint(...) при создании вашей SQSClient

sqsClient = new AmazonSQSClient(credentials); 
sqsClient.setEndpoint("sqs.eu-west-1.amazonaws.com"); 

значения конечных точек, найденные в AWS Link