2013-08-09 28 views
6

Tôi tương đối mới với dịch vụ SQS SQS. Tôi đã viết một số mã để bọc api SQS của Amazon.AWS.SimpleQueueService.NonExistentQueue Ngoại lệ được ném khi truy cập hàng đợi SQS hiện tại

Tôi có thể thực hiện chức năng cơ bản với hàng đợi đã tạo, nhưng mặc dù vậy (thực tế tôi đã sử dụng mã này bao giờ hết mà không gặp vấn đề gì cả, và tôi đang tạo các kiểm tra JUnit như một hình thức), tôi không thực hiện được kiểm tra JUnit của mình vì một lỗi có ý nghĩa với tôi.

Tôi đã tạo một tên hàng đợi SerenaQForTest bằng bảng điều khiển quản lý AWS. Khi tôi nhìn vào AWS Console tôi có thể thấy rằng hàng đợi mà tôi đã tạo được liệt kê. Tôi đã đặt quyền trên hàng đợi để mở cho mọi người. Tôi đang viết mã bằng Java.

Khi tôi cố gắng tương tác với hàng đợi, tôi nhận được AmazonServiceException với mã lỗi AWS.SimpleQueueService.NonExistentQueueerror.

Đây là mã của tôi.

Trong Lớp 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); 
} 

và tồn tại() được định nghĩa như sau:

/** 
* 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; 
} 

điều khiển Output:


JUnit thử nghiệm tồn tại. Địa chỉ SerenaForTest: https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest Hàng đợi tồn tại. ERR: AmazonServiceException. Error code: AWS.SimpleQueueService.NonExistentQueue

Đây là stacktrace:

AmazonServiceException: Status Code: 400, AWS dịch vụ: AmazonSQS, AWS Request ID: a2809a40-223f-5c4d-b369-d0c3301a8e4e, AWS Error Code : AWS.SimpleQueueService.NonExistentQueue, AWS Thông báo lỗi: Hàng đợi được chỉ định không tồn tại cho phiên bản wsdl này. tại com.amazonaws.http.AmazonHttpClient.handleErrorResponse (AmazonHttpClient.java:644) tại com.amazonaws.http.AmazonHttpClient.executeHelper (AmazonHttpClient.java:338) tại com.amazonaws.http.AmazonHttpClient.execute (AmazonHttpClient. java: 190) tại com.amazonaws.services.sqs.AmazonSQSClient.invoke (AmazonSQSClient.java:875) tại com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl (AmazonSQSClient.java:364) tại com.tutelatechnologies. SQLiteConverter.cloud.CloudSQS.exists (CloudSQS.java:301) tại com.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists (CloudSQSTest.java:169) tại sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) lúc mặt trời .reflect.NativeMethodAccessorImpl.invoke (NativeMethod AccessorImpl.java:57) tại sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) tại java.lang.reflect.Method.invoke (Method.java:601) tại org.junit.runners.model. FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:45) tại org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15) tại org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java : 42) tại org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:20) tại org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28) tại tổ chức .junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java: 30) tại org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:263) tại org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:68) tại org.junit.runners.BlockJUnit4ClassRunner. runChild (BlockJUnit4ClassRunner.java:47) tại org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:231) tại org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:60) tại org. junit.runners.ParentRunner.runChildren (ParentRunner.java:229) tại org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:50) tại org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java: 222) tại org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28) tại org.juni t.internal.runners.statements.RunAfters.evaluate (RunAfters.java:30) tại org.junit.runners.ParentRunner.run (ParentRunner.java:300) tại org.eclipse.jdt.internal.junit4.runner. JUnit4TestReference.run (JUnit4TestReference.java:50) tại org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) tại org.eclipse.jdt.internal.junit.runner.RemoteTestRunner. runTests (RemoteTestRunner.java:467) tại org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) tại org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) tại org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)

Từ đó bạn có thể thấy rằng hàm có thể lấy URL hàng đợi và tìm thấy kết quả phù hợp. Nhưng nó vẫn ném một ngoại lệ.

Bất kỳ ai có bất kỳ ý tưởng nào về việc điều này đang xảy ra? Tôi gọi tồn tại() mỗi khi tôi cần phải ném một cái gì đó vào hoặc lấy một cái gì đó ra khỏi hàng đợi để thực sự của nó thất bại tất cả các bài kiểm tra JUnit của tôi, nhưng vì những lý do tương tự.

Cảm ơn trước !!!

Trả lời

0

Tôi tin rằng listQueues() sẽ không thành công nếu bạn đang sử dụng bằng chứng xác thực không có quyền cho tất cả các hàng đợi (ít nhất đây là vấn đề tại một số điểm).

+0

Cảm ơn đã trả lời, Rob. Vấn đề là tôi thực sự có thể in ra đối tượng listQueuesResult được trả về từ .listQueues(). Có thể nó sẽ trả về listQueueResult đúng và vẫn ném một ngoại lệ? Xin lỗi để pester nếu đó là một câu hỏi ngớ ngẩn. Im tổng số n00b với AWS SQS. –

+0

Bạn nên in dấu vết ngăn xếp và xem chính xác cuộc gọi nào đang gây ra ngoại lệ. Nếu bạn thêm dấu vết ngăn xếp vào câu hỏi ở trên, tôi có thể giúp bạn cố gắng tìm ra. – Rob

+0

Cập nhật với stacktrace. Cảm ơn Rob. Theo dõi ngăn xếp theo nghĩa đen nói với bạn rằng hàng đợi tôi yêu cầu không tồn tại (cho phiên bản wsld này. Tôi không chắc chắn điều này có nghĩa là thực sự nhưng tôi đã tìm thấy điều này trên diễn đàn AWS: https://forums.aws.amazon.com /message.jspa?messageID=107862 Tuy nhiên, tôi đang sử dụng một hàng đợi mà tôi đã thực hiện thông qua giao diện quản lý AWS dưới một tuần trước đây). Tôi hy vọng các stacktrace được chúng tôi một bước gần để giải quyết vấn đề. Cảm ơn một lần nữa! –

4

Bạn có chắc chắn rằng hàng đợi bạn đã tạo nằm trong cùng một vùng mà ứng dụng khách Java SQS của bạn sẽ làm không? Vùng mặc định trong SDK AWS cho Java là US-East-1. Bạn có thể xác minh vùng của hàng đợi bằng cách xem bảng điều khiển quản lý ở trên cùng bên phải.

+0

cảm ơn câu trả lời của bạn, Wade. Tôi chỉ cần kiểm tra lại và url cho hàng đợi của tôi như được hiển thị trong bảng điều khiển quản lý AWS là sqs.us-west-2.amazonaws.com. Khách hàng cũng được thiết lập cho khu vực tây-2. Shucks. –

+0

Làm cách nào để thay đổi mặc định của SQS java? Tôi đang tạo một ứng dụng trong Android và nó hoạt động khá tốt trên chúng tôi-đông-1 nhưng không phải trên khu vực khác .. – mboy

+0

Tôi đã tìm ra. Bạn cần đặt điểm cuối của mình 'sqsClient.setEndpoint (" sqs.ap-northeast-1.amazonaws.com ");' – mboy

5

Tình cờ gặp vấn đề tương tự. Giải pháp là khá đơn giản sau khi đọc các tài liệu Java cẩn thận hơn :) Đơn giản chỉ cần thiết lập client.setEndPoint(...) khi tạo SQSClient bạn

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

giá trị Endpoint tìm thấy tại AWS Link

Các vấn đề liên quan