RabbitMQ入门教程:Hello World

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ入门教程:Hello World相关的知识,希望对你有一定的参考价值。

  • 原文:RabbitMQ入门教程(三):Hello World

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/vbirdbest/article/details/78583480
    分享一个朋友的人工智能教程(请以“右键”->"在新标签页中打开连接”的方式访问)。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。

    Hello World示例功能简介

    功能描述:生产者将消息发送到队列(队列的名字为hello)中,消费者从队列中获取消息。

    技术图片

    一:生产者

    首先引入RabbitMQ的Java客户端依赖

    <dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>amqp-client</artifactId>
      <version>5.0.0</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    @Test
    public void testBasicPublish() throws IOException, TimeoutException {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(AMQP.PROTOCOL.PORT);    // 5672
        factory.setUsername("mengday");
        factory.setPassword("mengday");
    
        // 新建一个长连接
        Connection connection = factory.newConnection();
    
        // 创建一个通道(一个轻量级的连接)
        Channel channel = connection.createChannel();
    
        // 声明一个队列
        String QUEUE_NAME = "heelo";
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    
        // 发送消息到队列中
        String message = "Hello RabbitMQ!";
        // 注意:exchange如果不需要写成空字符串,routingKey和队列名称保持一致
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
        System.out.println("Producer Send a message:" + message);
    
        // 关闭资源
        channel.close();
        connection.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    二:消费者

    @Test
    public void testBasicConsumer() throws Exception{
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(AMQP.PROTOCOL.PORT);    // 5672
        factory.setUsername("mengday");
        factory.setPassword("mengday");
    
        // 新建一个长连接
        Connection connection = factory.newConnection();
    
        // 创建一个通道(一个轻量级的连接)
        Channel channel = connection.createChannel();
    
        // 声明一个队列
        String QUEUE_NAME = "hello";
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println("Consumer Wating Receive Message");
    
        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(" [C] Received ‘" + message + "‘");
            }
        };
    
        // 订阅消息
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    三:运行结果

    1. 运行发布消息的方法,可以看到在RabbitMQ Management —> Queues 中会有自己声明的队列,Total代表消息的总条数,现在有1条消息
      技术图片

    2. 运行消费者,消费者获取到了一条消息,并且RabbitMQ Management中的对应的队列的消息总条数为0

    技术图片

    技术图片

    四: Hello World示例解释

    • 关于用户名和密码:用户名和密码可以在RabbitMQ Management平台上的Admin菜单下创建,也可以通过rabbitmqctl命令行来创建

    • 关于队列声明queueDeclare的参数:第一个参数表示队列名称、第二个参数为是否持久化(true表示是,队列将在服务器重启时生存)、第三个参数为是否是独占队列(创建者可以使用的私有队列,断开后自动删除)、第四个参数为当所有消费者客户端连接断开时是否自动删除队列、第五个参数为队列的其他参数

    • 关于basicConsume的第二个参数autoAck: 应答模式,true:自动应答,即消费者获取到消息,该消息就会从队列中删除掉,false:手动应答,当从队列中取出消息后,需要程序员手动调用方法应答,如果没有应答,该消息还会再放进队列中,就会出现该消息一直没有被消费掉的现象

    • 系统会为每个队列都隐式的绑定一个默认的交换机,交换机的名称为“(AMQP default)",类型为直连接direct,当你手动创建一个队列时,后台会自动将这个队列绑定到一个名称为空的Direct类型交换机上,绑定路由名称与队列名称相同,相当于channel.queueBind(queue:“QUEUE_NAME”, exchange:"(AMQP default)", routingKey:“QUEUE_NAME”); 所以hello world示例虽然没有显示声明交换机,当路由键和队列名称一样时就将消息发送到这个默认的交换机里。有了这个默认的交换机和绑定,我们就可以像其他轻量级的队列,如Redis那样,直接操作队列来处理消息。不过理论上是可以的,但实际上在RabbitMQ里直接操作是不可取的。消息始终都是先发送到交换机,由交换级经过路由传送给队列,消费者再从队列中获取消息的。不过由于这个默认交换机和路由的关系,使我们只关心队列这一层即可,这个比较适合做一些简单的应用,毕竟没有发挥RabbitMQ的最大功能(RabbitMQ可以重量级消息队列),如果都用这种方式去使用的话就真是杀鸡用宰牛刀了。

    The default exchange is implicitly bound to every queue, with a routing key equal to the queue name. It is not possible to explicitly bind to, or unbind from the default exchange. It also cannot be deleted.默认交换机隐式绑定到每个队列,其中路由键等于队列名称。不可能显式绑定到,或从缺省交换中解除绑定。它也不能被删除。

    技术图片


    分享一个朋友的人工智能教程(请以“右键”->"在新标签页中打开连接”的方式访问)。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。

    我的微信公众号:

    技术图片

以上是关于RabbitMQ入门教程:Hello World的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ 入门教程(PHP版) 第一部分:Hello World

RabbitMq学习一入门篇(hello world)

RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World

RabbitMQ中文文档PHP版本--打印Hello World

03-RabbitMQ-Hello world

消息队列RabbitMQ核心:简单(Hello World)模式队列(Work Queues)模式发布确认模式