13

私は AWS SQS サービスに比較的慣れていません。Amazon SQS API をラップするコードをいくつか書きました。

作成されたキューで基本的な機能を実行できますが、それにもかかわらず (実際、このコードを問題なく使用しており、形式として JUnit テストを作成しています)、次のエラーのために JUnit テストに失敗しています。私にはほとんど意味がありません。

AWS マネジメント コンソールを使用して、SerenaQForTest という名前のキューを作成しました。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);
}

また、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 url : https://sqs.us-west-2.amazonaws.com/079023477467/SerenaForTest キューが存在します。エラー: AmazonServiceException. エラーコード: 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.tutelatechnologies.SQLiteConverter.cloud.CloudSQS で。存在する (CloudSQS.java:301) com.tutelatechnologies.SQLiteConverter.cloud.CloudSQSTest.testExists(CloudSQSTest.java:

このことから、関数がキュー URL を取得でき、一致が見つかったことがわかります。しかし、それでも例外がスローされます。

なぜこれが起こっているのか、誰にも考えがありますか?何かをキューに投入したり、キューから何かを取り出したりする必要があるたびに exists() を呼び出すため、実際にはすべての JUnit テストが失敗しますが、同じ理由があります。

前もって感謝します!!!

4

3 に答える 3

6

作成したキューが、Java SQS クライアントが移動するのと同じリージョンにあることは確かですか? AWS SDK for Java のデフォルトのリージョンは US-East-1 です。右上の管理コンソールを見ると、キューのリージョンを確認できます。

于 2013-08-12T17:57:21.017 に答える
0

すべてのキューに対するアクセス許可を持っていない資格情報を使用している場合、失敗すると思いlistQueues()ます (少なくともこれはある時点で問題でした)。

于 2013-08-10T05:30:02.333 に答える