Amazon SQSのステータス遷移を確認する

Amazon Simple Queue Service(Amazon SQS)を少し触ってみたのでメモ
64KBまでの文字列を登録するだけのシンプルなサービス

メッセージを追加して取得してみる

キューの作成は名前を入力するだけなので省略。作成するとURLが生成される
AWS-SDKforJavaにてメッセージを追加/取得するコードは以下

String accessKey = "【AWSアクセスキー】";
String secretAccessKey = "【AWSシークレットキー】";
AWSCredentials cre = new BasicAWSCredentials(accessKey, secretAccessKey);
AmazonSQSClient client = new AmazonSQSClient(cre);
client.setEndpoint("sqs.ap-northeast-1.amazonaws.com");

// メッセージを送信
client.sendMessage(new SendMessageRequest()
	.withQueueUrl("【キューのURL】")
	.withMessageBody("Hello, world!"));

// メッセージを取得
ReceiveMessageResult receive1 = client.receiveMessage(
	new ReceiveMessageRequest().withQueueUrl("【キューのURL】"));
ReceiveMessageResult receive2 = client.receiveMessage(
	new ReceiveMessageRequest().withQueueUrl("【キューのURL】"));

確認のため2回実行してみたが片方からしかメッセージは取れない。(空が返ってくる)
メッセージの内容は以下のようなもの

{
    MessageId: "502ebed6-a02b-4b2a-87e3-3de0d59p9d43",
    ReceiptHandle: "【300文字くらいの長い文字列】",
    MD5OfBody: "f0c75976a003b4690235c3o23a5d41c4",
    Body: "Hello, world!",        
}

ロック期間を延長する

メッセージを取得した際にロックされるが一定時間経過すると解除される
キューの設定に規定のロック期間を設定することができる

Default Visibility Timeout 取得したメッセージをロックする時間(規定値30秒)

メッセージを取得したクライアントからはロック期間の延長を要求することが可能

client.changeMessageVisibility(new ChangeMessageVisibilityRequest()
	.withQueueUrl("【キューのURL】")
	.withReceiptHandle("【ReceiptHandle】")
	.withVisibilityTimeout("【ロック期間(秒)】"));

ステータスを確認する

AWS Management Consoleから見るとキューの中身は以下の2つになっている

Messages Available 取得可能なメッセージ
Massages in Flight ロック中のメッセージ

メッセージは削除しないと元に戻ってしまうため1回きりの処理の場合は
取得したクライアントがメッセージの削除を行う必要がある
あえて削除せずにロック期間毎に実行する処理を作るのに利用できるかも
f:id:yustam:20120923231032p:image