Heim  >  Artikel  >  Java  >  Wie SpringBoot RabbitMQ integriert, um eine Verzögerungswarteschlange zu implementieren

Wie SpringBoot RabbitMQ integriert, um eine Verzögerungswarteschlange zu implementieren

WBOY
WBOYnach vorne
2023-05-16 20:31:10856Durchsuche

    So stellen Sie sicher, dass Nachrichten nicht verloren gehen

    rabbitmq-Nachrichtenübermittlungspfad

    Produzent->Switch->Warteschlange->Verbraucher

    Im Allgemeinen ist es in drei Phasen unterteilt.

    • 1. Der Produzent stellt die Zuverlässigkeit der Nachrichtenübermittlung sicher.

    • 2.mq interne Nachrichten gehen nicht verloren.

    • 3. Der Verbraucherkonsum ist erfolgreich.

    Was ist die Zuverlässigkeit der Nachrichtenübermittlung?

    Einfach ausgedrückt: Die Nachricht wird zu 100 % an die Nachrichtenwarteschlange gesendet.

    Wir können den Bestätigungsrückruf aktivieren

    Nachdem der Produzent die Nachricht übermittelt hat, gibt mq dem Produzenten eine Bestätigung. Basierend auf der Bestätigung kann der Produzent bestätigen, ob die Nachricht an mq gesendet wurde.

    Aktivieren Sie den Bestätigungsrückruf.

    Ändern Sie die Konfigurationsdatei

    #NONE:禁用发布确认模式,是默认值,CORRELATED:发布消息成功到交换器后会触发回调方法
    spring:
      rabbitmq:
        publisher-confirm-type: correlated

    Der Testcode

    @Test  
    public void testConfirmCallback() throws InterruptedException {  
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {  
        /**  
        *  
        * @param correlationData 配置  
        * @param ack 交换机是否收到消息,true是成功,false是失败  
        * @param cause 失败的原因  
        */  
        @Override  
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {  
            System.out.println("confirm=====>");  
            System.out.println("confirm==== ack="+ack);  
            System.out.println("confirm==== cause="+cause);  
            //根据ACK状态做对应的消息更新操作 TODO  
        }  
        });  
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"ikun.mei", "鸡你太美");  
        Thread.sleep(10000);  
    }

    stellt sicher, dass die Nachricht über returnCallback erfolgreich von der Vermittlungsstelle an die Warteschlange gesendet wird. Ändern Sie die Konfigurationsdatei

    spring:
      rabbitmq:
        #开启returnCallback
        publisher-returns: true
        #交换机处理消息到路由失败,则会返回给生产者
        template:
          mandatory: true

    Testcode

    @Test  
    void testReturnCallback() {  
        //为true,则交换机处理消息到路由失败,则会返回给生产者 配置文件指定,则这里不需指定  
        rabbitTemplate.setMandatory(true);  
        //开启强制消息投递(mandatory为设置为true),但消息未被路由至任何一个queue,则回退一条消息  
        rabbitTemplate.setReturnsCallback(returned -> {  
            int code = returned.getReplyCode();  
            System.out.println("code="+code);  
            System.out.println("returned="+ returned);  
        });  
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"123456","测试returnCallback");  
    }

    Wenn Verbraucher Nachrichten konsumieren, müssen sie manuell durch Bestätigung bestätigen, dass die Nachrichten konsumiert wurden.

    Ändern Sie die Konfigurationsdatei.

    spring:
      rabbitmq:
        listener:  
          simple:  
            acknowledge-mode: manual
    .

    Schreiben Sie den Testcode

    Was ist eine Warteschlange für unzustellbare Nachrichten? nack)

    und wird nicht erneut in die Warteschlange gestellt

    requeue=false

    Die Nachricht wurde nicht in der Warteschlange verbraucht und hat die Ablaufzeit der Warteschlange oder der Nachricht selbst überschritten

    TTL (Time-to-Live)

    • Die Nachrichtenlänge der Warteschlange hat das Limit erreichtDas Ergebnis: Die Nachricht wird zu einem unzustellbaren Brief. Wenn die Warteschlange schließlich an einen Schalter für unzustellbare Nachrichten gebunden ist, wird die Nachricht in die Warteschlange für unzustellbare Nachrichten umgeleitet durch den Dead-Letter-Schalter

    • Die Dead-Letter-Warteschlange wird häufig für den verzögerten Warteschlangenverbrauch verwendet. Verzögerte Warteschlange

    • Der Produzent erwartet nicht, dass diese Nachricht sofort verbraucht wird, wenn sie an mq übermittelt wird, sondern wartet eine gewisse Zeit, bevor er sie verbraucht.
    • Springboot integriert Rabbitmq, um das automatische Schließen von Bestellungen bei Zeitüberschreitung zu realisieren. 04 - 16 15:14:44

      msgTag=1
    • message=(Body:'Testauftragsverzögerung' MessageProperties [headers={spring_listener_return_correlation=03169cfc-5061-41fe-be47-c98e36d17eac, x-first-death-exchange=order_exchange, x - Death=[{reason=expired, count=1, Exchange=order_exchange, time=Mo, 16. Apr. 15:14:44 CST 2023, Routing-Keys=[order], queue=order_queue}], x-first-death- Grund = abgelaufen, x-first-death-queue = order_queue}, contentType = text/plain, contentEncoding = UTF-8, contentLength = 0,empfangenDeliveryMode=PERSISTENT, Priorität=0, redelivered=false,empfangenExchange=order_dead_letter_exchange,empfangenRoutingKey=order_dead_letter_queue_routing_key , DeliveryTag=1, ConsumerTag=amq.ctag-Eh8GMgrsrAH1rvtGj7ykOQ, ConsumerQueue=order_dead_letter_queue])
    • body=Bestellverzögerung testen

    Das obige ist der detaillierte Inhalt vonWie SpringBoot RabbitMQ integriert, um eine Verzögerungswarteschlange zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen