二.java下使用RabbitMQ实现hello world
上一篇文章介绍了windows环境下的安装和配置rabbitMQ,具体戳这边,一.windows环境下rabbit的的安装和配置。
现在我们可以着手编写hello world程序了,一窥RabbitMQ的效用,从rabbitmq的官网的get start进入rabbitMQ文档学习区,即这个页面https://www.rabbitmq.com/getstarted.html。
由于网上关于rabbitMQ的中文材料和教程不是很多,所以只好硬着头皮看官网文档了。

可以看到官网主要从6个步骤来介绍学习轨迹,并且每个步骤均有多种编程语言的版本。由于本人采用的是java语言,所以就从一个java版本的hello world开始rabbitMQ的学习吧。
一.Introduction(简介)
1.可以将RabbitMQ理解为一个消息代理,它接收、存储、和分发数据信息。
2.RabbitMQ主要由三个元素组成,producer(生产者),队列(queue),和消费者(Consumer).
3.生产者生产消息,队列存储消息,消费者接收消息。他们之间的关系是多对多的,即多个生产者可以向一个队列中存放消息,多个消费者可以从一个队列中获取消息。
4.值得注意的是,RabbitMQ代理器和生产者、消费者并不需要在同一个服务器上,他们可以是分布式的。

二.hello world
现在我们可以进入正题,用RabbitMQ来写一个hello world 的demo,以对RabbitMQ这个中间件有个直观的认识。
在这个demo中,我们将编写两个类,一个是生产者类,一个是消费者类,生产者类负责发送一个简单的message,而消费者类负责接收这个消息并且打印出来。
1.首先添加maven依赖包,如下。
<!-- rabbitMQ -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.2</version>
</dependency>
2.新建Send类,如下所示。
package com.xdx.learn; import java.io.IOException;
import java.util.concurrent.TimeoutException; 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[] args) throws IOException, TimeoutException {
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.1.195");
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());
System.out.println("[x] Sent '"+message+"'");
channel.close();
connection.close();
} }
运行上述代码,报错如下。

这是因为我照抄官网的代码,官网的demo是基于本地的连接,而我是远程连接,所以必须显式地指定连接端口,用户名,密码之类的信息,修改上述代码,修改后如下。
import java.io.IOException;
import java.util.concurrent.TimeoutException; 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[] args) throws IOException, TimeoutException {
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.1.195");//服务器ip
factory.setPort(5672);//端口
factory.setUsername("xdx");//登录名
factory.setPassword("xxxxxx");//密码
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());
System.out.println("[x] Sent '"+message+"'");
channel.close();
connection.close();
}
}
然后再运行,这次可以运行成功了。
然后我们去RabbitMQ的管理后台,就可以看到队列中有一个queue了,名字就叫做hello。如下图所示。

如果我再执行以下刚才那段代码,就会发现messages的数量又多了一个,如下所示。

3.接下来是Recv.java类,用于接收消息,不同意发布消息的类,接收消息的类必须一直保持运行的状态,以便监听消息的到来。
package com.xdx.learn; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Envelope; public class Recv {
private final static String QUEUE_NAME="hello"; public static void main(String[] args) throws IOException, TimeoutException {
//下面的配置与生产者相对应
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.1.195");//服务器ip
factory.setPort(5672);//端口
factory.setUsername("xdx");//登录名
factory.setPassword("xxxx");//密码
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");
//defaultConsumer实现了Consumer,我们将使用它来缓存生产者发送过来储存在队列中的消息。当我们可以接收消息的时候,从中获取。
Consumer consumer=new DefaultConsumer(channel){
@Override
public 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 + "'");
}
};
//接收到消息以后,推送给RabbitMQ,确认收到了消息。
channel.basicConsume(QUEUE_NAME, true, consumer);
} }
运行结果如下:

此时我们再去RabbitMQ的控制台查看,发现hello队列中已经没有message了。

