RabbitMQ learning-el quinto enrutamiento

En el último artículo, creamos un sistema de registro simple, podemos transmitir mensajes de registro a múltiples destinatarios.

En este artículo agregaremos una función para recibir solo una parte del mensaje en el futuro. Por ejemplo, solo guardo algunos registros de errores en un archivo e imprimo todos los registros en la consola.

1. Enlaces

En el artículo anterior, hemos creado un enlace, el código es el siguiente:

channel.queueBind(queueName, EXCHANGE_NAME, "");

Un enlace es una relación entre intercambio y cola. Puede entenderse simplemente como: esta Cola está interesada en los mensajes de intercambio relativos a ella (el texto original es la cola está interesada en los mensajes de este intercambio).

El enlace puede usar un parámetro routingKey existente. Para evitar confusiones con el parámetro basic_publish, lo llamamos clave de enlace. Lo siguiente es cómo usamos la clave para crear un enlace:

channel.queueBind(queueName, EXCHANGE_NAME, "black");

El significado de la clave de enlace a veces depende del tipo de intercambio. Para los intercambios de tipo Fanout, se ignora la clave de enlace.

2. Intercambio directo

El sistema de registro en el artículo anterior transmitirá todos los mensajes de registro a todos los consumidores. Queremos expandirnos para filtrar los mensajes de registro según su nivel de registro. Por ejemplo: solo queremos escribir los registros de nivel de error en el archivo del disco, mientras que los mensajes de registro de otros niveles se filtran.

Antes utilizamos el intercambio de tipo fanout, pero de esta manera no habrá mucha flexibilidad.

Aquí vamos a usar el tipo de intercambio directo. El algoritmo de enrutamiento del intercambio directo de tipos es muy simple: si un mensaje puede llegar a esta cola, la clave de enlace y la clave de enrutamiento deben coincidir exactamente.

Para ilustrar esta verdad, puede mirar la descripción a continuación:

En dicha estructura, podemos ver el intercambio X del tipo directo, y hay dos colas vinculadas a él. La primera cola está obligada a intercambiar X con naranja como clave de enlace, y la segunda cola está obligada a intercambiar X con dos teclas de enlace (negro y verde).

En tales configuraciones, se envía un mensaje al intercambio, si la clave de enrutamiento utilizada es naranja, el mensaje se enrutará a Q1; si la clave de enrutamiento utilizada es negra o verde, el mensaje se enrutará a Q2 En. Todos los demás mensajes serán descartados.

3. Enlaces múltiples

También es posible usar el mismo enlace para enlazar múltiples colas al mismo intercambio. Por ejemplo, sobre la base del ejemplo anterior, agregue el nombre de la clave de enlace negro entre X y Q1. En este caso, el intercambio de tipo directo aquí es el mismo que el tipo de despliegue, y el mensaje puede enviarse a todas las colas. Los mensajes con la tecla de enrutamiento negra se enviarán a Q1 y Q2.

4. Envío de registros (emisión de registros)

Usaremos este modelo, en lugar de usar el tipo de intercambio fanout, pero el tipo directo. Usamos el nivel de registro como clave de enrutamiento, y el extremo receptor recibe el mensaje de acuerdo con el nivel de registro establecido como clave de enlace. Primero mira el registro de lanzamiento:

Como antes, primero cree un intercambio:

channel.exchangeDeclare (EXCHANGE_NAME, "direct");
Luego, prepárese para enviar un mensaje;

channel.basicPublish (EXCHANGE_NAME, severidad, nulo, message.getBytes ());
"severidad" aquí puede ser "información", "advertencia", "error", etc.

5. Suscripción (Suscripción)

Los mensajes recibidos aquí son los mismos que en la publicación de blog anterior, con una excepción: enlazaremos cada nivel de registro de interés.

String queueName = channel.queueDeclare (). GetQueue ();

for (String severity: argv) {
channel.queueBind (queueName, EXCHANGE_NAME, severity);
}
6 、 最终 实现

EmitLogDirect.java 的 代码 :
复制 代码
clase pública EmitLogDirect {
cadena estática final privada EXCHANGE_NAME = "direct_logs";
public static void main (String [] argv)
arroja java.io.IOException {
ConnectionFactory factory = new ConnectionFactory ();
factory.setHost ("localhost");
Conexión conexión = factory.newConnection ();
Canal canal = connection.createChannel ();

    //声明direct类型的exchange
    channel.exchangeDeclare(EXCHANGE_NAME, "direct");

// Obtener el nivel de registro
String severity = getSeverity (argv);

    //拿到日志消息
    String message = getMessage(argv);

    //指定routing key,发送消息
    channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes());
    System.out.println(" [x] Sent '" + severity + "':'" + message + "'");

    channel.close();
    connection.close();
}
//..

}
代码 代码
ReceiveLogsDirect.java 的 代码 :
复制 代码
clase pública ReceiveLogsDirect {
cadena estática final privada EXCHANGE_NAME = "direct_logs";
public static void main (String [] argv)
lanza java.io.IOException,
java.lang.InterruptedException {
ConnectionFactory factory = new ConnectionFactory ();
factory.setHost ("localhost");
Conexión conexión = factory.newConnection ();
Canal canal = connection.createChannel ();

    //声明direct类型的exchange
    channel.exchangeDeclare(EXCHANGE_NAME, "direct");
    String queueName = channel.queueDeclare().getQueue();

    if (argv.length < 1){
        System.err.println("Usage: ReceiveLogsDirect [info] [warning] [error]");
        System.exit(1);
    }
    
    //绑定我们需要接收的日志级别
    for(String severity : argv){
        channel.queueBind(queueName, EXCHANGE_NAME, severity);
    }

    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

    QueueingConsumer consumer = new QueueingConsumer(channel);
    channel.basicConsume(queueName, true, consumer);

    while (true) {
        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        String message = new String(delivery.getBody());
        String routingKey = delivery.getEnvelope().getRoutingKey();

        System.out.println(" [x] Received '" + routingKey + "':'" + message + "'");
    }
}

}
Copiar código
Ejecute tres receptores de registro:
reciba errores y registros de nivel de información:

Recibir registros de nivel de error:

Recibir registros de nivel de información:

Ejecute dos generadores de registros:
genere registros de nivel de error:

Generar registros de nivel de información:

Observe los cambios en el lado del receptor:
reciba receptores de nivel de error y solo reciba registros de nivel de error:

Reciba receptores de nivel de información, solo reciba registros de nivel de información:

Receptores para registros de nivel de error e información, y registros de nivel de información y error:

7. Resumen:

Para recordar la clave de enrutamiento en el lado del productor, luego configure la clave de enlace en el lado del consumidor como la clave de enrutamiento anterior, puede usar el tipo de intercambio directo para obtener la información que necesita.

Publicó 40 artículos originales · 25 alabanzas · 100,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/yym373872996/article/details/105651955
Recomendado
Clasificación