Programtillegg for forsinkede meldinger
Implementer forsinket meldingslevering ved hjelp av RabbitMQ Delayed Message Exchange-plugin. Planlegg meldinger for behandling på et senere tidspunkt uten egendefinerte tidtakere.
Programtillegg for forsinkede meldinger er en gratis leksjon i RabbitMQ-meldinger og asynkrone systemer på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i RabbitMQ-meldinger og asynkrone systemer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i RabbitMQ-meldinger og asynkrone systemer inneholder totalt 4 leksjoner.
Hva er forsinkede meldinger
Noen ganger ønsker De ikke at en melding skal behandles umiddelbart. Tenk for eksempel på å sende en påminnelses-e-post om en time eller behandle en betaling 30 minutter etter at en bestilling er lagt inn.
Forsinkede meldinger lar Dem publisere en melding til RabbitMQ, samtidig som De ber brokeren holde på den i en bestemt tidsperiode før den leveres til konsumentene.
Planlegging uten plugin-modulen
Uten en dedikert funksjon kan planlegging av meldinger være komplisert:
- Egendefinerte tidtakere: De kan bygge en egen tjeneste med tidtakere, men dette øker kompleksiteten og introduserer et enkelt feilpunkt.
- Databasebasert polling: Det er lite effektivt å lagre meldinger i en database og med jevne mellomrom kontrollere om tidspunktet deres er nådd.
- Eksterne planleggere: Bruk av CRON-jobber eller andre eksterne planleggere krever fortsatt at applikasjonen håndterer meldingstilstanden.
RabbitMQ Delayed Message Plugin forenkler dette betydelig!
Møt plugin-modulen `x-delayed-message`
RabbitMQ Delayed Message Exchange plugin tilbyr en spesiell exchangetype som kan holde på meldinger og frigi dem etter en angitt forsinkelse.
Den fungerer som en buffer og håndterer forsinkelsen internt, uten at applikasjonen må holde oversikt over meldingstidspunktene.
Dette gjør planlegging av meldinger mye enklere og mer robust.
Slik fungerer en forsinket exchange
Når De publiserer en melding til en `x-delayed-message`-exchange, inkluderer De et spesielt hode: x-delay. Verdien i dette hodet er forsinkelsen i millisekunder.
Exchangen holder på meldingen til forsinkelsen utløper. Når den er utløpt, rutes meldingen til køer på nøyaktig samme måte som en vanlig melding publisert til en exchange av den opprinnelige typen (for eksempel direct, fanout eller topic).
Aktivere plugin-modulen (administrator)
Før De bruker plugin-modulen, må den aktiveres på RabbitMQ-serveren. Dette gjøres vanligvis via kommandolinjen:
rabbitmq-plugins enable rabbitmq_delayed_message_exchangeDet kan være nødvendig å starte serveren på nytt for at endringene skal tre i kraft. Sørg alltid for at brokeren har plugin-modulen aktivert før De forsøker å bruke den.
Deklarere en forsinket exchange
For å bruke forsinkede meldinger må De først deklarere en exchange med typen x-delayed-message. De angir også den underliggende typen (for eksempel direct, fanout eller topic), som bestemmer hvordan meldinger rutes etter forsinkelsen.
Slik deklarerer De en forsinket direct-exchange i Java:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;
public class DeclareDelayedExchange {
private static final String EXCHANGE_NAME = "my_delayed_exchange";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // Assuming RabbitMQ is local
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct"); // Underlying exchange type
channel.exchangeDeclare(EXCHANGE_NAME, "x-delayed-message", true, false, args);
System.out.println("Delayed exchange '" + EXCHANGE_NAME + "' declared.");
}
}
}Sende med `x-delay`-hode
Når De publiserer til x-delayed-message-exchangen, legger De til et x-delay-hode i meldingsegenskapene. Verdien er et heltall som angir forsinkelsen i millisekunder.
La oss sende en melding som skal leveres etter 5 sekunder (5000 millisekunder).
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;
public class DelayedMessageProducer {
private static final String EXCHANGE_NAME = "my_delayed_exchange";
private static final String ROUTING_KEY = "delayed.key";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactoryFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// Ensure the delayed exchange is declared (from previous scene)
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
channel.exchangeDeclare(EXCHANGE_NAME, "x-delayed-message", true, false, args);
System.out.println("Exchange declared (if not exists).");
String message = "Hello, delayed world!";
int delayInMs = 5000; // 5 seconds
Map<String, Object> headers = new HashMap<>();
headers.put("x-delay", delayInMs); // Set the delay header
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.headers(headers)
.build();
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, props, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "' with delay " + delayInMs + "ms");
}
}
}Konsumere forsinkede meldinger
Konsumenter trenger ingen spesiell logikk for å motta forsinkede meldinger. Når forsinkelsen utløper, ruter x-delayed-message-exchangen meldingen til de tilknyttede køene, og konsumentene mottar den på samme måte som enhver annen melding.
Det viktige er at meldingen ankommer konsumenten etter den angitte forsinkelsen. De må binde en kø til den forsinkede exchangen med riktig routing key.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;
import java.util.Date;
public class DelayedMessageConsumer {
private static final String EXCHANGE_NAME = "my_delayed_exchange";
private static final String QUEUE_NAME = "delayed_queue";
private static final String ROUTING_KEY = "delayed.key";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// Declare the queue and bind it to the delayed exchange
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println(" [x] Received '" + message + "' at " + new Date());
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
}
}Vanlige bruksområder
Forsinkede meldinger er svært nyttige for:
- Påminnelser: Sende et varsel etter at prøveperioden til en bruker utløper.
- Planlagte oppgaver: Behandle en batchjobb på et bestemt tidspunkt i fremtiden.
- Mekanismer for nytt forsøk: Legge en mislykket melding tilbake i køen slik at den forsøkes på nytt etter en forsinkelse.
- Dryppkampanjer: Sende en serie e-poster over flere dager.
De fjerner behovet for komplekse eksterne planleggingstjenester.
Kort kontroll: Grunnleggende om forsinkede meldinger
De har lært hvordan De deklarerer en x-delayed-message-exchange og publiserer meldinger med en forsinkelse. La oss teste forståelsen Deres.
Oppsummering: Plugin-modulen for forsinkede meldinger
I denne leksjonen har De lært om RabbitMQ Delayed Message Exchange plugin. Den gjør det mulig å planlegge levering av meldinger til et senere tidspunkt.
- De deklarerer en exchange med typen
x-delayed-messageog en underliggende exchangetype. - De publiserer meldinger med et
x-delay-hode (verdi i millisekunder). - Konsumentene mottar disse meldingene på vanlig måte, men først etter den angitte forsinkelsen.
Denne kraftige funksjonen forenkler mange tidsbaserte meldingsmønstre.
Lær deg RabbitMQ-meldinger og asynkrone systemer med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 11
- Leksjoner
- 44
Ofte stilte spørsmål
Er leksjonen «Programtillegg for forsinkede meldinger» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien RabbitMQ-meldinger og asynkrone systemer, inkludert «Programtillegg for forsinkede meldinger», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i RabbitMQ-meldinger og asynkrone systemer inneholder totalt 4 leksjoner.
Hva lærer jeg i «Programtillegg for forsinkede meldinger»?
Implementer forsinket meldingslevering ved hjelp av RabbitMQ Delayed Message Exchange-plugin. Planlegg meldinger for behandling på et senere tidspunkt uten egendefinerte tidtakere. Du øver på RabbitMQ-meldinger og asynkrone systemer med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med RabbitMQ-meldinger og asynkrone systemer?
Ingen tidligere erfaring er nødvendig. RabbitMQ-meldinger og asynkrone systemer på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Programtillegg for forsinkede meldinger»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne RabbitMQ-meldinger og asynkrone systemer-leksjonen?
Ja. Alle RabbitMQ-meldinger og asynkrone systemer-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Programtillegg for forsinkede meldinger
- Shovel-plugin for føderering
- Federation-plugin for klynging
- Plugins for meldingsdeduplisering og konsistent hash-exchange