RabbitMQ-简单模式(HelloWorld模式)

查阅官方文档可以了解到简单模式:

RabbitMQ 是一个消息代理:它接受并转发消息。 你可以把它想象成一个邮局:当你把你想要邮寄的邮件放在邮箱里时, 您可以确定,邮递员最终会将邮件递送给您的收件人。 在这个类比中,RabbitMQ是一个邮政信箱,一个邮局和一个信件载体。RabbitMQ和邮局的主要区别在于它不处理纸张, 相反,它接受、存储和转发数据的二进制 blob - 消息

 生产只意味着发送。 发送消息的程序是生产者

队列是 RabbitMQ 中邮箱的名称。 尽管消息流经 RabbitMQ 和您的应用程序,但它们只能存储在队列中。 队列仅受主机内存和磁盘限制的约束,它本质上是一个大型消息缓冲区。 许多生产者可以发送到一个队列的消息,许多使用者可以尝试从一个队列接收数据。 这就是我们表示队列的方式:

 

 消费与接受的含义相似。 使用者是一个主要等待接收消息的程序:

 通过java来演示rabbitmq的生产者类:

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


public class Producer {
    public static final String QUEUE_NAME = "hello-queue";

    public static void main(String[] args) {
        try{
            //创建工厂
            ConnectionFactory connectionFactory = new ConnectionFactory();
            //设置连接参数
            connectionFactory.setHost("192.168.186.140");
            connectionFactory.setPort(5672);
            connectionFactory.setVirtualHost("/");
            connectionFactory.setUsername("admin");
            connectionFactory.setPassword("admin");

            Channel channel = connectionFactory.newConnection().createChannel();
            //参数:队列名称QUEUE_NAME,是否持久化,是否独占连接,是否自动删除,其他参数
            channel.queueDeclare(QUEUE_NAME,true,false,true,null);
            //发送的消息
            String message = "Hello c b z!";
            /**
             *  参数1:使用交换机的名称(不填写就是使用默认的交换机)
             *  参数2:队列名称QUEUE_NAME
             *  参数3:其他参数
             *  参数4:发送的消息
             */
            channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
            System.out.println("消息已发送!");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("消息发送失败!");
        }

    }
}

channel.basicPublish 方法是 RabbitMQ Java 客户端库中用于发送消息到队列的方法。使用了空字符串 "" 作为交换机名称,表示消息将会直接发送到名为 "hello-queue" 的队列中,而不经过交换机的路由。实际上通过这一步表示是使用了简单模式HelloWorld管理!

点击运行:

此时,我们看看web的管理界面:

 

 D表示持久化 正在准备的状态!如果再运行一次,Total就会变成2,且队列就是先进先出

接下来就是消费者(接收者)

使用 DeliverCallback 接口来缓冲服务器推送给我们的消息。

package com.cbz.rabbitmq.helloword;
import com.rabbitmq.client.*;
import java.nio.charset.StandardCharsets;

public class Consumer {
    public static final String QUEUE_NAME = "hello-queue";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.186.140");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");
        factory.setPassword("admin");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
            System.out.println(" 你的消息是 :'" + message + "'");
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
    }
}

我们为什么不使用 try-with-resource 语句来自动关闭 通道和连接?通过这样做,我们将简单地制作程序继续前进,关闭所有内容,然后退出!这会很尴尬,因为我们希望这个过程在消费者倾听时保持异步方式使消息到达。

我们即将告诉服务器将消息从队列。由于它将异步推送消息,因此我们提供了一个 对象形式的回调,将缓冲消息,直到 我们已准备好使用它们。这就是 DeliverCallback 子类的作用。

运行之后:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值