Java usa RabbitMQ para enviar y recibir mensajes

RabbitMQ es un middleware de mensajes que utiliza el lenguaje Erlang para implementar AMQP (Protocolo de cola de mensajes avanzado, Protocolo de cola de mensajes avanzado). Originalmente se originó en sistemas financieros y se utiliza para almacenar y reenviar mensajes en sistemas distribuidos. RabbitMQ es favorecido por más y más empresas debido a su alta confiabilidad, fácil expansión, alta disponibilidad y características completas. A continuación se describe cómo utilizar RabbitMQ para enviar y recibir mensajes en Java.

Utilice Maven para agregar archivos dependientes

En el archivo de información de configuración pom.xml, agregue la dependencia del cliente RabbitMQ:

<!-- RabbitMQ客户端 -->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.10.0</version>
</dependency>

1. El código de cliente del remitente

Primero, el remitente envía un mensaje a RabbitMQ, que luego es consumido por el receptor. Aquí está el código de cliente remitente:

package com.pjb.demo;

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 发送者客户端
 * @author pan_junbiao
 **/
public class RabbitProducer
{
    private static final String EXCHANGE_NAME = "exchange_demo";
    private static final String ROUTING_KEY = "routingkey_demo";
    private static final String QUEUE_NAME = "queue_demo";
    private static final String IP_ADDRESS = "127.0.0.1";
    private static final int PORT = 5672; //RabbitMQ 服务端默认端口号为 5672
    private static final String USER_NAME = "guest";
    private static final String PASSWORD = "guest";

    public static void main(String[] args) throws IOException, TimeoutException
    {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(IP_ADDRESS);
        factory.setPort(PORT);
        factory.setUsername(USER_NAME);
        factory.setPassword(PASSWORD);
        Connection connection = factory.newConnection(); //创建连接
        Channel channel = connection.createChannel(); //创建信道
        //创建一个 type = DIRECT、持久化的、非自动删除的交换器
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true, false, null);
        //创建一个持久化、非排他的、非自动删除的队列
        channel.queueDeclare(QUEUE_NAME,true,false,false,null);
        //将交换器与队列通过路由键绑定
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,ROUTING_KEY);
        //发送一条持久化的信息
        String message = "您好,欢迎访问 pan_junbiao的博客";
        channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());
        //关闭资源
        channel.close();
        connection.close();
    }
}

2. Código de cliente receptor

Aquí, el receptor se implementa heredando DefaultConsumer. Aquí está el código del cliente receptor:

package com.pjb.demo;

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * 接收者客户端
 * @author pan_junbiao
 **/
public class RabbitConsumer
{
    private static final String QUEUE_NAME = "queue_demo";
    private static final String IP_ADDRESS = "127.0.0.1";
    private static final int PORT = 5672; //RabbitMQ 服务端默认端口号为 5672
    private static final String USER_NAME = "guest";
    private static final String PASSWORD = "guest";

    public static void main(String[] args) throws IOException, TimeoutException,InterruptedException
    {
        Address[] addresses = new Address[]{new Address(IP_ADDRESS, PORT)};
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername(USER_NAME);
        factory.setPassword(PASSWORD);
        Connection connection = factory.newConnection(addresses); //创建连接
        final Channel channel = connection.createChannel(); //创建信道
        channel.basicQos(64); //设置客户端最多接收未被ack的消息的个数
        Consumer consumer = new DefaultConsumer(channel)
        {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException
            {
                System.out.println("接收信息:" + new String(body));
                try
                {
                    TimeUnit.SECONDS.sleep(1);
                }
                catch (InterruptedException ie)
                {
                    ie.printStackTrace();
                }
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };
        channel.basicConsume(QUEUE_NAME, consumer);
        //等待回调函数执行完毕之后,关闭资源
        TimeUnit.SECONDS.sleep(5);
        channel.close();
        connection.close();
    }
}

Resultados del:

 

Supongo que te gusta

Origin blog.csdn.net/pan_junbiao/article/details/112022957
Recomendado
Clasificación