注意到消费者的代码,有一个实现了DefaultConsumer接口的Consumer对象,去查看Consumer的源码,我们可以知道它的handleDelivery方法被一个一直存在的线程(该线程不是Connection所在的线程)调用,当有消息的时候,就会被执行。
以上就是一个简单的生产者和消费者的例子,其实RabbitMQ在这个过程中充当了一个消息存储器的角色,它负责接收,分配消息,而发送,接收消息的工作由我们编程来实现。经过这个例子,我们对RabbitMQ有了一个直观的简单的理解。更多的细节将在下面的文章中来学习。
二.java下使用RabbitMQ实现hello world的更多相关文章
- RabbitMQ(二) Java使用RabbitMQ
2-1 RabbitMQ 生产者消息发送 创建 Maven 项目 Send 加入依赖 <dependency> <groupId>com.rabbitmq</groupI ...
- .Net Core下使用RabbitMQ比较完备的两种方案(虽然代码有点惨淡,不过我会完善)
一.前言 上篇说给大家来写C#和Java的方案,最近工作也比较忙,迟到了一些,我先给大家补上C#的方案,另外如果没看我上篇博客的人最好看一下,否则你可能看的云里雾里的,这里我就不进行具体的方案 ...
- 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- JAVA课程实验报告 实验二 Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- 20145225唐振远 实验二 "Java面向对象程序设计"
20145225<Java程序设计> 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S ...
- 20145208 实验二 Java面向对象程序设计
20145208 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...
- Java下利用Jackson进行JSON解析和序列化
Java下利用Jackson进行JSON解析和序列化 Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...
- 20162311 实验二 Java面向对象程序设计 实验报告
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- 20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计
20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 ...
随机推荐
- Java 核心内容相关面试题【1】
1.什么是 transient 变量? transient 变量是指不会被序列化的变量. 2.什么是同步(synchronization)? 在多线程环境中,同步是指控制多个线程访问共享资源的方式.没 ...
- SharpGL(46)用Billboard绘制头顶文字
CSharpGL(46)用Billboard绘制头顶文字 本文介绍CSharpGL用Billboard绘制头顶文字的方法.效果如下图所示. 下载 CSharpGL已在GitHub开源,欢迎对OpenG ...
- c#DES加密解密代码
//加密 public string DesEncrypt(string strText, string strEncrKey) { byte[] byKey=null; byte[ ...
- MySQL5.5编译安装以及Debug
MySQL5.5以上版本安装是需要cmake 安装步骤: 设置编译参数cmake -DCMAKE_INSTALL_PREFIX='/data1/guosong/mysql_debug' -DDEF ...
- ButterKnife的使用以及不能自动生成代码问题的解决
ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又 ...
- [C#]使用dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: https://github.com/cnxy/dnSpy/arc ...
- 运行第一个 Service - 每天5分钟玩转 Docker 容器技术(96)
上一节我们创建好了 Swarm 集群, 现在部署一个运行 httpd 镜像的 service,执行如下命令: docker service create --name web_server httpd ...
- Vue之彻底理解自定义组件的v-model
最近在学习vue,今天看到自定义事件的表单输入组件,纠结了一会会然后恍然大悟...官方教程写得不是很详细,所以我决定总结一下. v-model语法糖 v-model实现了表单输入的双向绑定,我们一般是 ...
- 关于Springboot整合mybatis启动的问题
由于是刚pull下来的项目整体也不熟悉,然后项目无法正常启动,爆出的异常为: Invalid bound statement (not found) 这是由于创建的新模块mapper与扫描mapper ...
- [ 面试没回答上的问题2]IOS上给body绑定click事件的bug
面试被问到ios上的bug,自己提到绑定click事件的bug,但是并没有把问题讲的很清楚,这里再清理一下思路. 这个bug只在IOS上有,包括ihone,ipad,由于ios浏览器都用的safari ...