Administrere Amazon SQS-køer i Java

1. Oversikt

I denne opplæringen vil vi utforske hvordan bruk Amazons SQS (Simple Queue Service) ved hjelp av Java SDK.

2. Forutsetninger

Maven-avhengighetene, AWS-kontoinnstillingene og klientforbindelsen som trengs for å bruke Amazon AWS SDK for SQS, er de samme som i denne artikkelen her.

Forutsatt at vi har opprettet en forekomst av AWS legitimasjon, som beskrevet i forrige artikkel, kan vi fortsette og lage vår SQS-klient:

AmazonSQS sqs = AmazonSQSClientBuilder.standard () .withCredentials (new AWSStaticCredentialsProvider (credentials)) .withRegion (Regions.US_EAST_1) .build (); 

3. Opprette køer

Når vi har satt opp vår SQS-klient, å lage kø er ganske grei.

3.1. Opprette en standard kø

La oss se hvordan vi kan lage en standard kø. Å gjøre dette, vi må opprette en forekomst av CreateQueueRequest:

CreateQueueRequest createStandardQueueRequest = ny CreateQueueRequest ("baeldung-kø"); Streng standardQueueUrl = sqs.createQueue (createStandardQueueRequest) .getQueueUrl (); 

3.2. Opprette en FIFO kø

Å lage en FIFO ligner på å lage en standard kø. Vi bruker fortsatt en forekomst av CreateQueueRequest, som vi gjorde tidligere. Bare denne gangen, vi må passere i køattributter, og angi FifoQueue tilskrive ekte:

KartkøAttributter = nytt HashMap (); queueAttributes.put ("FifoQueue", "true"); queueAttributes.put ("ContentBasedDeduplication", "true"); CreateQueueRequest createFifoQueueRequest = ny CreateQueueRequest ("baeldung-kø.fifo"). Med Attributter (køAttributter); Streng fifoQueueUrl = sqs.createQueue (createFifoQueueRequest) .getQueueUrl (); 

4. Legge ut meldinger i køer

Når vi har satt opp køene våre, kan vi begynne å sende meldinger.

4.1. Legge ut en melding til en standard kø

For å sende meldinger til en standard kø, vil vi må opprette en forekomst av SendMessageRequest.

Deretter legger vi til et kart over meldingsegenskaper til denne forespørselen:

KartmeldingAttributter = ny HashMap (); messageAttributes.put ("AttributeOne", ny MessageAttributeValue () .withStringValue ("This is an attribute") .withDataType ("String")); SendMessageRequest sendMessageStandardQueue = ny SendMessageRequest () .withQueueUrl (standardQueueUrl) .withMessageBody ("En enkel melding.") .WithDelaySeconds (30) .withMessageAttributter (meldingAttributter); sqs.sendMessage (sendMessageStandardQueue); 

De withDelaySeconds () angir etter hvor lenge meldingen skal komme i køen.

4.2. Legger ut en melding til en FIFO-kø

Den eneste forskjellen, i dette tilfellet, er at vi må spesifisere gruppe som meldingen tilhører:

SendMessageRequest sendMessageFifoQueue = new SendMessageRequest () .withQueueUrl (fifoQueueUrl) .withMessageBody ("Another simple message.") .WithMessageGroupId ("baeldung-group-1") .withMessageAttributes (messageAttributes)

Som du kan se i kodeeksemplet ovenfor, spesifiserer vi gruppen ved hjelp av withMessageGroupId ().

4.3. Legge ut flere meldinger i en kø

Vi kan også legg ut flere meldinger i en kø, ved å bruke en enkelt forespørsel. Vi oppretter en liste over SendMessageBatchRequestEntry som vi sender ved hjelp av en forekomst av SendMessageBatchRequest:

List messageEntries = new ArrayList (); messageEntries.add (ny SendMessageBatchRequestEntry () .withId ("id-1") .withMessageBody ("batch-1") .withMessageGroupId ("baeldung-group-1")); messageEntries.add (ny SendMessageBatchRequestEntry () .withId ("id-2") .withMessageBody ("batch-2") .withMessageGroupId ("baeldung-group-1")); SendMessageBatchRequest sendMessageBatchRequest = ny SendMessageBatchRequest (fifoQueueUrl, messageEntries); sqs.sendMessageBatch (sendMessageBatchRequest);

5. Lese meldinger fra køer

