内容翻译自:RabbitMQ Tutorials Java版


RabbitMQ(一):Hello World程序

RabbitMQ(二):Work Queues、循环分发、消息确认、持久化、公平分发

RabbitMQ(三):Exchange交换器--fanout

RabbitMQ(四):Exchange交换器--direct

RabbitMQ(五):Exchange交换器--topic

RabbitMQ(六):回调队列callback queue、关联标识correlation id、实现简单的RPC系统

RabbitMQ(七):常用方法说明 与 学习小结


介绍:

RabbitMQ是一个消息代理:它接受并转发消息。你可以把它当成一个邮局:当你想邮寄信件的时候,你会把信件放在投递箱中,并确信邮递员最终会将信件送到收件人的手里。在这个例子中,RabbitMQ就相当与投递箱、邮局和邮递员。

RabbitMQ与邮局的区别在于:RabbitMQ并不处理纸质信件,而是接受、存储并转发二进制数据---消息。

谈到RabbitMQ的消息,通常有几个术语:

(1)生产者:是指发送消息的程序

(2)队列:相当于RabbitMQ的投递箱。尽管消息在RabbitMQ和你的应用之间传递,但是消息仅仅会在队列之中存储。队列只能存储在内存或磁盘中,本质上是一个大的消息缓冲区。不同的生产者可以发送消息到同一个对队列,不同的消费者也可以从同一个队列中获取消息。

(3)消费者:等待接受消息的程序。

注意,生产者、消费者以及RabbitMQ并不一定要在同一个主机上,在绝大部分的应用中它们都不在同一主机上。

在开始教程之前,请确保:你已经安装了RabbitMQ,并且在localhost上运行起来(默认端口5672)。如果你使用了不同的主机或端口,请在下文中的连接设置中
更改相应的参数。


一、Hello World:

在这一部分,我们将会使用Java编写两个小程序:一个发送单个消息的生产者、一个接受消息并打印出消息的消费者。这个消息就是Hello World

下图中,P代表生产者,C代表消费者,中间红色的小箱子就代表队列--RabbitMQ为了让消费者收到消息而保持的消息缓冲区。

在这一部分,只需要引入Java客户端依赖即可:amqp-client.jar,也可以通过maven的方式引入:

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

1、生产者:

我们将消息的发布者(生产者)命名为Send,将消息的消费者命名为Recv。发布者将会连接到RabbitMQ,并且发送一条消息,然后退出。

Send.java中,首先引入相关类:

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

再定义队列的名字:

private final static String QUEUE_NAME = "hello";

然后,创建一个连接到Rabbit服务器的连接:

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

上面的代码中,connection是socket连接的抽象,为我们处理了通信协议版本协商以及认证等。这样,我们就连接到了本地机器上的一个消息代理(broker)。如果想连接到其他机器上的broker,只要修改IP即可。

之后,我们又创建了一个通道(channel),大部分的API操作均在这里完成。

对于Send来说,必须指明消息要发到哪个队列:

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

队列的定义是幂等的,它仅仅在不存在时才会创建。消息的内容是一个字节数组,所以你可以随意编码(encode)。

最后,必须将通道和连接关闭。

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

完整代码

//引入相关Class文件
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Send {//定义队列名字private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {//创建连接和通道ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();//为通道指明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello World!";//发布消息channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message + "'");//关闭连接channel.close();connection.close();}
}

2、接收者(消费者):

消费者从RabbitMQ中取出消息。不同于发布者只发送一条消息就退出,这里我们让消费者一直监听消息,并把接受到的消息打印出来。

与Send.java类似,首先引入相关类:

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

上面引入的DefaultConsumerConsumer接口的实现类,我们使用它来缓冲从服务器push来的消息。
接下来的设置与发布者类似,打开连接和通道,声明我们想消费的队列。注意,这里的队列的名字要与发布者中声明的队列的名字一致。

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, fasle, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");...}
}

注意,消费者同样声明了队列。这是因为,我们可能在启动生产者之前启动了消费者应用,我们想确保在从一个队列消费消息之前,这个队列是存在的。

接下来,告诉服务器(RabbitMQ)把队列中的消息发过来。因为这个过程是异步的,可以通过DefaultConsumer来进行回调。

Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}
};
channel.basicConsume(QUEUE_NAME, true, consumer);

Consumer的完整代码如下:

