RabbitMQ.Letra muerta, cola de retraso

Tabla de contenido

1. Intercambio de letras muertas (Intercambio de letras muertas)

Cambiar propiedades:

2. Demostración del código

1.proveedor

①.DeadConfig

②.Controlador de proveedor

 2.consumidor

①.Receptor muerto 


1. Intercambio de letras muertas (Intercambio de letras muertas)

 RabbitMQ, como middleware de mensajería avanzada, propone el concepto de intercambiador de mensajes no entregados.
Este intercambiador se especializa en procesar mensajes inactivos (los mensajes que son rechazados y pueden ser reenviados no se consideran inactivos). Generalmente, hay tres situaciones en las que un mensaje se convierte en letra muerta:
1. El mensaje se rechaza y el parámetro de cola se establece en falso 
2. El mensaje caduca (de forma predeterminada, el mensaje en Rabbit no caduca, pero el tiempo de expiración de la cola y la caducidad del mensaje se puede establecer el tiempo para lograr el efecto de caducidad del mensaje)

3. La cola alcanza la longitud máxima (generalmente cuando se establece la longitud o tamaño máximo de la cola y alcanza el valor máximo). Cuando se
cumplen las tres condiciones anteriores, el mensaje se convertirá en un mensaje de letra muerta y se entregará a la cola correspondiente a través del interruptor de letra muerta.
Solo necesitamos escuchar la cola correspondiente para realizar el procesamiento final del mensaje de letra muerta.


Procesamiento de tiempo de espera de pedido


 


El productor produce un mensaje de pedido que caduca después de 1 minuto y lo envía al intercambio normal - a . El mensaje coincide con la cola cola - a , pero aún no se consume después de un minuto. El mensaje se entregará al intercambio de mensajes no entregados dlx-exchange y se enviará a la cola de mensajes no entregados
dlx-queue. Los consumidores de la cola de mensajes no entregados dlx-queue verificarán el estado del pedido de acuerdo con el mensaje y actualizarán el estado del pedido. si todavía está en estado de tiempo de espera no pagado

Cambiar propiedades:

Nombre: nombre del conmutador

Tipo: tipo de conmutador, directo, tema, distribución en abanico, encabezados

Durabilidad: si se requiere persistencia, si es persistente, después de que RabbitMQ se reinicia, el conmutador aún existe Eliminación automática: cuando el último está vinculado a Exchange. Se elimina la cola, Exchange se eliminará automáticamente Interno: si RabbitMQ usa internamente el Exchange actual, el valor predeterminado es Falso;

Argumentos: parámetros extendidos, utilizados para extender el uso personalizado del protocolo AMQP
 

2. Demostración del código

1.proveedor

①.DeadConfig

package com.example.provider.mq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
@SuppressWarnings("all")
public class DeadConfig {

    //1.需要正常的交换机
    //2.正常队列发出消息(具备配置)
    //3.具备死信交换机,队列

    @Bean
    public Queue normalQueue(){
        Map<String,Object> config=new HashMap<>();
        //过期时间
        config.put("x-message-ttl", 10000);
        //死信交换机
        config.put("x-dead-letter-exchange", "deadExchange");
        //死信routing key
        config.put("x-dead-letter-routing-key", "DD");
        return new Queue("normalQueue",true,false,false,config);
    }

    @Bean
    public Queue deadQueue(){
        return new Queue("deadQueue",true);
    }

    @Bean
    public DirectExchange normalExchange() {
        return new DirectExchange("normalExchange");
    }

    @Bean
    public DirectExchange deadExchange() {
        return new DirectExchange("deadExchange");
    }

    @Bean
    public Binding normalBinding() {
        return BindingBuilder.bind(normalQueue()).to(normalExchange()).with("CC");
    }

    @Bean
    public Binding deadBinding() {
        return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("DD");
    }

}

②.Controlador de proveedor

 @RequestMapping("/deadSend")
    public String deadSend(){
        log.warn("订单已经保存");
        //保存了一个订单
        template.convertAndSend("normalExchange","CC","order11888");
        return "yes";
    }

 2.consumidor

①.Receptor muerto 

package com.example.consumer.mq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@RabbitListener(queues = "deadQueue")
@Slf4j
public class DeadReceiver {

    @RabbitHandler
    public void process(String message){
        log.warn(message+":该订单已经过期");
    }

}

Supongo que te gusta

Origin blog.csdn.net/m0_54546762/article/details/123154426
Recomendado
Clasificación