Services or capabilities described in Amazon Web Services documentation might vary by Region. To see the differences applicable to the China Regions,
see Getting Started with Amazon Web Services in China
(PDF).
Code examples for FIFO topics
You can use the following code examples to integrate the auto parts price management example use case with SNS FIFO topics and SQS
FIFO queues.
Using an Amazon SDK
Using an Amazon SDK, you create an Amazon SNS FIFO topic by setting its
FifoTopic
attribute to true. You create an Amazon SQS FIFO queue by setting its
FifoQueue
attribute to true. Also, you must add the .fifo
suffix
to the name of each FIFO resource. After you create a FIFO topic or queue, you
can't convert it into a standard topic or queue.
The following code example creates these FIFO resources:
-
The SNS FIFO topic that distributes the price updates
-
The SQS FIFO queues that provide these updates to the two applications (wholesale
and retail)
-
The SNS FIFO subscriptions that connect both of the queues to the topic
This example sets filter policies
in the subscriptions. If you test the example by publishing a message to the topic, make sure that you
publish the message with the business
atribute. Specify either retail
or
wholesale
for the attribute value. Otherwise, the message is filtered out and not delivered
to the subscribed queues. For more information,
see Message filtering for FIFO topics.
- Java
-
- SDK for Java 2.x
-
Create a FIFO topic and FIFO queues. Subscribe the queues to the topic.
public static void main(String[] args) {
final String usage = "\n" +
"Usage: " +
" <topicArn>\n\n" +
"Where:\n" +
" fifoTopicName - The name of the FIFO topic. \n\n" +
" fifoQueueARN - The ARN value of a SQS FIFO queue. You can get this value from the AWS Management Console. \n\n";
if (args.length != 2) {
System.out.println(usage);
System.exit(1);
}
String fifoTopicName = "PriceUpdatesTopic3.fifo";
String fifoQueueARN = "arn:aws:sqs:us-east-1:814548047983:MyPriceSQS.fifo";
SnsClient snsClient = SnsClient.builder()
.region(Region.US_EAST_1)
.credentialsProvider(ProfileCredentialsProvider.create())
.build();
createFIFO(snsClient, fifoTopicName, fifoQueueARN);
}
public static void createFIFO(SnsClient snsClient, String topicName, String queueARN) {
try {
// Create a FIFO topic by using the SNS service client.
Map<String, String> topicAttributes = new HashMap<>();
topicAttributes.put("FifoTopic", "true");
topicAttributes.put("ContentBasedDeduplication", "false");
CreateTopicRequest topicRequest = CreateTopicRequest.builder()
.name(topicName)
.attributes(topicAttributes)
.build();
CreateTopicResponse response = snsClient.createTopic(topicRequest);
String topicArn = response.topicArn();
System.out.println("The topic ARN is"+topicArn);
// Subscribe to the endpoint by using the SNS service client.
// Only Amazon SQS FIFO queues can receive notifications from an Amazon SNS FIFO topic.
SubscribeRequest subscribeRequest = SubscribeRequest.builder()
.topicArn(topicArn)
.endpoint(queueARN)
.protocol("sqs")
.build();
snsClient.subscribe(subscribeRequest);
System.out.println("The topic is subscribed to the queue.");
// Compose and publish a message that updates the wholesale price.
String subject = "Price Update";
String payload = "{\"product\": 214, \"price\": 79.99}";
String groupId = "PID-214";
String dedupId = UUID.randomUUID().toString();
String attributeName = "business";
String attributeValue = "wholesale";
MessageAttributeValue msgAttValue = MessageAttributeValue.builder()
.dataType("String")
.stringValue(attributeValue)
.build();
Map<String, MessageAttributeValue> attributes = new HashMap<>();
attributes.put(attributeName, msgAttValue);
PublishRequest pubRequest = PublishRequest.builder()
.topicArn(topicArn)
.subject(subject)
.message(payload)
.messageGroupId(groupId)
.messageDeduplicationId(dedupId)
.messageAttributes(attributes)
.build();
snsClient.publish(pubRequest);
System.out.println("Message was published to "+topicArn);
} catch (SnsException e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
}
}
- SAP ABAP
-
- SDK for SAP ABAP
-
This documentation is for an SDK in developer preview release. The SDK is subject to change and is not recommended for use in production.
Create a FIFO topic, subscribe an Amazon SQS FIFO queue to the topic, and publish a message to an Amazon SNS topic.
" Creates a FIFO topic. "
DATA lt_tpc_attributes TYPE /aws1/cl_snstopicattrsmap_w=>tt_topicattributesmap.
DATA ls_tpc_attributes TYPE /aws1/cl_snstopicattrsmap_w=>ts_topicattributesmap_maprow.
ls_tpc_attributes-key = 'FifoTopic'.
ls_tpc_attributes-value = NEW /aws1/cl_snstopicattrsmap_w( iv_value = 'true' ).
INSERT ls_tpc_attributes INTO TABLE lt_tpc_attributes.
TRY.
DATA(lo_create_result) = lo_sns->createtopic(
iv_name = iv_topic_name
it_attributes = lt_tpc_attributes
).
DATA(lv_topic_arn) = lo_create_result->get_topicarn( ).
ov_topic_arn = lv_topic_arn. " ov_topic_arn is returned for testing purposes. "
MESSAGE 'FIFO topic created' TYPE 'I'.
CATCH /aws1/cx_snstopiclimitexcdex.
MESSAGE 'Unable to create more topics. You have reached the maximum number of topics allowed.' TYPE 'E'.
ENDTRY.
" Subscribes an endpoint to an Amazon Simple Notification Service (Amazon SNS) topic. "
" Only Amazon Simple Queue Service (Amazon SQS) FIFO queues can be subscribed to an SNS FIFO topic. "
TRY.
DATA(lo_subscribe_result) = lo_sns->subscribe(
iv_topicarn = lv_topic_arn
iv_protocol = 'sqs'
iv_endpoint = iv_queue_arn
).
DATA(lv_subscription_arn) = lo_subscribe_result->get_subscriptionarn( ).
ov_subscription_arn = lv_subscription_arn. " ov_subscription_arn is returned for testing purposes. "
MESSAGE 'SQS queue was subscribed to SNS topic.' TYPE 'I'.
CATCH /aws1/cx_snsnotfoundexception.
MESSAGE 'Topic does not exist.' TYPE 'E'.
CATCH /aws1/cx_snssubscriptionlmte00.
MESSAGE 'Unable to create subscriptions. You have reached the maximum number of subscriptions allowed.' TYPE 'E'.
ENDTRY.
" Publish message to SNS topic. "
TRY.
DATA lt_msg_attributes TYPE /aws1/cl_snsmessageattrvalue=>tt_messageattributemap.
DATA ls_msg_attributes TYPE /aws1/cl_snsmessageattrvalue=>ts_messageattributemap_maprow.
ls_msg_attributes-key = 'Importance'.
ls_msg_attributes-value = NEW /aws1/cl_snsmessageattrvalue( iv_datatype = 'String' iv_stringvalue = 'High' ).
INSERT ls_msg_attributes INTO TABLE lt_msg_attributes.
DATA(lo_result) = lo_sns->publish(
iv_topicarn = lv_topic_arn
iv_message = 'The price of your mobile plan has been increased from $19 to $23'
iv_subject = 'Changes to mobile plan'
iv_messagegroupid = 'Update-2'
iv_messagededuplicationid = 'Update-2.1'
it_messageattributes = lt_msg_attributes
).
ov_message_id = lo_result->get_messageid( ). " ov_message_id is returned for testing purposes. "
MESSAGE 'Message was published to SNS topic.' TYPE 'I'.
CATCH /aws1/cx_snsnotfoundexception.
MESSAGE 'Topic does not exist.' TYPE 'E'.
ENDTRY.
Receiving messages from FIFO subscriptions
You can now receive price updates in the wholesale and retail applications. As shown in
the FIFO topics example use case, the point of entry for each consumer
application is the SQS FIFO queue, which its corresponding Amazon Lambda function can poll
automatically. When an SQS FIFO queue is an event source for a Lambda function, Lambda scales
its fleet of pollers as needed to efficiently consume messages.
For more information, see Using Amazon Lambda with Amazon SQS in the
Amazon Lambda Developer Guide. For information on writing your own queue pollers,
see Recommendations for Amazon SQS standard and FIFO queues in the
Amazon Simple Queue Service Developer Guide and ReceiveMessage in the Amazon Simple Queue Service API Reference.
Using Amazon CloudFormation
Amazon CloudFormation enables you to use a template file to create and configure a collection of Amazon
resources together as a single unit. This section has an example template that creates the following:
-
The SNS FIFO topic that distributes the price updates
-
The SQS FIFO queues that provide these updates to the two applications (wholesale
and retail)
-
The SNS FIFO subscriptions that connect both of the queues to the topic
-
A filter policy that specifies that subscriber
applications receive only the price updates that they need
If you test this code sample by publishing a message to the topic, make sure that you publish the message with
the business
atribute. Specify either retail
or wholesale
for the
attribute value. Otherwise, the message is filtered out and not delivered to the subscribed queues.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"PriceUpdatesTopic": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "PriceUpdatesTopic.fifo",
"FifoTopic": true,
"ContentBasedDeduplication": false
}
},
"WholesaleQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"QueueName": "WholesaleQueue.fifo",
"FifoQueue": true,
"ContentBasedDeduplication": false
}
},
"RetailQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"QueueName": "RetailQueue.fifo",
"FifoQueue": true,
"ContentBasedDeduplication": false
}
},
"WholesaleSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"TopicArn": {
"Ref": "PriceUpdatesTopic"
},
"Endpoint": {
"Fn::GetAtt": [
"WholesaleQueue",
"Arn"
]
},
"Protocol": "sqs",
"RawMessageDelivery": "false",
"FilterPolicy": {
"business": [
"wholesale"
]
}
}
},
"RetailSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"TopicArn": {
"Ref": "PriceUpdatesTopic"
},
"Endpoint": {
"Fn::GetAtt": [
"RetailQueue",
"Arn"
]
},
"Protocol": "sqs",
"RawMessageDelivery": "false",
"FilterPolicy": {
"business": [
"retail"
]
}
}
},
"SalesQueuesPolicy": {
"Type": "AWS::SQS::QueuePolicy",
"Properties": {
"PolicyDocument": {
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": [
"sqs:SendMessage"
],
"Resource": "*",
"Condition": {
"ArnEquals": {
"aws:SourceArn": {
"Ref": "PriceUpdatesTopic"
}
}
}
}
]
},
"Queues": [
{
"Ref": "WholesaleQueue"
},
{
"Ref": "RetailQueue"
}
]
}
}
}
}
For more information about deploying Amazon resources using an Amazon CloudFormation template, see Get Started in the
Amazon CloudFormation User Guide.