Szene
In der Entwicklung werden häufig zeitgesteuerte Aufgaben benötigt. Für Einkaufszentren sind zeitgesteuerte Aufgaben besonders zahlreich, z. Es gibt jedoch ein Problem mit den Zeitaufgaben selbst. Im Allgemeinen fragen wir die Datenbank durch zeitgesteuerte Umfragen, um festzustellen, ob Aufgaben ausgeführt werden müssen. Das heißt, egal was passiert, wir müssen zuerst die Datenbank abfragen. Einige Aufgaben haben hohe Anforderungen an die Zeitgenauigkeit und müssen einmal eine Sekunde abfragen. Es spielt keine Rolle, ob das System klein ist. Wenn das System selbst groß ist und es viele Daten gibt, ist dies nicht sehr realistisch, sodass andere Methoden erforderlich sind. Natürlich gibt es viele Möglichkeiten, sie zu implementieren, wie z. B. REDIS -Implementierung Timing -Warteschlangen, JDK -Verzögerungs -Warteschlangen, die auf vorrangigen Warteschlangen, Zeitrunden usw. basieren, da wir Rabbitmq in unserem Projekt verwenden, basierend auf dem Prinzip der einfachen Entwicklung und Wartung. Wenn Sie nicht wissen, was Rabbitmq ist oder wie Springboot Rabbitmq integriert, können Sie meinen vorherigen Artikel Spring Boot Integrated Rabbitmq überprüfen
Rabbitmq -Verzögerungswarteschlange
Rabbitmq selbst hat keine Verzögerungswarteschlange und kann nur durch die Eigenschaften der Warteschlange von Rabbitmq implementiert werden. Wenn Rabbitmq Verzögerungswarteschlangen implementieren möchte, müssen Sie Rabbitmqs Dead-Letter-Switch (Exchange) und Message Survival Time TTL (Zeit zum Leben) verwenden.
Dead Briefschalter
Eine Nachricht wird in einen toten Buchstabenschalter eingegeben, wenn die folgenden Bedingungen erfüllt sind. Denken Sie daran, dass dies ein Schalter anstelle einer Warteschlange ist. Ein Schalter kann vielen Warteschlangen entsprechen.
Der tote Buchstabenschalter ist ein gewöhnlicher Schalter, aber da wir abgelaufene Nachrichten wegwerfen, wird er als toter Buchstabenschalter bezeichnet. Es bedeutet nicht, dass der tote Buchstabenschalter ein spezifischer Schalter ist.
Nachricht TTL (Nachrichtenüberlebenszeit)
Der TTL der Nachricht ist die Überlebenszeit der Nachricht. Rabbitmq kann TTL für Warteschlangen und Nachrichten separat festlegen. In der Warteschlangeneinstellung ist die Warteschlange nicht mit Verbrauchern angeschlossen und Sie können auch separate Einstellungen für jede einzelne Nachricht vornehmen. Nach dieser Zeit denken wir, dass die Nachrichten tot sind und ein Todesschreiben genannt wird. Wenn die Warteschlange festgelegt ist und die Nachricht festgelegt ist, wird die kleine aufgenommen. Wenn also eine Nachricht in eine andere Warteschlange weitergeleitet wird, kann die Zeit des Todes dieser Nachricht unterschiedlich sein (unterschiedliche Warteschlangeneinstellungen). Hier sprechen wir über TTL einer einzelnen Nachricht, da dies der Schlüssel zur Implementierung verzögerter Aufgaben ist.
byte [] messageBodyBytes = "Hallo, Welt!". getBytes (); Amqp.basicProperties properties = new amqp.basicproperties (); Eigenschaften.SetExpiration ("60000"); Channel.BasicPublish ("my-exchange", "Queue-Key", Eigenschaften, MessageBodyBytes);Sie können die Zeit festlegen, indem Sie das Ablauffeld der Nachricht oder die X-Message-TTL-Eigenschaft festlegen, die beide den gleichen Effekt haben. Es ist nur so, dass das Vergleichsfeld ein String-Parameter ist. Sie müssen also eine Int-Typ-Zeichenfolge schreiben: Wenn die obige Nachricht in die Warteschlange geworfen wird, wird 60 Sekunden vergangen, wenn es nicht konsumiert wird, wird es sterben. Wird von den Verbrauchern nicht konsumiert. Die Nachrichten hinter diesen Nachrichten sind nicht "tot" und werden von den Verbrauchern verzehrt. Tote Briefe werden nicht gelöscht und in der Warteschlange veröffentlicht. Sie werden in die Anzahl der Nachrichten in der Warteschlange gezählt.
Prozessflussdiagramm
Erstellen Sie Schalter und Warteschlangen
Erstellen Sie einen toten Buchstabenschalter
Wie in der Abbildung gezeigt, soll ein gewöhnlicher Schalter erstellt werden. Aus einfacher Unterscheidung ist der Name des Schalters Verzögerung
Erstellen Sie eine automatische Ablaufnachrichtwarteschlange
Die Hauptfunktion dieser Warteschlange besteht darin, dass Nachrichten regelmäßig ablaufen. Wenn wir beispielsweise die Bestellung in 2 Stunden schließen müssen, müssen wir die Nachricht in diese Warteschlange einfügen und die Ablaufzeit der Nachricht auf 2 Stunden festlegen
Erstellen Sie eine automatisch abgelaufene Warteschlange namens Dely_queue1. Natürlich läuft die Parameter im Bild nicht automatisch die Nachricht ab, da wir den X-Message-TTL-Parameter nicht festlegen. Wenn die Nachrichten in der gesamten Warteschlange gleich sind, können Sie sie festlegen. Für die Flexibilität ist es nicht festgelegt. Die anderen beiden Parameter X-Dead-Letter-Austausch stellen den Switch dar, an den die Nachricht nach Ablauf der Nachricht eingegeben wird. Die Konfiguration hier ist die Verzögerung, dh der tote Buchstabenschalter. X-Dead-Letter-Routing-Key besteht darin, den Routing-Key des toten Buchstabenschalters nach Ablauf der Nachricht zu konfigurieren. Gleiches gilt für das Senden des Routing-Tastes der Nachricht. Nach diesem Schlüssel wird die Nachricht in eine andere Warteschlange gestellt.
Erstellen Sie eine Warteschlange zur Nachrichtenverarbeitung
Diese Warteschlange ist die Warteschlange, die Nachrichten wirklich verarbeitet, und alle Nachrichten, die in diese Warteschlange eintreten, werden verarbeitet
Der Name der Meldungswarteschlange ist Dely_queue2
Meldungswarteschlange, die an Switch gebunden sind
Geben Sie die Seite "Switch Details" ein und binden Sie die erstellten zwei Warteschlangen (Delay Queue1 und Delay Queue2) an den Switch.
Der Routing -Schlüssel der automatischen Ablaufmeldungswarteschlange ist auf Verzögerung festgelegt
Binden Sie die Verzögerungsqueue2
Der Schlüssel der Verzögerungsqueue2 sollte so eingestellt werden, dass ein automatisch abgelaufener Warteschlangen-X-Dead-Letter-Routing-Key-Parameter erstellt wird, sodass die Nachricht nach Ablauf der Nachricht automatisch in der Warteschlange Delay_Queue2 platziert werden kann.
Die Seite "Bound Management" ist wie in der Abbildung dargestellt:
Natürlich kann diese Bindung auch mit Code implementiert werden, nur für intuitive Ausdrucks
Senden Sie eine Nachricht
String msg = "Hallo Word"; MessageProperties messageProperties = new messageProperties (); MessageProperties.SetExpiration ("6000"); messageProperties.setCorrelationId (uUid.randomuUID (). toString (). getBytes ()); Message message = new message (msg.getBytes (), messageProperties); Rabbittemplate.ConvertandSend ("Delay", "Delay", Nachricht);Der Hauptcode ist
MessageProperties.SetExpiration ("6000");Stellen Sie die Nachricht so ein, dass sie nach 6 Sekunden abläuft
Hinweis: Da die Nachricht automatisch abgelaufen ist, dürfen Sie das Anhören von Delay_queue1 nicht festlegen und die Nachrichten in dieser Warteschlange können nicht akzeptiert werden. Sobald die Nachricht verzehrt ist, wird es keinen Ablauf geben.
Nachricht erhalten
Konfigurieren Sie einfach Dely_queue2, um Empfangsnachrichten zu hören
Paket wang.raye.rabbitmq.demo1; import org.springframework.amqp.core.acknowledGemode; import org.springframework.amqp.core.binding; import org.springframework.amqp.core.binding; import org.springframework.amqp.core.bindingbuilder; import org.springframework.amqp.core.directExchange; import org.springframework.amqp.core.message; import org.springframework.amqp.core.queue; import org.springframework.amqp.rabbit.connection.cachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.Channelawaremessagelistener; import org.springframework.amqp.rabbit.Listener.ImPlemessagelistenercontainer; import org.springframework.beans.factory.annotation.autowired; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; @ConfigurationPublic class Delayqueue { / ** Name des Nachrichtenschalters* / public static Final String = "Delay"; / ** Warteschlange Key1*/ public static Final String RoutingKey1 = "Delay"; / ** Warteschlange Key2*/ public static Final String RoutingKey2 = "Delay_key"; / *** Konfigurationsverbindungsinformationen* @return*/ @bean public ConnectionFactory Connectory Connectory () {CachingConnectionFactory Connectory ConnectoryFactory = New CachingConnectionFactory ("120.76.237.8", 5672); ConnectionFactory.Setusername ("Kberp"); ConnectionFactory.SetPassword ("Kberp"); ConnectionFactory.setVirtualHost ("/"); ConnectionFactory.SetPublisherConFirms (true); // return ConnectionFactory muss festgelegt werden. } /** * Configure message switch* Configure FanoutExchange for consumers: Distribute messages to all bound queues, without the concept of routingkey HeadersExchange: match DirectExchange by adding attribute key-value: Distribute to the specified queue according to routingkey TopicExchange: Multi-key matching */ @Bean public DirectExchange defaultExchange() { return new DirectExchange(EXCHANGE, true, false); } / ** * Konfigurieren Sie die Meldungswarteschlange 2 * Konfigurieren * / @Bean public Queue Queue () {Neue Warteschlange zurückgeben ("Delay_queue2", true); // Zitat persistent}/*** Binden Sie die Meldungswarteschlange 2 mit dem Switch* Konfigurieren Sie für Verbraucher* @return*/@bean @Autowired public binding binding () {return bindingBuilder.bind (Queue ()). TO (defaultExchange ()). Mit (mit DelyQueue.routingKey2); } / *** Akzeptiere den Hörer der Nachricht, dieser Hörer akzeptiert die Nachricht von Message Queue 1* Konfigurieren Sie für Verbraucher Container.Setqueue (Queue ()); container.setExposelistenerchannel (true); Container.SetMaxConcurrentConsumers (1); Container.SetConcurrentConsumers (1); Container.SetacknowledGemode (detaalledgeMode.manual); // Bestätigungsmodus einstellen, die Container manuell bestätigen. Channel.Basicack (message.getMessageProperties (). getDeliveryTag (), false); Rückkehrbehälter; }}Behandeln Sie einfach Aufgaben, die während des Anhörens von Nachrichten regelmäßig verarbeitet werden müssen. Da RabbitMQ Nachrichten senden kann, können Sie den Aufgabenfunktionscode senden, z. B. das Schließen der Bestellung und das Senden der Bestell -ID, wodurch die Notwendigkeit vermieden wird, die Bestellungen abzufragen, die geschlossen werden müssen, und die Belastung für MySQL zu erhöhen. Sobald das Bestellvolumen groß ist, ist die Abfrage selbst auch eine sehr teure Sache.
Zusammenfassen
Das Implementieren von Zeitaufgaben auf der Grundlage von RabbitMQ muss eine Ablaufzeit für die Nachricht festlegen, sie in eine nicht gelesene Warteschlange setzen, sodass die Nachricht nach Ablauf des Ablaufs automatisch an eine andere Warteschlange übertragen wird, und den Hörer dieser Warteschlangenachricht überwachen, um die spezifischen Operationen der Zeitaufgaben zu verarbeiten.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.