RabbitMQ学习总结(3)——入门实例教程详解

Wesley13
• 阅读 453

一、起航

本章节,柯南君将从几个层面,用官网例子讲解一下RabbitMQ的实操经典程序案例,让大家重新回到经典“Hello world!”(The simplest thing that does something )时代,RabbitMQ 支持N多种客户端(client),这里无法一一讲解,暂定java client,有时间的情况下,在弥补一下。

事先,先普及一下图标(我们会在下面的事例中,会大量用到,所以先普及一下,便于识别,最终更好理解事例的含义)

1、图标概念

① producting(生产者):在程序中 发送消息的一端,我们暂且称之为 生产者,在这里用“p”表示

RabbitMQ学习总结(3)——入门实例教程详解

② queue(队列):队列是一个邮箱的名字。它住在RabbitMQ。尽管消息流经RabbitMQ和您的应用程序,他们只可以存储在一个队列中。队列是不受任何限制,它可以储存尽可能多的信息(按你兴趣来了),它本质上是一个无限缓冲区。许多生产商可以发送消息到一个队列,许多消费者可以尝试接收数据从一个队列。

RabbitMQ学习总结(3)——入门实例教程详解

③ consuming(消费者):消费者和生产者是对应的,较为相似的意思;在这里,我用“C”表示

RabbitMQ学习总结(3)——入门实例教程详解

2、The Java client library

RabbitMQ 中 AMQP这是一个开放的、通用的协议消息。有许多客户AMQP在许多不同的语言。我们将使用提供的Java客户机RabbitMQ。

我们需要下载(Download) client library package,并要核实每个jar包,解压到相应位置,如下图所示:

第一步:点击 http://www.rabbitmq.com/java-client.html,然后找到相应的lib下载位置

RabbitMQ学习总结(3)——入门实例教程详解

第二步:选择合适的下载,比如我下载了zip包,如图所示:

RabbitMQ学习总结(3)——入门实例教程详解

第三步:Unzip it(解压它) 到你的working directory(工作目录)中 and grab (并且获得)你的jar包文件

    $ unzip rabbitmq-java-client-bin-*.zip
  
 
  
 
  
 
   
    $ cp rabbitmq-java-client-bin-*/*.jar ./
 

 

 

  
  

二、程序案例

1) "Hello World"

在这部分教程中我们将用Java写两个程序,发送一个消息的生产者,消费者接收信息并打印出来。我们会掩盖一些细节的Java API,集中在这个非常简单的东西开始。这是一个“Hello World”的消息。在下面的图中,“P”是我们的生产和“C”是我们的消费者。中间的框是一个队列,消息缓冲区RabbitMQ保持代表消费者。

RabbitMQ学习总结(3)——入门实例教程详解

① sending (发送)

RabbitMQ学习总结(3)——入门实例教程详解

首先 让The sender(消息发送者)发送消息并且让我们的receiver (消息接收者)接收消息,The sender(消息发送者)将会connect to(连接)RabbitMQ,发送一个single message(单一的信息),然后exit(退出)。

  • 在send.java 中,我们需要import一些class ,如下所示:

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

  • set up(设置)类和queue的name

    public class Send {

          private final static String QUEUE_NAME = "hello";
    
          public static void main(String[] argv)
              throws java.io.IOException {
              ...
          }
       }
    
  • then 我们create 一个connection (连接)到server(服务端)

    onnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel();

备注

  •  这个connection 是抽象的socket connection链接;
  •  负责协议版本(protocol version negotigation)和身份认证(authentication );
  • 我们在本地机器上连接到一个代理即 localhost ,如果我们想要连接到代理不同机器上我们简单的指定其名称或者IP地址即可;

   接下来,我们创建一个channel(通道),这个通道汇集了大多数的API服务!

为了发送,我们必须先声明一个为我们发送queue(队列),然后,往queue里发送一个message

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 + "'");

消息内容是一个字节数组,所以你可以编码任何你喜欢的。最后,我们关闭通道和连接;

channel.close();
    connection.close();

问题 :

如果 sending doesn‘t work! 我们将怎么办?why?

如果这是你第一次使用RabbitMQ并且你看不到“发送的”消息,那么你可能抓耳挠 腮没有足够的空闲磁盘空间(默认情况下它需要至少1 gb免费),因此拒绝接受消息。检查代理日志文件确认,如果有必要减少限制。配置文件的文档将向您展示如何设置disk_free_limit。

接下来的是send.java所有源代码:

[java]  view plain copy print ?

  1. import com.rabbitmq.client.ConnectionFactory;

  2. import com.rabbitmq.client.Connection;

  3. import com.rabbitmq.client.Channel;

  4. public class Send {

  5. private final static String QUEUE_NAME = "hello";

  6. public static void main(String[] argv) throws Exception {

  7. ConnectionFactory factory = new ConnectionFactory();

  8. factory.setHost("localhost");

  9. Connection connection = factory.newConnection();

  10. Channel channel = connection.createChannel();

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

  12. String message = "Hello World!";

  13. channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

  14. System.out.println(" [x] Sent '" + message + "'");

  15. channel.close();

  16. connection.close();

  17. }

  18. }

② Receiving (接收)

  这就是我们的发送者。我们的接收器是将消息从RabbitMQ,所以不像发送方发布一个消息,我们将保持运行监听消息并打印出来

RabbitMQ学习总结(3)——入门实例教程详解

  • The code (in Recv.java) has almost the same imports as Send:

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

额外的QueueingConsumer是一个类,我们将使用缓冲消息推到我们的服务器。设置发送者一样,我们打开一个连接和一个通道,并宣布我们将使用的队列。注意这与队列,发送发布。

public class Recv {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv)
      throws java.io.IOException,
             java.lang.InterruptedException {

    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");
    ...
    }
}

注意,我们在这里声明队列。因为我们可能会在发送方之前开始启动接收方,我们要确保队列存在之前我们尝试使用消息。我们要告诉服务器提供我们从队列的消息。因为它将异步消息,我们提供一个回调对象的形式,将缓冲的消息,直到我们准备使用它们。

QueueingConsumer要做什么呢?

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.nextDelivery()块,直到另一个来自服务器的消息交付。  

下面是Recv.java 源代码:

[java]  view plain copy print ? RabbitMQ学习总结(3)——入门实例教程详解  RabbitMQ学习总结(3)——入门实例教程详解

  1. import com.rabbitmq.client.ConnectionFactory;

  2. import com.rabbitmq.client.Connection;

  3. import com.rabbitmq.client.Channel;

  4. import com.rabbitmq.client.QueueingConsumer;

  5. public class Recv {

  6. private final static String QUEUE_NAME = "hello";

  7. public static void main(String[] argv) throws Exception {

  8. ConnectionFactory factory = new ConnectionFactory();

  9. factory.setHost("localhost");

  10. Connection connection = factory.newConnection();

  11. Channel channel = connection.createChannel();

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

  13. System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

  14. QueueingConsumer consumer = new QueueingConsumer(channel);

  15. channel.basicConsume(QUEUE_NAME, true, consumer);

  16. while (true) {

  17. QueueingConsumer.Delivery delivery = consumer.nextDelivery();

  18. String message = new String(delivery.getBody());

  19. System.out.println(" [x] Received '" + message + "'");

  20. }

  21. }

  22. }

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这