RabbitMQ-简单队列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Anbang713/article/details/82873048

一、基本概念

RabbitMQ是一个消息代理,它被用于接收并转发消息。官方文档里把它比作邮局,当我们要把寄发的邮件投递到邮箱中时,我们确信邮递员最终会将邮件发送给收件人。在这个比喻中,RabbitMQ是一个邮箱,邮局和邮递员。

RabbitMQ和邮局之间的主要区别在于它不处理消息数据,而是接收、存储和转发二进制数据块的消息。

生产意味着不仅仅是发送,我们称发送消息的程序是一个生产者。

队列就像是在RabbitMQ中扮演邮箱的角色。虽然消息流过RabbitMQ和我们应用程序,但它们只能存储在队列中。队列只受主机内存和磁盘限制的限制,它本质上是一个大的消息缓冲区。生产者发送消息到一个队列,消费者尝试从一个队列接收数据。

消费具有与接收相似的含义,而消费者主要是一个等待接收消息的程序。

需要注意的是:producer,consumer和broker(rabbitMQ server)在大多数应用程序中是分布式的。

二、Hello World

今天我们将用Java编写两个程序,用于发送单个消息的生产者,以及接收消息并将其打印出来的消费者。在下图中,“P”是我们的生产者,“C”是我们的消费者。中间的框是队列 - RabbitMQ代表消费者的消息缓冲区。

image

2.1、添加RabbitMQ依赖

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

2.2、获取MQ的连接

public class ConnectionUtil {

  public static Connection getConnection() throws Exception {
    // 定义连接工厂
    ConnectionFactory factory = new ConnectionFactory();
    // 设置服务地址
    factory.setHost("localhost");
    // 端口
    factory.setPort(5672);
    // 设置账号信息,用户名、密码、vhost
    factory.setVirtualHost("/");
    factory.setUsername("rabbitmq");
    factory.setPassword("rabbitmq");
    // 通过工程获取连接
    return factory.newConnection();
  }
}

2.3、创建一个生产者发送消息到消息队列

public class Producer {

  private final static String QUEUE_NAME = "simple_queue";

  public static void main(String[] argv) throws Exception {
    // 获取到连接以及mq通道
    Connection connection = ConnectionUtil.getConnection();
    // 从连接中创建通道
    Channel channel = connection.createChannel();
    // 声明(创建)队列
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    // 消息内容
    String message = "Hello World!";
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    // 关闭通道和连接
    channel.close();
    connection.close();
  }
}

2.3.1、通过管理界面查看消息

点击上面的队列名称,查询具体的队列中的信息:

2.4、消费者从队列获取消息

public class Receiver {

  private final static String QUEUE_NAME = "simple_queue";

  public static void main(String[] argv) throws Exception {
    // 获取到连接以及mq通道
    Connection connection = ConnectionUtil.getConnection();
    Channel channel = connection.createChannel();
    // 声明队列
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    // 定义队列的消费者
    QueueingConsumer consumer = new QueueingConsumer(channel);
    // 监听队列
    channel.basicConsume(QUEUE_NAME, true, consumer);
    // 获取消息
    while (true) {
      QueueingConsumer.Delivery delivery = consumer.nextDelivery();
      String message = new String(delivery.getBody());
      if (message != null) {
        System.out.println("Received Msg:" + message);
        break;
      }
    }
  }
}

2.5、接收消息

运行消费者,可以看到控制台有消息输出:

再次通过管理界面,可以看到simple_queue的队列已经没有消息需要接收了。

源代码地址:https://gitee.com/chengab/RabbitMQ 

猜你喜欢

转载自blog.csdn.net/Anbang713/article/details/82873048