RabbitMQ初探(Java版)

原创 2017年01月03日 21:22:40

一、RabbitMQ 简介——用Erlang实现的一个高并发高可靠AMQP消息队列服务器
AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列和路由,可靠且安全。RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 Ajax。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ 中有一些概念需要我们在使用前先搞清楚,主要包括以下几个:Broker、Exchange、Queue、Binding、Routingkey、Producter、Consumer、Channel。
1.Broker
简单来说就是消息队列服务器的实体。
2.Exchange
接收消息,转发消息到绑定的队列上,指定消息按什么规则,路由到哪个队列。
3.Queue
消息队列载体,用来存储消息,相同属性的 queue 可以重复定义,每个消息都会被投入到一个或多个队列。
4.Binding
绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来。
5.RoutingKey
路由关键字,Exchange 根据这个关键字进行消息投递。
6.Producter
消息生产者,产生消息的程序。
7.Consumer
消息消费者,接收消息的程序。
8.Channel
消息通道,在客户端的每个连接里可建立多个 Channel,每个 channel 代表一个会话。

二、RabbitMQ服务安装

  1. RabbitMQ的运行需要erlang的支持,因此先下载并安装erlang。
  2. 前面我们也讲到RabbitMQ就是一个消息服务器,所以需要安装对应服务端。下载地址:https://www.rabbitmq.com/download.html
  3. 安装好之后需要启动服务:点击开始菜单,搜索RabbitMQ Command Prompt,打开RabbitMQ命令行输入:rabbitmq-server start,如果在这之前已经启动,则会显示:

这里写图片描述

4.验证是否启动成功:此时我们可能通过 Web 浏览器来查看 RabbitMQ 的运行状态,浏览器中输入 http://{server_ip}:15672,用 guest/guest 默认的用户和密码登录后即可查看 RabbitMQ 的运行状态。

三、Demo

生产消息任务:


public class Task {

    // 队列名称
    private final static String QUEUE_NAME = "workqueue";

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

        // 创建连接和频道
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        // 指定用户名和密码
        factory.setUsername("zhangsan");
        factory.setPassword("123");
        // 指定端口
        factory.setPort(AMQP.PROTOCOL.PORT);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        boolean durable = true;// 设置消息持久化 RabbitMQ不允许使用不同的参数重新定义一个队列,所以已经存在的队列,我们无法修改其属性
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, durable, false, false, null);

        // 发送10条消息,依次在消息后面附加1-10个点
        for (int i=10; i>0; i--) {
            String dots="";
            for (int j=0; j<=i; j++) {
                dots += ".";
            }
            String message = "hello world" + dots + dots.length();
            // MessageProperties.PERSISTENT_TEXT_PLAIN 标识我们的信息为持久化的
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println("Sent Message: '" + message + "'");
        }

        //关闭频道和资源
        channel.close();
        connection.close();

    }
}

消费消息任务:


public class Work {

    private final static String QUEUE_NAME = "workqueue";

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

        //区分不同工作进程的输出
        int hashCode = Work.class.hashCode();
        //创建连接和频道
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        //指定用户名和密码
        factory.setUsername("zhangsan");
        factory.setPassword("123");
        //指定端口
        factory.setPort(AMQP.PROTOCOL.PORT);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        boolean durable = true;
        // 声明队列
        channel.queueDeclare(QUEUE_NAME,durable,false,false,null);

        QueueingConsumer consumer = new QueueingConsumer(channel);

        boolean ack = false;// 打开应答机制
        // 指定消费队列
        channel.basicConsume(QUEUE_NAME, ack, consumer);

        // 公平转发 设置最大服务转发消息数量  只有在消费者空闲的时候会发送下一条信息
        int prefetchCount = 1;
        channel.basicQos(prefetchCount);

        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());

            System.out.println(hashCode + "Received Message: '" + message + "'");
            doWork(message);
            System.out.println(hashCode + "Received Done");
            // 发送应答
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

        }

    }

    /**
     * 每个点耗时1s
     * @param message
     * @throws InterruptedException 
     */
    private static void doWork(String msg) throws InterruptedException {
        for (char ch : msg.toCharArray()) {
            if (ch == '.') {
                Thread.sleep(1000);
            }
        }
    }
}

