1、Rabbitmq hello world

这里写图片描述

RabbitMQ 是一个消息 broker:它接受和转发消息。你可以把它想象成一个邮局:当你把你想要发布的邮件放在一个邮筒里时,你可以确定邮差先生最终会把邮件交给你的收件人。在这个类比中,RabbitMQ 是一个邮筒、一个邮局和一个邮递员。

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

1、概念及准备

RabbitMQ 和消息传递 通常使用一些术语。

生产的意思就是发送。一个发送消息的程序是一个 producer (生产者):

这里写图片描述

queue (队列)是位于 RabbitMQ 内的一个邮筒的名称。尽管消息通过 RabbitMQ 和你的应用程序传递,但它们只能存储在队列中。队列只受主机的内存和磁盘限制的限制,它本质上是一个大的消息缓冲区。许多生产者可以发送到一个队列的消息,许多消费者可以尝试从一个队列接收数据。这就是我们对队列的定义:

这里写图片描述

消费对接收也有类似的含义。consumer (消费者)是一个主要等待接收消息的程序:

这里写图片描述

在本教程的这一部分中,我们将在Java中编写两个程序;一个发送单一消息的生产者,以及一个接收消息并将其打印出来的消费者。我们将对Java API中的一些细节进行注释,将重点放在这个非常简单的事情上,以便开始。这是一个信息传递的“Hello World”。

扫描二维码关注公众号,回复: 8581932 查看本文章

在下面的图表中,“P”是我们的生产者,而“C”是我们的消费者。中间的盒子是一个队列 —— RabbitMQ 代表消费者保存的消息缓冲区。

这里写图片描述

Java客户端库

RabbitMQ讲多种协议。本教程使用AMQP 0-9-1,这是一种开放的、通用的消息传递协议。在许多不同的语言中,RabbitMQ 有许多客户端。我们将使用 RabbitMQ 提供的 Java 客户端。
下载客户端库及其依赖项(SLF4J API和 SLF4J Simple)。将这些文件复制到您的工作目录中,沿着教程的 Java 文件。
请注意 SLF4J Simple对于教程来说已经足够了,但是您应该使用一个成熟的日志库,就像在生产中使用 Logback 一样。
(RabbitMQ Java客户端也在中央Maven存储库中,使用 groupIdcom.rabbitmqartifactIdamqp-client。)

2、发送消息

现在我们有了Java 客户端以及它的依赖项,我们可以编写一些代码。

Sending

这里写图片描述

我们将调用我们的消息发布者(发送者)发送和我们的消息使用者(接收器)Recv。消息发布者将连接到 RabbitMQ,发送一条消息,然后退出。

Send.java

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

public class Send {

    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.75.131");
        factory.setPort(5672);
        factory.setUsername("carl");
        factory.setPassword("198918");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        String message = "Hello World!";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");
        channel.close();
        connection.close();
    }

}

上面的 import 就是我们之前所需要依赖的 rabbitmq-client.

  • 首先,我们为这个队列命名,在这里我们命名队列名称为 hello
  • 然后我们需要创建一个 connection(连接)用于连接 rabbitmq-server.连接抽象了套接字连接,并负责协议版本的协商和认证,等等。在这里,我们连接到自己安装的 rabbitmq 服务地址与用户名称/密码。如果我们想要连接到另一台机器上的代理,我们只需在这里指定它的名称或IP地址。
  • 接下来,我们创建一个 channel(通道),这是大多数用于完成任务的 API 所在。
  • 为了发送消息,我们必须声明一个队列供我们发送;然后我们可以向队列发布一条消息:声明队列是幂等的 —— 只有在它不存在的情况下才会创建。消息内容是一个字节数组,所以你可以对任何您喜欢的内容进行编码。
  • 最后,我们关闭通道和连接;

注意:有可能发送无效

如果这是你第一次使用 RabbitMQ,而你没有看到“发送”的信息,那么你可能会感到困惑,想知道什么可能是错的。也许 Broke 是在没有足够的空闲磁盘空间的情况下启动的(默认情况下它至少需要200 MB),因此拒绝接受消息。检查代理日志文件,以确认并减少必要的限制。配置文件文档将向您展示如何设置 disk_free_limit

3、接收消息

我们的消费者是从 RabbitMQ 推送消息的,所以不像发布一条消息的发布者,我们会让它运行来监听消息并将其打印出来。

Receiving

这里写图片描述

Recv.java

public class Recv {

    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.75.131");
        factory.setPort(5672);
        factory.setUsername("carl");
        factory.setPassword("198918");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body)
                    throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println(" [x] Received '" + message + "'");
            }
        };
        channel.basicConsume(QUEUE_NAME, true, consumer);

    }
}

消息接收者的代码和消息发送者的代码类似,它同样是依赖于 rabbitmq-client 。额外的 DefaultConsumer 是一个实现消费者界面的类,我们将使用它来缓冲服务器推送给我们的消息。

设置与消息发送方是一样的;我们打开一个连接和一个通道,并声明我们将要消费的队列。注意,这个队列名称需要与发送发布到的队列相匹配。

注意,我们也在这里声明队列。因为我们可能会在发布者之前启动消费者,所以在尝试使用它之前,我们希望确保队列的存在。

我们将告诉服务器从队列中传递消息。因为它会异步地推送我们的消息,所以我们提供了一个回调,它的形式是一个对象,它将缓冲这些消息,直到我们准备好使用它们为止。这就是 DefaultConsumer 子类所做的。

4、运行

运行 Send.java 发送消息到 Rabbitmq 服务器,在控制面板打印以下日志:

Connected to the target VM, address: '127.0.0.1:65511', transport: 'socket'
 [x] Sent 'Hello World!'
Disconnected from the target VM, address: '127.0.0.1:65511', transport: 'socket'

Process finished with exit code 0

可以在 rabbitmq 控制面板看到,有一条消息准备好了:

这里写图片描述

然后启动 Recv.java,就会在控制台打印出 Provider 也就是 Send.java 发送的消息。

Connected to the target VM, address: '127.0.0.1:49238', transport: 'socket'
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received 'Hello World!'

同样我们也可以在 rabbitmq-admin 看到这条消息被消费:

这里写图片描述

发布了173 篇原创文章 · 获赞 221 · 访问量 70万+

猜你喜欢

转载自blog.csdn.net/u012410733/article/details/81586243