

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SQS Java Messaging Library の使用
<a name="getting-started"></a>

Amazon SQSでJava Message Service (JMS)の使用を開始するには、このセクションのコード例を使用します。以降のセクションでは、JMS接続およびセッションの作成方法や、メッセージの送受信方法を説明します。

Amazon SQS Java Messaging Library に含まれるラップされた Amazon SQS クライアントオブジェクトは、Amazon SQS キューが存在するかどうかをチェックします。キューが存在しない場合は、クライアントがキューを作成します。

## JMS接続の作成
<a name="creating-connection"></a>

開始する前に、「[JMS と Amazon SQS を使用するための前提条件](prerequisites.md)」の前提条件を参照してください。

1. 接続ファクトリを作成し、そのファクトリに対して`createConnection` メソッドを呼び出します。

   ```
   // Create a new connection factory with all defaults (credentials and region) set automatically
   SQSConnectionFactory connectionFactory = new SQSConnectionFactory(
           new ProviderConfiguration(),
           AmazonSQSClientBuilder.defaultClient()
           );
    
   // Create the connection.
   SQSConnection connection = connectionFactory.createConnection();
   ```

   `SQSConnection`クラスは `javax.jms.Connection` を拡張します。JMSのスタンダード接続メソッドと共に、`SQSConnection`は、`getAmazonSQSClient`や `getWrappedAmazonSQSClient`などの追加のメソッドも提供します。どちらのメッソドでも、新しいキューの作成などのJMS仕様には含まれていない管理操作を実行できます。ただし、`getWrappedAmazonSQSClient`メソッドは現在接続で使用されているAmazon SQSクライアントのラップされたバージョンも提供します。ラッパーはクライアントからのすべての例外を `JMSException` に変換するので、`JMSException` を想定する既存のコードでより容易に使用できます。

1. `getAmazonSQSClient`や`getWrappedAmazonSQSClient`から返されるクライアントオブジェクトを使用して、JMS 仕様には含まれていない管理操作 (Amazon SQS キューの作成など) を実行できます。

    既存のコードで JMS 例外を想定している場合は、`getWrappedAmazonSQSClient` を使用する必要があります:
   + `getWrappedAmazonSQSClient`を使用する場合、返されるクライアントオブジェクトはすべての例外をJMS例外に変換します。
   + `getAmazonSQSClient`を使用する場合、例外はすべてAmazon SQS例外になります。

## Amazon SQSキューを作成する
<a name="creating-queue"></a>

ラップされたクライアントオブジェクトは、 Amazon SQSキューが存在するかどうかを確認します。