Vi kan motta meldinger fra køene våre innen påberope seg motta melding () metode på en forekomst av ReceiveMessageRequest:

ReceiveMessageRequest receiveMessageRequest = ny ReceiveMessageRequest (fifoQueueUrl) .withWaitTimeSeconds (10) .withMaxNumberOfMessages (10); Liste sqsMessages = sqs.receiveMessage (receiveMessageRequest) .getMessages (); 

Ved hjelp av withMaxNumberOfMessages (), vi spesifiserer hvor mange meldinger som skal hentes fra køen - selv om det skal bemerkes at maksimum er 10.

Metoden withWaitTimeSeconds () muliggjør lang avstemning. Lang avstemning er en måte å begrense antall mottatte meldingsforespørsler vi sender til SQS.

Enkelt sagt, dette betyr at vi vil vente opptil det angitte antall sekunder for å hente en melding. Hvis det ikke er noen meldinger i køen for den varigheten, vil forespørselen returnere tom. Hvis det kommer en melding i køen i løpet av den tiden, blir den returnert.

Vi kan få attributtene og kroppen til en gitt melding:

sqsMessages.get (0) .getAttributes (); sqsMessages.get (0) .getBody ();

6. Slette en melding fra en kø

For å slette en melding bruker vi a DeleteMessageRequest:

sqs.deleteMessage (ny DeleteMessageRequest () .withQueueUrl (fifoQueueUrl) .withReceiptHandle (sqsMessages.get (0) .getReceiptHandle ())); 

7. Dead Letter-køer

En dødbokskø må være av samme type som basiskøen - det må være FIFO hvis basiskøen er FIFO, og standard hvis basiskøen er standard. For dette eksemplet bruker vi en standard kø.

Det første vi må gjøre er å opprett det som blir vår døde bokstavskø:

String deadLetterQueueUrl = sqs.createQueue ("baeldung-dead-letter-queue"). GetQueueUrl (); 

Neste skal vi få den nyopprettede køens ARN (Amazon Resource Name):

GetQueueAttributesResult deadLetterQueueAttributes = sqs.getQueueAttributes (nye GetQueueAttributesRequest (deadLetterQueueUrl) .withAttributeNames ("QueueArn")); Streng deadLetterQueueARN = deadLetterQueueAttributes.getAttributes () .get ("QueueArn"); 

Til slutt, vi sett denne nyopprettede køen til å være vår opprinnelige standard køs dødbokskø:

SetQueueAttributesRequest queueAttributesRequest = ny SetQueueAttributeRequest () .withQueueUrl (standardQueueUrl) .addAttributesEntry ("RedrivePolicy", "{\" maxReceiveCount \ ": \" 2 \ "," + "\" deadLetterTargetA \ " "}"); sqs.setQueueAttributes (queueAttributesRequest); 

JSON-pakken vi satte i addAttributesEntry () metode når du bygger vår SetQueueAttributesRequest forekomst inneholder informasjonen vi trenger: den maxReceiveCount er 2, som betyr at hvis en melding mottas dette mange ganger, antas det at den ikke er behandlet riktig, og sendes til vår døde bokstavskø.

De deadLetterTargetArn attributt peker vår standardkø til vår nyopprettede dødbokskø.

8. Overvåking

Vi kan sjekk hvor mange meldinger som for øyeblikket er i en gitt kø, og hvor mange som er på flukt med SDK. Først må vi lage en GetQueueAttributesRequest.

Derfra sjekker vi tilstanden til køen:

GetQueueAttributesRequest getQueueAttributesRequest = ny GetQueueAttributesRequest (standardQueueUrl) .withAttributeNames ("All"); GetQueueAttributesResult getQueueAttributesResult = sqs.getQueueAttributes (getQueueAttributesRequest); System.out.println (String.format ("Antall meldinger i køen:% s", getQueueAttributesResult.getAttributes () .get ("ApproximateNumberOfMessages"))); System.out.println (String.format ("Antall meldinger i flyet:% s", getQueueAttributesResult.getAttributes () .get ("ApproximateNumberOfMessagesNotVisible")));

Mer grundig overvåking kan oppnås ved hjelp av Amazon Cloud Watch.

9. Konklusjon

I denne artikkelen har vi sett hvordan administrere SQS-køer ved hjelp av AWS Java SDK.

Som vanlig kan alle kodeeksempler som brukes i artikkelen finnes på GitHub.


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