RabbitMQ:快速入门hello word

封面.jpg

1、相关概念

RabbitMQ是一个消息代理,事实上,它接收生产者产生的消息,然后将消息传递给消费者。在这个过程中,它可以路由,可以缓冲,或者更具你设定的规则来将消息持久化。RabbitMQ和消息传输过程中一般会用一些术语:

  • 生产者(Producing):

意思无非是指发送消息的那一端,如果一个程序发送消息,那么它就将被称为生产者,这里用大写的P来表示。

image
  • 队列(queue):

相当于邮箱的名字,它活动在RabbitMQ服务器里边。虽然消息流会通过RabbitMQ和你的应用程序,但是只会被存储在队列中。队列是不受任何限制的,它可以尽可能多的去存储你需要存储的消息(本质上来说它是个无限缓冲)。可以多个生产者向同一个消息队列发送消息,也可以多个消费者同时从一个消息队列中来接收消息。消息队列可以如下图模型。

image
  • 消费者(Consuming):

即接收端,消费者主要是等待接收消息的程序,用下图表示:

image

注意:在大多数应用场景中,生产者、消费者以及RabbitMQ服务是不会同时运行在一台机器上的。

下边将会实现两个Java程序,一个只发送生产者一条消息的生产者,一个接收消息、并打印消息的消费者。

在下边的对话中,”P”是我们的生产者,”C”是我们的消费者,中间的是矩形是队列(BabbitMQ维护的消息缓冲)

image

2、pom引入RabbitMQ的包

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

3、生产者(发送端)

image.png

我们将消息发送器起名为Send,消息接收器起名为Recv。发送器将会连接RabbitMQ,发送一条消息,然后退出。

package com.hrabbit.rabbitmq.send;

import com.hrabbit.rabbitmq.utils.ConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Auther: hrabbit
 * @Date: 2018-06-21 上午10:01
 * @Description:
 */
public class Send {

    private static final String QUEUE_NAME="queue_hrabbit";

    public static void main(String[] args) throws IOException, TimeoutException {

        String message="hello word!";
        //获取连接
        Connection connection = ConnectionUtils.getConnection();
        //创建通道,为了发送消息,你必须要声明一个消息消息队列,然后向该队列里推送消息
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //发送消息
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes());

        channel.close();

        connection.close();
    }
}

4、消费者(接收端)

RabbitMQ会往接收器上推消息,与只发送一条消息的发送端不同,这里我们将监听消息并将消息打印出来。

image
package com.hrabbit.rabbitmq.recover;

import com.hrabbit.rabbitmq.utils.ConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Auther: hrabbit
 * @Date: 2018-06-21 上午10:45
 * @Description:
 */
public class Recover {

    private static final String QUEUE_NAME="queue_hrabbit";

    public static void main(String[] args) throws IOException, TimeoutException {

        //获取connection连接
        Connection connection = ConnectionUtils.getConnection();
        //创建通道,你必须要声明一个消息消息队列,然后向该队列里推送消息
        Channel channel = connection.createChannel();

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

        //在低版本中,new QueueingConsumer();的方式,但是这种方式已经被废弃了,不建议使用
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                String msg = new String(body, "utf-8");
                System.out.println("msg:"+msg);
            }
        };

        channel.basicConsume(QUEUE_NAME,defaultConsumer);
    }
}

5、工具类(获取Connection)

package com.hrabbit.rabbitmq.utils;

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

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Auther: hrabbit
 * @Date: 2018-06-21 上午9:58
 * @Description:
 */
public class ConnectionUtils {

    /**
     * 获取connection
     * @return
     * @throws IOException
     * @throws TimeoutException
     */
    public static Connection getConnection() throws IOException, TimeoutException {
        //创建connection工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置ip
        factory.setHost("127.0.0.1");
        //设置端口号
        factory.setPort(5672);
        //设置用户名称
        factory.setUsername("hrabbit");
        //设置密码
        factory.setPassword("123");
        //设置vhost
        factory.setVirtualHost("/hrabbit");
        return factory.newConnection();
    }
}

5、测试结果

5.1 首先运行Send,将消息发送到RabbitMQ
image.png
5.2 运行消费者,获取消息
image.png

系列文章:

RabbitMQ:RabbitMQ-理论基础
RabbitMQ:RabbitMQ:work queues 工作队列(Round-robin/Fair dispatch)
RabbitMQ:RabbitMQ:消息应答与消息持久化
RabbitMQ:发布/订阅 Publish/Subscribe
RabbitMQ:路由Routing
RabbitMQ:Topic类型的exchange
RabbitMQ:RabbitMQ之消息确认机制(事务+Confirm)
RabbitMQ:spring整合RabbitMQ

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,415评论 2 34
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981阅读 16,033评论 2 11
  • 1.引言 RabbitMQ——Rabbit Message Queue的简写,但不能仅仅理解其为消息队列,消息代理...
    圣杰阅读 2,130评论 3 39
  • #!/bin/bash b='' for ((i=1;i<=100;i++)) do printf "Proc...
    啾咪啾啾酱阅读 1,363评论 0 0