キューが存在しない場合は、クライアントがキューを作成します。キューが存在する場合、関数からは何も返されません。詳細については、[TextMessageSender.java](sqs-jms-code-examples.md#example-sender) にある「必要に応じてキューを作成する」セクションを参照してください。

### 標準キューを作成するには
<a name="creating-queue-standard"></a>

```
// Get the wrapped client
AmazonSQSMessagingClientWrapper client = connection.getWrappedAmazonSQSClient();
 
// Create an SQS queue named MyQueue, if it doesn't already exist
if (!client.queueExists("MyQueue")) {
    client.createQueue("MyQueue");
}
```

### FIFOキューを作成するには
<a name="creating-queue-FIFO"></a>

```
// Get the wrapped client
AmazonSQSMessagingClientWrapper client = connection.getWrappedAmazonSQSClient();

// Create an Amazon SQS FIFO queue named MyQueue.fifo, if it doesn't already exist
if (!client.queueExists("MyQueue.fifo")) {
    Map<String, String> attributes = new HashMap<String, String>();
    attributes.put("FifoQueue", "true");
    attributes.put("ContentBasedDeduplication", "true");
    client.createQueue(new CreateQueueRequest().withQueueName("MyQueue.fifo").withAttributes(attributes));
}
```

**注記**  
FIFO キュー名は`.fifo`のサフィックスで終わる必要があります。  
`ContentBasedDeduplication`属性の詳細については、「[Amazon SQS の 1 回のみ処理](FIFO-queues-exactly-once-processing.md)」を参照してください。

## 同期的なメッセージの送信
<a name="send-messages-synchronously"></a>

1. 接続と基になる Amazon SQS キューの準備ができたら、 `AUTO_ACKNOWLEDGE`モードで非トランザクションJMSセッションを作成します。

   ```
   // Create the nontransacted session with AUTO_ACKNOWLEDGE mode
   Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
   ```

1. テキストメッセージをキューに送信するには、JMS キュー ID とメッセージプロデューサーを作成します。

   ```
   // Create a queue identity and specify the queue name to the session
   Queue queue = session.createQueue("MyQueue");
    
   // Create a producer for the 'MyQueue'
   MessageProducer producer = session.createProducer(queue);
   ```

1. テキストメッセージを作成し、キューに送信します。
   + メッセージを標準キューに送信するために、追加のパラメータを設定する必要はありません。

     ```
     // Create the text message
     TextMessage message = session.createTextMessage("Hello World!");
      
     // Send the message
     producer.send(message);
     System.out.println("JMS Message " + message.getJMSMessageID());
     ```
   + メッセージをFIFOキューに送信するには、メッセージのグループ IDを設定する必要があります。メッセージ重複排除IDを設定することもできます。詳細については、「[Amazon SQS の FIFO キューの主要な用語](FIFO-key-terms.md)」を参照してください。

     ```
     // Create the text message
     TextMessage message = session.createTextMessage("Hello World!");
     
     // Set the message group ID
     message.setStringProperty("JMSXGroupID", "Default");
     
     // You can also set a custom message deduplication ID
     // message.setStringProperty("JMS_SQS_DeduplicationId", "hello");
     // Here, it's not needed because content-based deduplication is enabled for the queue
     
     // Send the message
     producer.send(message);
     System.out.println("JMS Message " + message.getJMSMessageID());
     System.out.println("JMS Message Sequence Number " + message.getStringProperty("JMS_SQS_SequenceNumber"));
     ```

## 同期的なメッセージの受信
<a name="receive-messages-synchronously"></a>

1. メッセージを受信するには、同じキューにコンシューマーを作成し、`start`メソッドを呼び出します。

   接続での`start`メソッドはいつでも呼び出すことができます。ただし、コンシューマーは呼び出されるまでメッセージの受信を開始しません。

   ```
   // Create a consumer for the 'MyQueue'
   MessageConsumer consumer = session.createConsumer(queue);
   // Start receiving incoming messages
   connection.start();
   ```

1. コンシューマーで、タイムアウトを1秒に設定して`receive`メソッドを呼び出し、受信メッセージの内容を出力します。
   + 標準キューからメッセージを受信したら、メッセージの内容にアクセスできます。

     ```
     // Receive a message from 'MyQueue' and wait up to 1 second
     Message receivedMessage = consumer.receive(1000);
      
     // Cast the received message as TextMessage and display the text
     if (receivedMessage != null) {
         System.out.println("Received: " + ((TextMessage) receivedMessage).getText());
     }
     ```
   + FIFOキューからメッセージを受信したら、メッセージの内容や、その他のFIFO 固有のメッセージ属性 (メッセージグループ ID、メッセージ重複排除 ID、シーケンス番号など) にアクセスできます。詳細については、「[Amazon SQS の FIFO キューの主要な用語](FIFO-key-terms.md)」を参照してください。

     ```
     // Receive a message from 'MyQueue' and wait up to 1 second
     Message receivedMessage = consumer.receive(1000);
     
     // Cast the received message as TextMessage and display the text
     if (receivedMessage != null) {
         System.out.println("Received: " + ((TextMessage) receivedMessage).getText());
         System.out.println("Group id: " + receivedMessage.getStringProperty("JMSXGroupID"));
         System.out.println("Message deduplication id: " + receivedMessage.getStringProperty("JMS_SQS_DeduplicationId"));
         System.out.println("Message sequence number: " + receivedMessage.getStringProperty("JMS_SQS_SequenceNumber"));
     }
     ```

1. 接続とセッションを閉じます。

   ```
   // Close the connection (and the session).
   connection.close();
   ```

出力は次の例のようになります:

```
JMS Message ID:8example-588b-44e5-bbcf-d816example2
Received: Hello World!
```

**注記**  
Spring Framework を使用してこれらのオブジェクトを初期化できます。  
追加情報については、「`SpringExampleConfiguration.xml`」、`SpringExample.java`、および`ExampleConfiguration.java`のほか、`ExampleCommon.java`および[Amazon SQS 標準キューで JMS を使用するための実用的な Java の例](sqs-jms-code-examples.md) に含まれる他のヘルパークラスを参照してください。

オブジェクトの送受信の完全な例については、[TextMessageSender.java](sqs-jms-code-examples.md#example-sender)および[SyncMessageReceiver.java](sqs-jms-code-examples.md#example-synchronous-message-receiver)を参照してください。

## 非同期的なメッセージの受信
<a name="receive-messages-asynchronously"></a>

「[Amazon SQS Java Messaging Library の使用](#getting-started)」の例では、メッセージは`MyQueue`に送信され、同期的に受信されます。

以下の例では、リスナーを介してメッセージを非同期的に受信する方法を示します。

1. `MessageListener`インターフェイスを実装します。

   ```
   class MyListener implements MessageListener {
    
       @Override
       public void onMessage(Message message) {
           try {
               // Cast the received message as TextMessage and print the text to screen.
               System.out.println("Received: " + ((TextMessage) message).getText());
           } catch (JMSException e) {
               e.printStackTrace();
           }
       }
   }
   ```

   `onMessage`インターフェイスの`MessageListener`メソッドは、メッセージを受信すると呼び出されます。このリスナーの実装内で、メッセージに格納されたテキストが出力されます。

1. コンシューマーで明示的に`receive`メソッドを呼び出す代わりに、コンシューマーのメッセージリスナーを`MyListener`実装のインスタンスに設定します。メインスレッドは1秒間待機します。

   ```
   // Create a consumer for the 'MyQueue'.
   MessageConsumer consumer = session.createConsumer(queue);
    
   // Instantiate and set the message listener for the consumer.
   consumer.setMessageListener(new MyListener());
    
   // Start receiving incoming messages.
   connection.start();
    
   // Wait for 1 second. The listener onMessage() method is invoked when a message is received.
   Thread.sleep(1000);
   ```

残りの手順は、「[Amazon SQS Java Messaging Library の使用](#getting-started)」の例の手順と同じです。非同期コンシューマーの完全な例については、「`AsyncMessageReceiver.java`」の[Amazon SQS 標準キューで JMS を使用するための実用的な Java の例](sqs-jms-code-examples.md)を参照してください。

この例の出力は以下の例のようになります:

```
JMS Message ID:8example-588b-44e5-bbcf-d816example2
Received: Hello World!
```

## クライアント確認モードの使用
<a name="using-client-acknowledge-mode"></a>

「[Amazon SQS Java Messaging Library の使用](#getting-started)」の例では`AUTO_ACKNOWLEDGE` モードを使用しています。この場合、受信したすべてのメッセージは自動的に確認されます (このため、基になるAmazon SQSキューから削除されます)。

1. メッセージが処理された後にメッセージを明示的に確認するには、`CLIENT_ACKNOWLEDGE`モードでセッションを作成する必要があります。

   ```
   // Create the non-transacted session with CLIENT_ACKNOWLEDGE mode.
   Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
   ```

1. メッセージが受信されたら、メッセージを表示して、その後明示的に確認します。

   ```
   // Cast the received message as TextMessage and print the text to screen. Also acknowledge the message.
   if (receivedMessage != null) {
       System.out.println("Received: " + ((TextMessage) receivedMessage).getText());
       receivedMessage.acknowledge();
       System.out.println("Acknowledged: " + message.getJMSMessageID());
   }
   ```
**注記**  
このモードでは、メッセージが確認されると、そのメッセージ以前に受信されたすべてのメッセージも暗黙的に確認されます。たとえば、10通のメッセージが受信され、(受信した順序で)10番目のメッセージのみが確認された場合、前の9通のメッセージもすべて確認されます。

残りの手順は、「[Amazon SQS Java Messaging Library の使用](#getting-started)」の例の手順と同じです。クライアント確認モードの同期コンシューマーの完全な例については、「`SyncMessageReceiverClientAcknowledge.java`」の[Amazon SQS 標準キューで JMS を使用するための実用的な Java の例](sqs-jms-code-examples.md)を参照してください。

この例の出力は以下の例のようになります:

```
JMS Message ID:4example-aa0e-403f-b6df-5e02example5
Received: Hello World!
Acknowledged: ID:4example-aa0e-403f-b6df-5e02example5
```

## 順不同確認モードの使用
<a name="using-unordered-acknowledge-mode"></a>

`CLIENT_ACKNOWLEDGE`モードを使用すると、明示的に確認されたメッセージの前に受信されたすべてのメッセージが自動的に確認されます。詳細については、「[クライアント確認モードの使用](#using-client-acknowledge-mode)」を参照してください。

Amazon SQS Java Messaging Library には別の確認モードも用意されています。`UNORDERED_ACKNOWLEDGE` モードを使用する場合は、受信した順序に関係なく、すべての受信メッセージを個別かつ明示的にクライアントが確認する必要があります。これには、`UNORDERED_ACKNOWLEDGE`モードでセッションを作成します。

```
// Create the non-transacted session with UNORDERED_ACKNOWLEDGE mode.
Session session = connection.createSession(false, SQSSession.UNORDERED_ACKNOWLEDGE);
```

残りの手順は、「[クライアント確認モードの使用](#using-client-acknowledge-mode)」の例の手順と同じです。`UNORDERED_ACKNOWLEDGE`モードの同期コンシューマーの完全な例については、`SyncMessageReceiverUnorderedAcknowledge.java`を参照してください。

この例の出力は以下のようになります:

```
JMS Message ID:dexample-73ad-4adb-bc6c-4357example7
Received: Hello World!
Acknowledged: ID:dexample-73ad-4adb-bc6c-4357example7
```