package com.maxwell.rabbitdemo;import com.rabbitmq.client.*;import java.io.IOException;public class Recv {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {//建立连接和通道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");//回调消费消息Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}};channel.basicConsume(QUEUE_NAME, true, consumer);}
}

这样,消费者就会一直监听声明的队列。运行一次生产者(即Send.java中的main方法),消费者就会打印出接受到的消息。


说明:

①与原文略有出入,如有疑问,请参考原文。

②RabbitMQ的官方rabbitmq-tutorials的java示例中,amqp-client版本为3.5,我改为了4.1,否则后续的示例教程中会报错说找不到文件。

RabbitMQ(一):Hello World程序相关推荐

  1. 没想到,错误的单例写法,让 RabbitMQ 大量超时导致程序挂死!

    一:背景 1. 讲故事 10月份星球里的一位老朋友找到我,说他们公司的程序在一个网红直播带货下给弄得无响应了,无响应期间有大量的 RabbitMQ 超时,寻求如何找到根源,聊天截图我就不发了. 既然无 ...

  2. 第五节 RabbitMQ在C#端的应用-消息收发

    原文:第五节 RabbitMQ在C#端的应用-消息收发 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/873 ...

  3. 消息队列 RabbitMQ

    前言 市面上的消息队列产品有很多,比如老牌的 ActiveMQ.RabbitMQ ,目前我看最火的 Kafka ,还有 ZeroMQ ,阿里巴巴捐赠给 Apache 的 RocketMQ ,连 red ...

  4. spring boot(八)RabbitMQ使用

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...

  5. .NET 环境中使用RabbitMQ

    在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方,比如发送短信 ...

  6. RabbitMQ 消息队列六种模式

    RabbitMQ 的第一个程序 RabbitMQ-生产者|消费者 搭建环境 java client 生产者和消费者都属于客户端, rabbitMQ的java客户端如下 创建 maven 工程 < ...

  7. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  8. RabbitMQ(2) 一般介绍

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...

  9. Spring boot(八):RabbitMQ详解

    RabbitMQ介绍 RabbitMQ既一个消息队列,主要用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多.消息中间件最主要的作用是解耦,中 ...

  10. 使用RabbitMQ的SpringBoot消息传递

    RabbitMQ是流行的消息代理解决方案之一,并提供可用于各种编程语言的客户端库,包括Java,Scala,.NET,Go,Python,Ruby,PHP等.在本教程中,我们将学习如何使用Rabbit ...

最新文章

  1. mysql 设置字段自动增长值_mysql命令行脚本
  2. 使用高性能Pipelines构建.NET通讯程序
  3. Silverlight带关闭动画的内容控件,可移动的内容控件(一)
  4. 专访阿里数据库备份专家 教你pick最有效的备份系统
  5. 常用API2 正则表达式
  6. 人脸识别_云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案
  7. PaddlePaddle Softmax回归示例
  8. SQL语言:DQL,DML,DDL,DCL
  9. python零基础简明教程
  10. SQL 2005/2008质疑修复
  11. 红外接收二极管为什么正反都能通_为什么在电路板中测量二极管正反都通
  12. cocos2dx面试题整理
  13. 慢牛股票-基于Sencha touch+Cordova的股票类APP
  14. 高速公路上遇事故报警,微信扫这个二维码一键报警定位
  15. 关于微信拉票之微信如何拉票及微信投票怎样拉票操作方法
  16. python实现文字识别软件_文字识别(OCR)CRNN(基于pytorch、python3) 实现不定长中文字符识别...
  17. 统计建模与R软件 第五章课后习题(5.13~5.18)
  18. InputBox函数用法
  19. VS2010中出现无法嵌入互操作类型
  20. 局域网中无法相互访问的解决方法

热门文章

  1. 九十六、轻松搞定Python中的PPT办公自动化系列
  2. 两个多元正态分布的KL散度、巴氏距离和W距离
  3. NLP高阶实战必读:一文走遍完整自然语言处理流程
  4. ICLR 2020 | 多模态下使用图片信息显著增强机器翻译效果
  5. 对抗训练浅谈:意义、方法和思考(附Keras实现)
  6. poj 1664 放苹果 DPDFS
  7. pack_padded_sequence 和 pad_packed_sequence
  8. linux 进程死循环,Linux下如何处理一次用户态进程死循环问题
  9. 川崎焊接机器人编程实例_机器人现场编程-川崎机器人示教-综合命令.pptx
  10. PostgreSQL 9.6.0 手册