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.


$config[zx-auto] not found$config[zx-overlay] not found