RabbitMQ instala e integra springboot en docker

docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management

Resolución de puerto:

4369, 25672 (puertos de descubrimiento y clúster de Erlang)

5672, 5671 (puertos AMQP)

15672 (puerto de fondo de administración web)

61613, 61614 (puertos de protocolo STOMP)

1883, 8883 (puerto de protocolo MQTT)

Redes y RabbitMQ — RabbitMQ

Mecanismo operativo RabbitMQ

Enrutamiento de mensajes en AMQP

  • Existen algunas diferencias entre el proceso de enrutamiento de mensajes en AMQP y el JMS familiar para los desarrolladores de Java.Las funciones de Exchange y Binding se agregan a AMQP. El productor publica el mensaje en Exchange, el mensaje finalmente llega a la cola y lo recibe el consumidor, y Binding decide a qué cola debe enviarse el mensaje del intercambio.

Tipo de intercambio

Cuando Exchange distribuye mensajes, existen diferentes estrategias de distribución de acuerdo a los diferentes tipos, actualmente hay cuatro tipos: directo, abanico, tema y encabezados. Los encabezados coinciden con el encabezado del mensaje AMQP en lugar de la clave de enrutamiento. El cambio de encabezados es exactamente igual que el cambio directo, pero el rendimiento es mucho peor y casi no se usa en la actualidad, así que mire directamente los otros tres tipos :

Si la clave de enrutamiento en el mensaje es consistente con la clave de vinculación en Vinculación, el conmutador enviará el mensaje a la cola correspondiente. La clave de enrutamiento coincide exactamente con el nombre de la cola. Si una cola está vinculada a un intercambio y requiere que la clave de enrutamiento sea "perro", solo se reenviarán los mensajes cuya clave de enrutamiento esté marcada como "perro", ni "perro.cachorro" ni " dog.puppy" será reenviado. .guard” y así sucesivamente. Es una coincidencia exacta, modo unicast.

Cada mensaje enviado a un intercambio de tipo fanout se asignará a todas las colas enlazadas. El intercambio fanout no maneja las claves de enrutamiento, sino que simplemente vincula las colas al intercambio, y cada mensaje enviado al intercambio se reenviará a todas las colas vinculadas al intercambio. Al igual que la transmisión de subred, cada host en la subred recibe una copia del mensaje. Los mensajes de reenvío de tipo fanout son los más rápidos.

El intercambio de temas asigna el atributo de la clave de enrutamiento del mensaje a través de la coincidencia de patrones y hace coincidir la clave de enrutamiento con un patrón determinado. En este momento, la cola debe vincularse a un patrón. Divide la cadena de claves de enrutamiento y claves de enlace en palabras separadas por puntos. También reconoce dos caracteres comodín: el símbolo "#" y el símbolo "*". # coincide con 0 o más palabras, * coincide con una palabra.

RabbitMQ integra springboot

1. Introducir spring-boot-starter-amqp

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2. configuración de aplicación.yml

spring:
    rabbitmq:
      host: 192.168.159.4
      port: 5672
      virtual-host: /

3. Prueba RabbitMQ

@Resource
AmqpAdmin amqpAdmin;

@Resource
RabbitTemplate rabbitTemplate;

/**
 * 创建交换机
 */
@Test
void creatExchange() {
    //String name, boolean durable, boolean autoDelete
    DirectExchange directExchange = new DirectExchange("java-exchange", true, false);
    amqpAdmin.declareExchange(directExchange);
    System.out.println("xchange创建成功");
}

@Test
void creatQueue() {
    Queue queue = new Queue("java-queue",true,false,false);
    amqpAdmin.declareQueue(queue);
    System.out.println("queue创建成功");
}

/**
 * String destination 目的地
 * Binding.DestinationType destinationType 目的地类型
 * String exchange 交换机
 * String routingKey 路由键
 * @Nullable Map<String, Object> arguments
 * 将exchange交换机和destination目的地进行绑定
 */
@Test
void creatBinding() {
    Binding binding = new Binding("java-queue",
            Binding.DestinationType.QUEUE,
            "java-exchange",
            "hello.java",
            null);
    amqpAdmin.declareBinding(binding);
    System.out.println("Binding创建成功");
}

@Test
void sendMessage() {
    //1、如果发送的是对象内容必须采用序列化机制,对象必须实现Serializable接口
    DeviceEntity deviceEntity = new DeviceEntity();
    deviceEntity.setDivId(1);
    deviceEntity.setDivName("测试");
    deviceEntity.setDivCreate(new Date().toString());
    //2、如果发送的对象是一个json
    //配置config配置文件
    //测试发送消息
    rabbitTemplate.convertAndSend("java-exchange","hello.java",deviceEntity);
    log.info("消息发送成功:{}",deviceEntity);
}

1. AmqpAdmin: componente de gestión

2. RabbitTemplate: componente de procesamiento de envío de mensajes

3. El método @RabbitListener de escuchar mensajes puede tener tres parámetros (independientemente de la cantidad y el orden)

• Contenido de objeto, mensaje de mensaje, canal de canal

@Slf4j
@Service
@RabbitListener(queues = {"java-queue"})
public class TestDemoImpl implements ITestDemo {

    @Autowired
    SearchFeignService searchFeignService;

    @Autowired
    TestDemoMapper testDemoMapper;

    /**
     *  消息接收
     *  class org.springframework.amqp.core.Message
     *  Message 1、原生消息详细信息
     *  2、发送的消息类型:T<发送的消息类型> DeviceEntity count
     *  3、当前传输数据的通道 Channel channel
     *
     *  Queue:可以很多人来接收消息,只要收到消息,队列删除消息,而且只能收到一个消息
     *  场景:
     *      1、同时启动多个服务,只有一个可以接收到消息
     *      2、只有当消息处理完成后才能进行下一个消息处理
     *
     *
     *  @RabbitListener 可以在类和方法上,监听哪些队列
     *  @RabbitHandler 只能在方法上面,可以重载区分不同的消息
     *
     * @param message
     */
    @RabbitHandler
    public void receiveMessage(Message message, DeviceEntity count, Channel channel) {
        byte[] body = message.getBody();
        log.info("接收到的消息为:{},消息类型为:{}",message,message.getClass());
        log.info("消息体真正内容:{}",count.toString());
    }

}

Supongo que te gusta

Origin blog.csdn.net/wzw_wwl/article/details/130987750
Recomendado
Clasificación