【2】Hello World示例

介绍
RabbitMQ是作为一个消息代理中间件,其设计的目的很简单:收集消息然后转发消息。你可以把它当成一个邮局:当你发送邮件到邮箱时你肯定相信邮递员肯定会把这封邮件送到收件人手上。在这个比喻中,RabbitMQ实际充当了邮箱、邮局以及邮递员的角色。
与邮局最大的不同是,RabbitMQ它不处理纸张文件,而是负责接收,储存以及转发二进制数据message。
在详细介绍之前,我们首先了解一些RabbitMQ的术语:

  • 生产者:我们称用来发送消息的程序端为生产者,下面以图“P”表示:
  • 消息队列:消息队列存在RabbitMQ server端中;虽然消息流经你的应用程序和RabbitMQ server,但他们只可以储存在RabbitMQ server队列中。队列是不受任何限制的,它可以储存你发送的所有消息,因为本质上它就是一个无限缓冲区。可以多个生产者同时发送消息给一个队列,同时 也可以多个消费者从一个队列接收数据。以下图来表示消息队列:
  • 消费者:我们称大部分时间都在等待接收消息的程序端为消费者;以下图来表示消费者:
    ”Hello world“
    在本节我们将用java编写两个程序:一个生产者用来发送消息以及一个消费者用来接收消息并且打印出来。在实现过程中我们主要关注如何实现功能而对于java API的细节一笔带过。
    在下面这个图中,”P”代表生产者,”C”代表消费者,在中间的盒子表示队列(一个RabbitMQ用来保存消息的缓冲区)。


    基于java的客户端:
    RabbitMQ遵循AMQP协议(高级消息队列协议)–这是一个开放的、通用的消息协议。现在网上已存在很多基于的不同语言实现的AMQP客户端。在本例中我们使用java语言的客户端。maven引入如下:
                         <dependency>                <groupId>com.rabbitmq</groupId>                <artifactId>rabbitmq-client</artifactId>                <version>1.3.0</version>            </dependency>            
    
    

    生产者
    在这个例子中,我们分别以Send和Recv来表示生产者、消费者。Send主要用来连接RabbitMQ server及发送一个消息,之后退出。
    下面是Send.class实现:

    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.Channel;
    public class Send {
    
      private final static String QUEUE_NAME = "hello";
    
      public static void main(String[] argv)
          throws java.io.IOException {
        //--------------1--------------
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        //--------------2-----------------
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        String message = "Hello World!";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" [x] Sent ‘" + message + "‘");
        //---------------3----------------
        channel.close();
        connection.close();
      }
    }

    代码的第一部分主要创建一个与RabbitMQ服务器的连接,该链接抽象了socket操作,负责判断协议版本和身份认证等等。另外因为我们把消息 代理broker搭建在本地,所以连接的地址是localhost。如果你想连接到其他机器的代理broker,你可以指定它的域名或者IP地址。
    在第二部分,我们创建了一个通道;通道为我们提供了很多API用于完成消息的发送。比如,我们可以声明一个队列用来发送消息以及把消息发布到声明的队列。
    值得注意的是,声明一个队列是幂等的,只有在队列不存在的时候才创建。另外由于消息的内容是二进制的字节数组,所以收到数据后你可以编码成任意你需要的数据。
    最后,也就是第三部分,我们需要关掉通道channel以及连接。

    发送失败
    如果你是第一次使用RabbitMQ,那么当你没有看到发送的消息的时候,你可能会挠头到底想问题出在了哪呢?不要紧,有可能是broker(代理,以后 统称broker)没有足够的磁盘空间(默认情况下它至少需要1Gb的剩余空间)因此拒绝接收任何消息。你可以查看broker的日志文件来确认并且减少 一下限制。地址http://www.rabbitmq.com/configure.html#config-items里说明了如何设置 disk_free_limit.

    消费者
    下面实现我们的消费者,它主要用来持续监听RabbitMQ推送消息并且打印。
    下面是Recv.class的实现:

    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.QueueingConsumer;
    
    public class Recv {
    
      private final static String QUEUE_NAME = "hello";
    
      public static void main(String[] argv)
          throws java.io.IOException,
                 java.lang.InterruptedException {
        //-------------1-------------------
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
    
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
        //--------------2-------------------
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME, true, consumer);
    
        while (true) {
          QueueingConsumer.Delivery delivery = consumer.nextDelivery();
          String message = new String(delivery.getBody());
          System.out.println(" [x] Received ‘" + message + "‘");
        }
        }
    }

    QueueingConsumer类主要用来缓存RabbitMQ服务器推送的消息。
    建立Recv的过程跟send类似;首先创建一个到服务器的连接和一个通道channel(后面统一叫channel),以及定义一个我们将要消费的队列。注意队列必须与send的匹配,也就是名字要一样。
    在第一部分,我们声明了一个队列;另外由于我们可能在sender运行前启动了Recv,因此我们要确保在我们消费消息前队列已经存在。
    在第二部分中我们告诉服务器要把QUEUE_NAME队列中的消息推送给我们。因为服务器是异步推送消息给我们,因此我们需要提供一个回调对象QueueingConsumer来缓存消息直到被程序消费掉。
    QueueingConsumer.nextDelivery()会堵塞直到RabbitMQ服务器推送消息过来。

