Tabla de contenido
1. Intercambio de letras muertas (Intercambio de letras muertas)
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+":该订单已经过期");
}
}