Java uses RabbitMQ to send and receive messages

RabbitMQ is a message middleware that uses Erlang language to implement AMQP (Advanced Message Queuing Protocol, Advanced Message Queuing Protocol). It originally originated in financial systems and used to store and forward messages in distributed systems. RabbitMQ is favored by more and more enterprises due to its high reliability, easy expansion, high availability and rich features. The following describes how to use RabbitMQ to send and receive messages in Java.

Use Maven to add dependent files

In the pom.xml configuration information file, add RabbitMQ client dependency:

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

1. The sender's client code

First, the sender sends a message to RabbitMQ, which is then consumed by the receiver. Here is the sender client code:

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. Receiver client code

Here, the receiver is implemented by inheriting DefaultConsumer. Here is the receiver client code:

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();
    }
}

Results of the:

 

Guess you like

Origin blog.csdn.net/pan_junbiao/article/details/112022957