时间: 2024-12-05 19:16:39

【2】Hello World示例的相关文章

pfsense Web服务器负载平衡配置示例

在pfsense的网关和服务器中有两种类型的负载平衡功能.网关负载平衡可以通过多个WAN连接分发Internet绑定的流量.服务器负载平衡管理传入流量,因此它利用多个内部服务器进行负载分配和冗余,服务器负载平衡允许流量在多个内部服务器之间分配,它最常用于Web服务器和SMTP服务器.下面我们就以实例来介绍服务器负载平衡的设置. 下面介绍如何通过pfsense2.32配置Web服务器的负载平衡. 网络环境 服务器负载平衡示例网络环境 上图为示例网络环境.它由单个防火墙组成,使用其WAN IP地址池

docker深入2-API示例

2017/9/18 一.目的 演示 http API 使用的方式 注1:本次实例是在 docker swarm mode 下使用的,目的是:更新指定服务的镜像. 注2:要在 swarm manager node 上执行. docker 的 API 文档是自动生成的,没有太多有用的示例可用. [版本] ~]# docker version Client:  Version:      17.06.0-ce  API version:  1.30  Go version:   go1.8.3  Gi

Storm入门(四)WordCount示例

Storm API文档网址如下: http://storm.apache.org/releases/current/javadocs/index.html 一.关联代码 使用maven,代码如下. pom.xml  和Storm入门(三)HelloWorld示例相同 RandomSentenceSpout.java /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor lice

java第15章示例代码

import java.util.Scanner; /** * * @author asus第15章示例代码1 全桂群2017.4.9 * */public class Registter { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); String uname, pw

算法之冒泡排序(Java示例)

冒泡排序(英语:Bubble Sort) 是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 动画示意 实现示例 Java 1 public class BubbleSortExample { 2 3 static void bubbleSort(int[] arr){ 4 int len =

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)CyclicBarrier示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3533995.html CyclicBarrier简介 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier p

20个不可思议的 WebGL 示例和演示

WebGL 是一项在网页浏览器呈现3D画面的技术,有别于过去需要安装浏览器插件,通过 WebGL 的技术,只需要编写网页代码即可实现3D图像的展示.WebGL 可以为 Canvas 提供硬件3D加速渲染,这样 Web 开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型了.在这篇文章中20个不可思议的 WebGL 示例来增强你对于这个新技术的理解. 1. Aquarium Image Source:www.webglsamples.org Created by Greggman an

移动端报表JS开发示例--获取定位

上次分享了移动端报表JS开发的系统概念,后来我又回去摸索了一些案例.之前接触到的FineReport的APP客户端可以用来打卡签到,就好奇研究了以下,这次就来聊一聊报表移动端开发如何实现定位功能. 1. 解决思路 在用FineReport设计模板的时候添加一个按钮控件,点击该按钮的时候,获取当前地理位置,并将该位置信息复制给某个单元格,最后在客户端填报当前模板即可. 2. 示例 实现如下图所示效果,点击地理位置按钮获取当前位置与当前时间,并显示在下方对应的单元格中: 2.1 模板制作 打开设计器

survival analysis 生存分析与R 语言示例 入门篇

生存分析,survival analysis,顾名思义是用来研究个体的存活概率与时间的关系.例如研究病人感染了病毒后,多长时间会死亡:工作的机器多长时间会发生崩溃等.  这里“个体的存活”可以推广抽象成某些关注的事件. 所以SA就成了研究某一事件与它的发生时间的联系的方法.这个方法广泛的用在医学.生物学等学科上,近年来也越来越多人用在互联网数据挖掘中,例如用survival analysis去预测信息在社交网络的传播程度,或者去预测用户流失的概率. R里面有很成熟的SA工具. 本文介绍生存分析的