四、演示

  1. 发送消息

    这里写图片描述

  2. 接收消息

这里写图片描述

参考文章:
1. https://www.ibm.com/developerworks/cn/opensource/os-cn-rabbit-mq/
2. http://blog.csdn.net/u013142781/article/details/50487028
3. http://blog.csdn.net/zhu_tianwei/article/details/40887717

版权声明:本文为博主原创文章,未经博主允许不得转载。

RabbitMQ 之 RPC 初探(Java)

什么是RPC?       RPC是远程过程调用(Remote Procedure Call),大致流程是这样的, server进入等待client消息状态client发起远程过程调用,并进入...
  • qq1052441272
  • qq1052441272
  • 2017年02月07日 11:13
  • 702

RabbitMQ-C初探

http://blog.csdn.net/cnhome/article/details/9222833   RabbitMQ着实是个好东西,当然了也有对C语言client开发的支持。例子和文档少的可...
  • amd123linux
  • amd123linux
  • 2013年09月16日 09:41
  • 903

RabbitMQ官方中文入门教程(PHP版) 第四部分:路由(Routing)

路由(Routing) 在前面的教程中,我们实现了一个简单的日志系统。可以把日志消息广播给多个接收者。 本篇教程中我们打算新增一个功能——使得它能够只订阅消息的一个字集。例如,我们只需要把严重的错...
  • alexdream
  • alexdream
  • 2015年01月27日 20:35
  • 1281

RabbitMQ初探-JAVA

简单的RabbitMQ搭建及使用
  • jinzhencs
  • jinzhencs
  • 2016年04月11日 13:37
  • 359

RabbitMQ初探

RabbitMQ安装、配置 1、http://blog.csdn.net/sharetop/article/details/49716897 2、http://blog.csdn.net/...
  • long690276759
  • long690276759
  • 2016年11月29日 11:13
  • 169

rabbitmq初探

AMQP协议 AMQP 有四个非常重要的概念:虚拟机(virtual host),交换机(exchange),队列(queue)和绑定(binding)。 虚拟机: 通常是应用的外在边界,我们可...
  • oMiconlee
  • oMiconlee
  • 2016年11月30日 14:17
  • 513

RabbitMQ java API中文翻译

java客户端api指导本指导覆盖了java客户端api,它不仅仅是一个教程,在不同的部分都是可用的。 此java客户端得到了下面三方的许可 Apache Public License 2.0 Mo...
  • haohao123nana
  • haohao123nana
  • 2016年06月27日 12:42
  • 3154

RabbitMQ与java、Spring结合实例详细讲解

本文介绍了rabbitMq,并以RabbitMQ与java、Spring结合的两个实例来演示如何使用RabbitMQ。还提供了如何在Ubuntu下安装RabbitMQ 服务的方法。...
  • Evankaka
  • Evankaka
  • 2016年01月20日 19:40
  • 11639

java 使用RabbitMQ示例

RabbitMQ简介RabbitMQ是一个受欢迎的消息代理,通常用于应用程序之间或者程序的不同组件之间通过消息来进行集成。具有高可用高并发的优点,适合集群服务器。采用 Erlang实现, 对主要的编程...
  • pony_maggie
  • pony_maggie
  • 2017年04月08日 20:49
  • 1981

rabbitmq的java调用实例

本文将介绍rabbitmq在用java进行调用的代码实现 一、添加maven依赖 com.rabbitmq amqp-client 4.1.0 二、消息生...
  • chinabestchina
  • chinabestchina
  • 2017年05月31日 22:10
  • 340
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RabbitMQ初探(Java版)
举报原因:
原因补充:

(最多只允许输入30个字)