Upravljanje Amazon SQS redovima u Javi
1. Pregled
U ovom uputstvu istražit ćemo kako koristite Amazonov SQS (Jednostavna usluga u redovima čekanja) koristeći Java SDK.
2. Preduvjeti
Ovisnosti o Mavenu, postavke AWS računa i veza s klijentom potrebne za upotrebu Amazon AWS SDK-a za SQS iste su kao u ovom članku ovdje.
Pod pretpostavkom da smo stvorili primjerak AWSC vjerodajnice, kao što je opisano u prethodnom članku, možemo stvoriti naš SQS klijent:
AmazonSQS sqs = AmazonSQSClientBuilder.standard () .withCredentials (novi AWSStaticCredentialsProvider (vjerodajnice)) .withRegion (Regions.US_EAST_1) .build ();
3. Stvaranje redova čekanja
Nakon što postavimo našeg SQS klijenta, stvaranje redova je prilično jednostavno.
3.1. Stvaranje standardnog reda čekanja
Pogledajmo kako možemo stvoriti standardni red. Uraditi ovo, morat ćemo stvoriti instancu CreateQueueRequest:
CreateQueueRequest createStandardQueueRequest = novi CreateQueueRequest ("baeldung-queue"); Niz standardQueueUrl = sqs.createQueue (createStandardQueueRequest) .getQueueUrl ();
3.2. Stvaranje FIFO reda
Stvaranje FIFO-a slično je stvaranju standardnog reda čekanja. I dalje ćemo koristiti primjerak CreateQueueRequest, kao i ranije. Samo ovaj put, morat ćemo predati atribute reda i postaviti FifoQueue pripisati pravi:
Mapa queueAttributes = novi HashMap (); queueAttributes.put ("FifoQueue", "true"); queueAttributes.put ("ContentBasedDeduplication", "true"); CreateQueueRequest createFifoQueueRequest = novi CreateQueueRequest ("baeldung-queue.fifo"). WithAttributes (queueAttributes); Niz fifoQueueUrl = sqs.createQueue (createFifoQueueRequest) .getQueueUrl ();
4. Objavljivanje poruka u redovima
Nakon što postavimo redove, možemo početi slati poruke.
4.1. Objavljivanje poruke u standardnom redu čekanja
Za slanje poruka u standardni red, mi ćemo moraju stvoriti instancu SendMessageRequest.
Zatim ovom zahtjevu prilažemo mapu atributa poruke:
Map messageAttributes = novi HashMap (); messageAttributes.put ("AttributeOne", novo MessageAttributeValue () .withStringValue ("Ovo je atribut") .withDataType ("Niz")); SendMessageRequest sendMessageStandardQueue = novi SendMessageRequest () .withQueueUrl (standardQueueUrl) .withMessageBody ("Jednostavna poruka.") .WithDelaySeconds (30) .withMessageAttributes (messageAttributes); sqs.sendMessage (sendMessageStandardQueue);
The withDelaySeconds () određuje nakon koliko vremena bi poruka trebala stići u red čekanja.
4.2. Objavljivanje poruke u FIFO redu
Jedina razlika, u ovom slučaju, je ta morat ćemo navesti skupina kojem poruka pripada:
SendMessageRequest sendMessageFifoQueue = novi SendMessageRequest () .withQueueUrl (fifoQueueUrl) .withMessageBody ("Još jedna jednostavna poruka.") .WithMessageGroupId ("baeldung-group-1") .withMessageAttributes (messageAttributes);
Kao što možete vidjeti u gornjem primjeru koda, mi određujemo grupu pomoću withMessageGroupId ().
4.3. Objavljivanje više poruka u red čekanja
Možemo i mi objavite više poruka u redu čekanja, koristeći jedan zahtjev. Stvorit ćemo popis SendMessageBatchRequestEntry koju ćemo poslati pomoću instance SendMessageBatchRequest:
Popis messageEntries = novi ArrayList (); messageEntries.add (novi SendMessageBatchRequestEntry () .withId ("id-1") .withMessageBody ("batch-1") .withMessageGroupId ("baeldung-group-1")); messageEntries.add (novi SendMessageBatchRequestEntry () .withId ("id-2") .withMessageBody ("batch-2") .withMessageGroupId ("baeldung-group-1")); SendMessageBatchRequest sendMessageBatchRequest = novi SendMessageBatchRequest (fifoQueueUrl, messageEntries); sqs.sendMessageBatch (sendMessageBatchRequest);
5. Čitanje poruka iz redova
Poruke iz svojih redova možemo primati do pozivajući se na receiveMessage () metoda na primjerku ReceiveMessageRequest:
ReceiveMessageRequest receiveMessageRequest = novi ReceiveMessageRequest (fifoQueueUrl) .withWaitTimeSeconds (10) .withMaxNumberOfMessages (10); Popis sqsMessages = sqs.receiveMessage (receiveMessageRequest) .getMessages ();
Koristeći withMaxNumberOfMessages (), mi određujemo koliko poruka treba dobiti iz reda - iako treba napomenuti da je maksimum 10.
Metoda withWaitTimeSeconds () omogućuje dugo anketiranje. Dugo ispitivanje način je ograničavanja broja zahtjeva za primanje poruka koje šaljemo SQS-u.
Jednostavno rečeno, to znači da ćemo pričekati do određenog broja sekundi da bismo dohvatili poruku. Ako u redu za to vrijeme nema poruka, zahtjev će se vratiti prazan. Ako poruka stigne u red za to vrijeme, vratit će se.
Možemo dobiti atribute i tijelo zadane poruke:
sqsMessages.get (0) .getAttributes (); sqsMessages.get (0) .getBody ();
6. Brisanje poruke iz reda čekanja
Da bismo izbrisali poruku, upotrijebit ćemo DeleteMessageRequest:
sqs.deleteMessage (novi DeleteMessageRequest () .withQueueUrl (fifoQueueUrl) .withReceiptHandle (sqsMessages.get (0) .getReceiptHandle ()));
7. Redovi mrtvih slova
Red mrtvih slova mora biti iste vrste kao i njegov osnovni red - mora biti FIFO ako je osnovni red FIFO, a standardni ako je osnovni red standardni. Za ovaj ćemo primjer upotrijebiti standardni red.
Prvo što moramo učiniti je da stvorite ono što će postati naš red mrtvih slova:
Niz deadLetterQueueUrl = sqs.createQueue ("baeldung-dead-letter-queue"). GetQueueUrl ();
Dalje, mi ćemo nabavite ARN našeg novostvorenog reda (Amazon Resource Name):
GetQueueAttributesResult deadLetterQueueAttributes = sqs.getQueueAttributes (novi GetQueueAttributesRequest (deadLetterQueueUrl) .withAttributeNames ("QueueArn")); Niz deadLetterQueueARN = deadLetterQueueAttributes.getAttributes () .get ("QueueArn");
Konačno, mi postavi ovaj novostvoreni red da bude red mrtvih slova izvornog standardnog reda:
SetQueueAttributesRequest queueAttributesRequest = novo SetQueueAttributesRequest () .withQueueUrl (standardQueueUrl) .addAttributesEntry ("RedrivePolicy", "{\" maxReceiveCount \ ": \" 2 \ "," + "\" DeadRet "," "}"); sqs.setQueueAttributes (queueAttributesRequest);
JSON paket koji smo postavili u addAttributesEntry () metoda pri gradnji našeg SetQueueAttributesRequest instanca sadrži informacije koje su nam potrebne: the maxReceiveCount je 2, što znači da ako se poruka primi toliko puta, pretpostavlja se da nije ispravno obrađena i šalje se u naš red mrtvih slova.
The deadLetterTargetArn atribut usmjerava naš standardni red na naš novostvoreni red mrtvih slova.
8. Praćenje
Možemo provjerite koliko je poruka trenutno u danom redu i koliko ih je u letu sa SDK-om. Prvo ćemo morati stvoriti GetQueueAttributesRequest.
Od tamo ćemo provjeriti stanje u redu:
GetQueueAttributesRequest getQueueAttributesRequest = novo GetQueueAttributesRequest (standardQueueUrl) .withAttributeNames ("Sve"); GetQueueAttributesResult getQueueAttributesResult = sqs.getQueueAttributes (getQueueAttributesRequest); System.out.println (String.format ("Broj poruka u redu:% s", getQueueAttributesResult.getAttributes () .get ("ApproximateNumberOfMessages"))); System.out.println (String.format ("Broj poruka u letu:% s", getQueueAttributesResult.getAttributes () .get ("ApproximateNumberOfMessagesNotVisible")));
Dublje praćenje može se postići pomoću Amazon Cloud Watcha.
9. Zaključak
U ovom smo članku vidjeli kako upravljati redovima SQS koristeći AWS Java SDK.
Kao i obično, svi uzorci koda korišteni u članku mogu se naći na GitHubu.