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")