AmazonSQSを簡単に使えるライブラリを書いたので使い方とか #jawsug
うちの会社ではAmazon SQSをバリバリ使ってるんですが、巷では全然流行ってないらしいので、簡単に扱えるライブラリを書きました。javaのBlockingQueueインターフェースを実装しているので、普段使っているQueueと差し替えることで簡単にSQSを利用することが出来ます。
githubで公開しています。
https://github.com/lettas/amazon-sqs
使い方
AmazonSQSTestに簡単な使い方が書いてありますが、軽く解説します。
出てくるクラス
AmazonSQS // クラスメソッドのconnectで、AmazonSQSのサービスに接続します。 AmazonSQSManager // SQS上のQueueインスタンスを作成したり削除したりします。 BlockingQueue<String> // javaのブロック可能なQueueインターフェース
Queueのインスタンス取得まで
final String AWS_ACCESS_KEY = "AWSのアクセスキー"; final String AWS_SECRET_ACCESS_KEY = "AWSのシークレットキー"; String key = "Queueインスタンスの識別キー"; AmazonSQSManager manager = AmazonSQS.connect(AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY); BlockingQueue<String> queue = manager.createQueueAccessor(key);
Queueにメッセージを追加・取得する
// 追加 queue.add("Hello"); // 取得 String message = queue.poll(); System.out.println(message); // => "Hello"
注意すること
Amazon SQSは同期的に操作することが出来ません。メッセージを追加した直後に取得しようとしても、うまく取得できないことがありますし、順番も保証されていません。また、Queueのサイズを取得しても、必ずしも正しい値が返ってくるとはかぎりません。そのため、Queueが空になるまで処理をする場合は、Queueが空になっているかどうかを何回か確認するといった工夫が必要になります。また、isEmpty()がfalseだったとしても、実際には取得できないことがあるので要注意です。
こんな感じですかね。
for(int retry=0; retry<5; retry++) { while(!queue.isEmpty()) { retry = 0; String message = queue.poll(); if(message == null) { break; } // なんか処理 } Thread.sleep(1000); }