zoukankan      html  css  js  c++  java
  • 轻松搞定RabbitMQ(一)——RabbitMQ基础知识+HelloWorld

     转自 http://blog.csdn.net/xiaoxian8023/article/details/48679609

     本文是简单介绍一下RabbitMQ,参考官网上的教程。同时加入了一些自己的理解。官网教程详见:"Hello World!"


    引言


           你是否遇到过多个系统间需要通过定时任务来同步某些数据?

           你是否在为异构系统的不同进程间相互调用、通讯的问题而苦恼、挣扎?

           如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题。消息服务擅长于解决多系统、异构系统间的数据交换(消息通知/通讯)问题。


           本文将要介绍的RabbitMQ就是当前最主流的消息中间件之一。


    RabbitMQ简介


           MQ(Message Queue,消息队列)是一种应用系统之间的通信方法。是通过读写出入队列的消息来通信(RPC则是通过直接调用彼此来通信的)。

           AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
    AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

           RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。


           下面通过生产者代码来解释一下RabbitMQ中涉及到的概念。

    [java] view plain copy
     
    1. public class MsgSender {  
    2.     private final static String QUEUE_NAME = "hello";  
    3.   
    4.     public static void main(String[] args) throws IOException {  
    5.         /** 
    6.          * 创建连接连接到MabbitMQ 
    7.          */  
    8.         ConnectionFactory factory = new ConnectionFactory();  
    9.         // 设置MabbitMQ所在主机ip或者主机名  
    10.         factory.setHost("127.0.0.1");  
    11.         // 创建一个连接  
    12.         Connection connection = factory.newConnection();  
    13.         // 创建一个频道  
    14.         Channel channel = connection.createChannel();  
    15.         // 指定一个队列  
    16.         channel.queueDeclare(QUEUE_NAME, false, false, false, null);  
    17.         // 发送的消息  
    18.         String message = "hello world!龙轩";  
    19.         // 往队列中发出一条消息  
    20.         channel.basicPublish("", QUEUE_NAME, null, message.getBytes());  
    21.         System.out.println(" [x] Sent '" + message + "'");  
    22.         // 关闭频道和连接  
    23.         channel.close();  
    24.         connection.close();  
    25.     }  
    26. }  

    ConnectionFactory、Connection、Channel

           ConnectionFactory、Connection、Channel,这三个都是RabbitMQ对外提供的API中最基本的对象。不管是服务器端还是客户端都会首先创建这三类对象。
           ConnectionFactory为Connection的制造工厂。

           Connection是与RabbitMQ服务器的socket链接,它封装了socket协议及身份验证相关部分逻辑。

           Channel是我们与RabbitMQ打交道的最重要的一个接口,大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。

    Queue

           Queue(队列)是RabbitMQ的内部对象,用于存储消息,用下图表示。

           RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费。

           队列是有Channel声明的,而且这个操作是幂等的。同名的队列多次声明也只会创建一次。我们发送消息就是想这个声明的队列里发送消息。


           看一下消费者的代码:

    [java] view plain copy
     
    1. public class MsgReceiver {  
    2.     private final static String QUEUE_NAME = "hello";  
    3.   
    4.     public static void main(String[] argv) throws IOException, InterruptedException {  
    5.         ConnectionFactory factory = new ConnectionFactory();  
    6.         factory.setHost("127.0.0.1");  
    7.         // 打开连接和创建频道,与发送端一样  
    8.         Connection connection = factory.newConnection();  
    9.         Channel channel = connection.createChannel();  
    10.   
    11.         // 声明队列,主要为了防止消息接收者先运行此程序,队列还不存在时创建队列。  
    12.         channel.queueDeclare(QUEUE_NAME, false, false, false, null);  
    13.         // 创建队列消费者  
    14.         QueueingConsumer consumer = new QueueingConsumer(channel);  
    15.         System.out.println(" [*] Waiting for messages. To exit press CTRL+C");  
    16.         // 指定消费队列  
    17.         channel.basicConsume(QUEUE_NAME, true, consumer);  
    18.         while (true) {  
    19.             // nextDelivery是一个阻塞方法(内部实现其实是阻塞队列的take方法)  
    20.             QueueingConsumer.Delivery delivery = consumer.nextDelivery();  
    21.             String message = new String(delivery.getBody());  
    22.             System.out.println(" [x] Received '" + message + "'");  
    23.         }  
    24.     }  
    25. }  

           从上述代码中,我们可以看到ConnectionFactory、Connection、Channel这三个对象都还是会创建。而队列在消费者这里又声明了一遍。这是为了防止先启动消费者,当为消费者指定队列时,如果RabbitMQ服务器上未声明过队列,就会抛出IO异常。

    QueueingConsumer

           队列消费者,用于监听队列中的消息。调用nextDelivery方法时,内部实现就是调用队列的take方法。该方法的作用:获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。说白了就是如果没有消息,就处于阻塞状态。


           运行结果如下:(生产者、消费者谁先运行都可以)


  • 相关阅读:
    Docker----mysql数据持久化
    Docker-----容器数据卷
    Docker-----制造自己的镜像
    Docker----常用命令(镜像和容器的常用命令)
    Docker----阿里云镜像加速
    Docker概述
    com.aliyuncs.exceptions.ClientException: InvalidVersion : Specified parameter Version is not valid.
    夜神模拟器的使用踩坑--adb devices无法连接设备
    python利用smtplib模块发送邮件
    appium环境安装说明
  • 原文地址:https://www.cnblogs.com/Damon-Luo/p/7833498.html
Copyright © 2011-2022 走看看