AWS SQS allows programs to send messages to a queue, and other programs to read those messages and act on them; the programs can communicate, but are only loosely coupled, and may not even be running at the same time.
1. creating the Queue
A simples cloudformation template would be as follows:
Simples SQS queue
Resources:
FirstQueue:
Type: "AWS::SQS::Queue"
Properties:
DelaySeconds: 0 # How long to delay messages
MaximumMessageSize: 1024 # in bytes
MessageRetentionPeriod: 3600 # in seconds; let's use an hour, just for fun
QueueName: FirstQueue
ReceiveMessageWaitTimeSeconds: 0 # don't wait to see if more messages appear
VisibilityTimeout: 30
Outputs:
Queue:
Description: The Queue ARN
Value: !GetAtt FirstQueue.Arn
Export:
Name: TheQueueArn
# RedrivePolicy:
# deadLetterTargetArn:
# maxReceiveCount: 2
2. Sending messages
Sending.groovy
@Grab('com.amazonaws:aws-java-sdk-core:+')
import com.amazonaws.services.sqs.AmazonSQSClient;
@Grab('com.amazonaws:aws-java-sdk-sqs:+')
import com.amazonaws.services.sqs.model.*;
def queue_url=args[0]
def message=args[1]
AmazonSQSClient client=new AmazonSQSClient();
client.sendMessage(queue_url, message);
3. Receiving messages
dequeue.groovy
@Grab('com.amazonaws:aws-java-sdk-core:+')
import com.amazonaws.services.sqs.AmazonSQSClient;
@Grab('com.amazonaws:aws-java-sdk-sqs:+')
import com.amazonaws.services.sqs.model.*;
def queue_url=args[0]
AmazonSQSClient client=new AmazonSQSClient();
println("Reading from $queue_url")
int empty_receives=0;
while(true) {
def result=client.receiveMessage(queue_url)
if(result.getMessages().size() ==0) {
break;
} else {
for(def mesage : result.getMessages() ) {
println(mesage.body);
client.deleteMessage(queue_url, mesage.receiptHandle)
}
}
}
println("No more messages available")