RabbitMQ学习记录 - HelloWorld

(内容均来自RabbitMQ官网:https://www.rabbitmq.com/tutorials/tutorial-one-java.html

下载、安装RabbitMQ服务器:https://www.rabbitmq.com/#getstarted。RabbitMQ是基于erlang语言编写的,所以在安装RabbitMQ服务器的时候需要先安装erlang的依赖。具体RabbitMQ服务器和erlang的依赖版本在官网上都有说明:https://www.rabbitmq.com/news.html#2021-07-05T14:00:00+00:00

RabbitMQ遵循了AMQP协议(Advanced Message Queuing Protocol),我们只需要导入对应的AMQP的客户端就能连接、操作RabbitMQ的服务器。(下面为maven依赖)

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.9.0</version>
        </dependency>

HelloWorld

(一下所有的操作都是基于已经有RabbitMQ服务器在运行的基础之上跑的)

为了方便,我们创建一个简单的RabbitMQ客户端的连接工厂

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class RabbitMQUtils {

    private static ConnectionFactory connectionFactory;

    static {
        connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.137.1");//RabbitMQ所在服务器的ip
        connectionFactory.setPort(5672);//端口号
        connectionFactory.setVirtualHost("/ems");//虚拟主机名(自己可以在后台创建,也可以使用默认的:/)
        connectionFactory.setUsername("tianluhua");//用户(可以在后台创建,可也一在后台创建。系统默认账号:guest,密码:guest)
        connectionFactory.setPassword("123456");//密码
    }

    public static Connection getConnection() {
        try {
            return connectionFactory.newConnection();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void closeChannelAndConnection(Connection connection, Channel channel) {
        try {
            if (channel != null) channel.close();
            if (connection != null) connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

HelloWorld模式非常简单,一个生产者,一个队列,一个消费者(需要注意的是,这里没有提到交换机,并不是说没有使用到交换机,而是使用系统默认的交换机)

图例

接下来我们要做两件时间就能完成连接到RabbitMQ服务器,然后发送、接受消息

        1.发送消息

        (P) -> [|||]

import com.booyue.tlh.utils.RabbitMQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

public class Producer{
    //队列名称
    public static final String QUEUE_NAME = "hello"; 
    //需要发送的消息
    private static final String MESSAGE = "Hello RabbitMQ";

    public static void main(String[] args) throws IOException, InterruptedException {
        //从工具类获取连接
        Connection connection = RabbitMQUtils.getConnection();
        //获取通道
        Channel channel = connection.createChannel();
        //声明一个名字为hello的队列。这一步执行完之后,在RabbitMQ服务器上就会创建一个对应的Queue
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        //往名字为“hello”的队列中发送一条为:"Hello RabbitMQ" 的信息(第一个参数为交换机的名称,这里没写就是用系统默认的交换机)
        channel.basicPublish("", QUEUE_NAME, null, MESSAGE.getBytes());
    }
}

        2.接受消息

        

import com.booyue.tlh.utils.RabbitMQUtils;
import com.rabbitmq.client.*;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

@Slf4j
public class Consumer {
    public static void main(String[] args) throws IOException {
        //获取连接
        Connection connection = RabbitMQUtils.getConnection();
        //获取通道
        Channel channel = connection.createChannel();
        //这里也可以声明一个和生产者里面声明的一样的队列,不然如果先启动消费这的话系统会报错,说系统没有对应的queue。多出声明也没关系,第一次声明之后系统就不会在创建对应的queue了
        channel.queueDeclare(Producer.QUEUE_NAME, false, false, false, null);
        /**
         * 接收消息
         *  参数1:队列名
         *  参数2:是否自动确认
         *  参数3:消息回调接口
         */
        channel.basicConsume(Producer.QUEUE_NAME, true, new DefaultConsumer(channel) {
            @SneakyThrows
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
                String message = new String(body, "utf-8");
                try {
                    //模拟完成业务逻辑的耗时
                    Thread.sleep(1000);
                } finally {
                    log.info("收到的信息:{}", message);
                }
            }
        });
    }
}

启动Producer和Consumer,Consumer就能获取到Producer发过来的信息了。

01:31:14.949 [pool-1-thread-4] INFO com.booyue.tlh.hellowrold.Consumer - 收到的信息:Hello RabbitMQ

其他

这里我觉得有一点需要一定要注意,就是我们在HelloWorld的例子中没有看到交换机(Exchange)的影子,但是我们心里一定要清楚,系统一定是有使用交换机的。为我们后面更好的理解RabbitMQ的整个流程做一定的铺垫。

(下图是从我本地的RabbitMQ的服务器截图下来的,可以看到是使用了系统默认的交换机绑定了我们创建的这个队列)

猜你喜欢

转载自blog.csdn.net/qq_27062249/article/details/118533776
今日推荐