9

私はキューを扱うのが初めてです。メッセージを正常に投稿して同期的に受信できますが、現在非同期にしようとしています。

sqs が提供する参照リンクは、jmsclient ラッパーの使用を提案しています。また、リンクには、jms クライアントに統合されたコードが既にある場合は、それを使用することも記載されています。

http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/jmsclient.html#samples

しかし、私はこの例を参照して、メッセージを同期的に送信および受信することを新たに始めています。

https://github.com/aws/aws-sdk-java/blob/master/src/samples/AmazonSimpleQueueService/SimpleQueueServiceSample.java

同じコードを使用してメッセージ リスナを実装することはできますか? コード例をいただければ幸いです。

4

5 に答える 5

9

Amazon SQS 開発者ガイドの Amazon SQS での JMS の使用に関するセクションに、JMS を使用してメッセージを非同期に受信する方法を示すコード サンプルがあります。

まず、MessageListener インターフェースを実装します。

class MyListener implements MessageListener {

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

そして、それを MessageConsumer の MessageListener として設定します。

// Create a consumer for the 'TestQueue'.
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 will be invoked when a message is received.
Thread.sleep(1000);
于 2016-11-02T23:17:44.967 に答える
4

sqslistenerSpringCloud フレームワークのアノテーションを使用できます。Springとを使用してアプリケーションを開発していて、AWSを使用していない場合はSpring Cloud、切り替える良い機会です。

sqslistenerアノテーションを使用して SQS からメッセージを非同期に受信するサンプル コードを次に示します。良いことは、これを使用するために構成をほとんどゼロにする必要があることです。

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.aws.messaging.listener.SqsMessageDeletionPolicy;
import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener;
import org.springframework.stereotype.Component;
import com.example.my.RecoverableException;

@Component
@Slf4j
public class CustomMessageQueue {

    @SqsListener(value = "${build_request_queue.name}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
    public void receive(String message) {
        try {
            // write message processing here
        } catch (RecoverableException e) {
            // handle errors here for which message from queue should not be deleted
            // throwing an exception will make receive method fail and hence message does not get deleted
            throw e;

        } catch (Exception e) {
            // suppress exceptions for which message should be deleted.
        }
    }
}

sqslistenerアノテーションの素晴らしいところは、そのdeletionPolicy. そのため、SQS からのメッセージをいつ削除するかを決定できます。

于 2018-11-23T18:48:07.967 に答える
-1

SQS は「Simple Queue Service」の略です。文字通り、単純であることを意味します。その結果、JMS の機能の一部 (特に非同期リスナー) がサポートされていません。

このトピックに関するブログ投稿を書きました: http://thedulinreport.com/2015/05/09/guaranteeing-delivery-of-messages-with-aws-sqs/

基本的に、無限ループでポーラーを作成する必要がありますが、それについては賢くする必要があります。リクエストごとに料金が発生するため、ポーリングを継続しすぎないようにする必要があります。

于 2015-08-26T11:47:54.833 に答える