美文网首页Java学习笔记
RabbitMQ入门-从HelloWorld开始

RabbitMQ入门-从HelloWorld开始

作者: Jackie_Zheng | 来源:发表于2017-08-02 21:53 被阅读537次

    从读者的反馈谈RabbitMQ

    昨天发完《RabbitMQ入门-初识RabbitMQ》,我陆陆续续收到一些反馈。鉴于部分读者希望结合实例来讲

    期待下篇详细,最好结合案例。谢谢!
    哪都好,唯一缺点就是不支持原生ha,配置起来太复杂
    ...
    

    上篇主要介绍了什么RabbitMQ,RabbitMQ能用来做什么,一些有关RabbitMQ的基本概念,同时还简单介绍了两种RabbitMQ的分发消息的模型。
    从这篇起,我们将改变原来的思路,针对每种模型详细讲解,并结合代码实例了解各个模型的原理和使用场景。
    Hello World模型

    1helloworld类型.png

    上篇已经简单介绍过

    • 该模型由三要素组成:P(Producer)、Q(Queue)和C(Consumer)

    • P负责发送消息,Q负责存储消息,C负责消费消息

    • 消息可以在RabbitMQ或者你的应用中传递流动,但是却只能存储在Queue中

    • Queue可以接受多个发送者发送来的消息,也可以供多个消费者消费

    实例

    ###准备工作

    首先需要本地或者远程有一个RabbitMQ的服务,具体安装搭建可以网上找资料,类似于一个tomcat服务器

    添加Jar包,推荐使用Maven管理jar包的方式,只需要添加依赖到pom.xml文件中就ok

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

    发送端

    package com.ximalaya.openapi.rabbitmq.helloworld;
    
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    import java.util.concurrent.TimeoutException;
    
    /**
     * Created by jackie on 17/8/2.
     */
    public class Send {
        private final static String QUEUE_NAME = "hello.august";
    
        public static void main(String[] argv)
                throws java.io.IOException, TimeoutException {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost("192.168.3.161");
    
            Connection connection = connectionFactory.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("send message: " + message);
    
            channel.close();
            connection.close();
        }
    }
    
    
    • 首先创建一个ConnectFactory,并指定服务所在的ip地址,如果你的RabbitMQ启在本机,那setHost就可以写成setHost("localhost")

    • 从连接工厂中拿到一个连接并创建一个Channel

    • 再声明一个队列Queue,表示消息要发到哪个Queue里面

    • 定义要发送的消息message,并通过basicPublish进行消息发送

    • 最后关闭Channel和Connection的连接

    运行这段代码后,我们可以看到在Queue(hello.august)中已经有了一个message,说明消息已经发送到Queue上了。

    image.png

    注意这是RabbitMQ的管理界面,我们可以通过这个管理应用,查看这个message的详细信息,在该页面底部有一个Get message的选项,点击我们可以得到刚刚发送的消息的详情

    image.png

    接收端

    package com.ximalaya.openapi.rabbitmq.helloworld;
    
    import com.rabbitmq.client.*;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    /**
     * Created by jackie on 17/8/2.
     */
    public class Recv {
        private final static String QUEUE_NAME = "hello.august";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost("192.168.3.161");
            Connection connection = connectionFactory.newConnection();
    
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    
            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);
        }
    }
    
    

    大部分代码和发送端相同,在最后有一个Consumer,其主要用于监听指定ip的RabbitMQ服务上,指定的Queue上的消息。一旦发现有消息,则进行消费。
    有一点需要注意,接收端同样声明了一个Queue,这是为什么呢?因为完全会出现一种情况,就是发送端还没有启动,但是接收端已经启动了,这时候要监听消息需要确保Queue已经存在。经过自己测试发现,如果这个Queue不存在则会创建一个同名的Queue,如果已经存在则使用存在的Queue。
    这里将接收端的Queue name改为“hello11111”,运行前我们进入管理应用发现没有这个Queue

    image.png

    当运行完接收端的程序后,我们再次查找名为”hello11111”的Queue,就已经存在了

    image.png

    我们把接收端的Queue名称改为与发送端一致,这时候运行程序,我们看下面的动态图片

    image.png

    可以发现Queue中存储的消息有1变为0,即被消费者消费了。
    至此,我们了解了RabbitMQ中的Hello World的模型。
    如果您觉得阅读本文对您有帮助,请点一下“喜欢”按钮,您的“喜欢”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

    相关文章

      网友评论

        本文标题:RabbitMQ入门-从HelloWorld开始

        本文链接:https://www.haomeiwen.com/subject/fpoylxtx.html