Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Utilisez les exemples de code suivants pour intégrer le cas d'utilisation de l'exemple de gestion des prix des pièces automobiles à une rubrique FIFO Amazon SNS et à une file d'attente FIFO Amazon SQS ou à une file d'attente standard.
Utilisation d'un AWS SDK
À l'aide d'un AWS SDK, vous créez une rubrique Amazon SNS FIFO en définissant FifoTopic
son attribut sur. true
Vous créez une file d'attente FIFO Amazon SQS en définissant son attribut FifoQueue
sur true
. Vous devez également ajouter le suffixe .fifo
au nom de chaque ressource FIFO. Après avoir créé une rubrique ou une file d'attente FIFO, vous ne pouvez pas la convertir en une rubrique ou une file d'attente standard.
Les exemples de code suivants créent les ressources de file d’attente standard et FIFO suivantes :
-
La rubrique FIFO Amazon SNS qui distribue les mises à jour de prix
-
Les files d'attente FIFO Amazon SQS qui fournissent ces mises à jour aux applications de gros et de détail
-
La file d'attente standard Amazon SQS pour l'application d'analyse qui stocke les enregistrements, qui peuvent être interrogée à des fins de Business Intelligence (BI)
-
Les abonnements FIFO Amazon SNS qui connectent les trois files d'attente à la rubrique
Cet exemple définit les politiques de filtre dans les abonnements. Si vous testez l'exemple en publiant un message dans la rubrique, assurez-vous de publier le message avec l'attribut business
. Spécifiez retail
ou wholesale
pour la valeur d'attribut. Sinon le message est filtré et n'est pas remis aux files d'attente abonnées. Pour de plus amples informations, veuillez consulter Filtrage des messages Amazon SNS pour les rubriques FIFO.
- SDK pour Java 2.x
-
Note
Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples de code AWS
. Cet exemple
-
crée une rubrique FIFO Amazon SNS, deux files d'attente FIFO Amazon SQS et une file d'attente standard.
-
abonne les files d’attente à la rubrique et publie un message dans la rubrique.
Le test
vérifie que le message a bien été reçu pour chaque file d'attente. L'exemple complet montre également l'ajout de stratégies d'accès et supprime les ressources à la fin. public class PriceUpdateExample { public final static SnsClient snsClient = SnsClient.create(); public final static SqsClient sqsClient = SqsClient.create(); public static void main(String[] args) { final String usage = "\n" + "Usage: " + " <topicName> <wholesaleQueueFifoName> <retailQueueFifoName> <analyticsQueueName>\n\n" + "Where:\n" + " fifoTopicName - The name of the FIFO topic that you want to create. \n\n" + " wholesaleQueueARN - The name of a SQS FIFO queue that will be created for the wholesale consumer. \n\n" + " retailQueueARN - The name of a SQS FIFO queue that will created for the retail consumer. \n\n" + " analyticsQueueARN - The name of a SQS standard queue that will be created for the analytics consumer. \n\n"; if (args.length != 4) { System.out.println(usage); System.exit(1); } final String fifoTopicName = args[0]; final String wholeSaleQueueName = args[1]; final String retailQueueName = args[2]; final String analyticsQueueName = args[3]; // For convenience, the QueueData class holds metadata about a queue: ARN, URL, // name and type. List<QueueData> queues = List.of( new QueueData(wholeSaleQueueName, QueueType.FIFO), new QueueData(retailQueueName, QueueType.FIFO), new QueueData(analyticsQueueName, QueueType.Standard)); // Create queues. createQueues(queues); // Create a topic. String topicARN = createFIFOTopic(fifoTopicName); // Subscribe each queue to the topic. subscribeQueues(queues, topicARN); // Allow the newly created topic to send messages to the queues. addAccessPolicyToQueuesFINAL(queues, topicARN); // Publish a sample price update message with payload. publishPriceUpdate(topicARN, "{\"product\": 214, \"price\": 79.99}", "Consumables"); // Clean up resources. deleteSubscriptions(queues); deleteQueues(queues); deleteTopic(topicARN); } public static String createFIFOTopic(String topicName) { try { // Create a FIFO topic by using the SNS service client. Map<String, String> topicAttributes = Map.of( "FifoTopic", "true", "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); return topicArn; } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; } public static void subscribeQueues(List<QueueData> queues, String topicARN) { queues.forEach(queue -> { SubscribeRequest subscribeRequest = SubscribeRequest.builder() .topicArn(topicARN) .endpoint(queue.queueARN) .protocol("sqs") .build(); // Subscribe to the endpoint by using the SNS service client. // Only Amazon SQS queues can receive notifications from an Amazon SNS FIFO // topic. SubscribeResponse subscribeResponse = snsClient.subscribe(subscribeRequest); System.out.println("The queue [" + queue.queueARN + "] subscribed to the topic [" + topicARN + "]"); queue.subscriptionARN = subscribeResponse.subscriptionArn(); }); } public static void publishPriceUpdate(String topicArn, String payload, String groupId) { try { // Create and publish a message that updates the wholesale price. String subject = "Price Update"; 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(); final PublishResponse response = snsClient.publish(pubRequest); System.out.println(response.messageId()); System.out.println(response.sequenceNumber()); System.out.println("Message was published to " + topicArn); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
-
Pour plus d'informations sur l'API consultez les rubriques suivantes dans la référence de l'API AWS SDK for Java 2.x .
-
Réception de messages provenant d'abonnements FIFO
Vous pouvez désormais recevoir les mises à jour des prix dans les trois applications abonnées. Comme indiqué dans leExemple de cas d'utilisation de la rubrique Amazon SNS FIFO, le point d'entrée de chaque application client est la file d'attente Amazon SQS, que la AWS Lambda fonction correspondante peut interroger automatiquement. Lorsqu'une file d'attente Amazon SQS est une source d'évènements pour une fonction Lambda, Lambda met à l'échelle sa flotte de sondeurs en fonction des besoins pour consommer efficacement les messages.
Pour plus d'informations, consultez la section Utilisation AWS Lambda avec Amazon SQS dans le manuel du AWS Lambda développeur. Pour plus d'informations sur la création de vos propres sondeurs de file d'attente, consultez les recommandations relatives aux files d'attente standard et FIFO Amazon SQS dans le guide du développeur Amazon Simple Queue Service ReceiveMessageet dans le manuel Amazon Simple Queue Service API Reference.
En utilisant AWS CloudFormation
AWS CloudFormation vous permet d'utiliser un fichier modèle pour créer et configurer un ensemble de AWS ressources en une seule unité. Cette section comporte un exemple de modèle qui crée les éléments suivants :
-
La rubrique FIFO Amazon SNS qui distribue les mises à jour de prix
-
Les files d'attente FIFO Amazon SQS qui fournissent ces mises à jour aux applications de gros et de détail
-
La file d'attente standard Amazon SQS pour l'application d'analyse qui stocke les enregistrements, qui peuvent être interrogée à des fins de Business Intelligence (BI)
-
Les abonnements FIFO Amazon SNS qui connectent les trois files d'attente à la rubrique
-
Une stratégie de filtrage qui spécifie que les applications abonnées reçoivent uniquement les mises à jour de prix dont elles ont besoin
Note
Si vous testez cet exemple de code en publiant un message dans la rubrique, assurez-vous de publier le message avec l'attribut business
. Spécifiez retail
ou wholesale
pour la valeur d'attribut. Sinon le message est filtré et n'est pas remis aux files d'attente abonnées.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"PriceUpdatesTopic": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "PriceUpdatesTopic.fifo",
"FifoTopic": true,
"ContentBasedDeduplication": false,
"ArchivePolicy": {
"MessageRetentionPeriod": "30"
}
}
},
"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
}
},
"AnalyticsQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"QueueName": "AnalyticsQueue"
}
},
"WholesaleSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"TopicArn": {
"Ref": "PriceUpdatesTopic"
},
"Endpoint": {
"Fn::GetAtt": [
"WholesaleQueue",
"Arn"
]
},
"Protocol": "sqs",
"RawMessageDelivery": "false",
"FilterPolicyScope": "MessageBody",
"FilterPolicy": {
"business": [
"wholesale"
]
}
}
},
"RetailSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"TopicArn": {
"Ref": "PriceUpdatesTopic"
},
"Endpoint": {
"Fn::GetAtt": [
"RetailQueue",
"Arn"
]
},
"Protocol": "sqs",
"RawMessageDelivery": "false",
"FilterPolicyScope": "MessageBody",
"FilterPolicy": {
"business": [
"retail"
]
}
}
},
"AnalyticsSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"TopicArn": {
"Ref": "PriceUpdatesTopic"
},
"Endpoint": {
"Fn::GetAtt": [
"AnalyticsQueue",
"Arn"
]
},
"Protocol": "sqs",
"RawMessageDelivery": "false"
}
},
"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"
},
{
"Ref": "AnalyticsQueue"
}
]
}
}
}
}
Pour plus d'informations sur le déploiement de AWS ressources à l'aide d'un AWS CloudFormation modèle, voir Get Started dans le guide de AWS CloudFormation l'utilisateur.