rabbitMQ_helloworld(一)
在下图中,“P”是我们的生产者,“C”是我们的消费者。中间的框是队列 - RabbitMQ代表消费者的消息缓冲区。

本例使用maven构建项目,在pom.xml中添加一下依赖
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.1.</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.</version>
</dependency> </dependencies>
接下来通过生产者叫rabbitMQ服务器发送一个消息,这个消息被缓存在了rabbitMQ的队列中,生产者相当于发件人,rabbitMQ相当于申通快递,消费者相当于接收人

定义一个发件人Send.java
package com.rabbitMQ; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; /**
* 发送消息后,如果服务器的队列中没有可发现的消费者,那么就会放在队列中等待消费者
* 可以使用rabbitmqctl.bat list_queues命令查看某个队列的消息个数
* @author may
*
*/
public class Send { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置连接rabbitMQ服务器的ip
factory.setHost("localhost");
// factory.setPort(5672);
//创建一个连接到服务器的链接
Connection connection = factory.newConnection();
//创建连接通道
Channel channel = connection.createChannel(); /**
* 定义一个队列
* queueDeclare(String queue,//队列的名字
* boolean durable, //定义一个耐用队列,即持久化,如果RabbitMQ服务挂机,重启后还能恢复这个队列。
* boolean exclusive, //排他队列,只能在当前链接中可用,如果这个连接关闭,那么也就无效了。
* boolean autoDelete,//在连接断开后自动删除队列。
* Map<String, Object> arguments)
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null); // channel.queueDeclareNoWait(queue, durable, exclusive, autoDelete, arguments); String message = "Hello World!";
/**
* Parameters:
* exchange: the exchange to publish the message to 转发器的名字
* routingKey: the routing key 路由key,这里就是队列的名字,表示要发送到这个队列上
* props: other properties for the message - routing headers etc//这个信息的属性
* body: the message body 要发送的信息
*/
channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); channel.close(); connection.close();
} }
接收消息,消费者从队列中获取消息

package com.rabbitMQ; import java.io.IOException; import com.rabbitmq.client.AMQP;
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.Envelope; public class Recv {
//队列名要和发送者定义的队列一样的名字,它会告诉rabbitMQ它要再哪个队列中获取消息
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();
/**
* queue the name of the queue
durable true if we are declaring a durable queue (the queue will survive a server restart)
exclusive true if we are declaring an exclusive queue (restricted to this connection)
autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use)
arguments other properties (construction arguments) for the queue
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
//定义一个消费者
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 + "'");
}
};
//异步
/**
* queue the name of the queue 队列名
* 如果autoAck设置为true,这个Consumer在收到消息之后会马上返回ack。服务器将立即删除在内存中排队的消息
* false 在消息的任务处理完之后再手动ack,如果正在处理的时候,消费者发生异常,就不能返回ack,那么就不会删除这个消息,等待发现其他消费者发送给他们
autoAck true if the server should consider messages acknowledged once delivered; false if the server should expect explicit acknowledgements
callback an interface to the consumer object
*/
channel.basicConsume(QUEUE_NAME, true, consumer); //rabbitmqctl.bat list_queues 命令可以列出当前有多少个队列
}
}
运行Send,向rabbitMQ发送了一个消息,我们可以通过rabbitMQ的一个工具查看当前的队列中有多少个消息在排队。

hello是队列的名字,1表示当前的队列中存在一个消息等待着被消费者处理
这个时候,启动消费者去取快递,启动后输出一下内容,成功打印出了Hello World
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'
再次查看rabbitMQ中hello队列中的消息个数

消息个数为零。
rabbitMQ_helloworld(一)的更多相关文章
随机推荐
- windows pyspider WEB显示框太小解决方法
环境:windows7 + chrome + pyspider 解决方法: WEB预览框过小的原因在于页面元素的css属性height被替换为60px: CSS文件所在地方:C:\Users\Admi ...
- Java中常用的url签名防篡改方法
实现方式:Md5(url+key) 的方式进行的. 1.key可以是任意的字符串,然后“客户端”和“服务器端”各自保留一份,千万不能外泄. 2.请求的URL 例如: name=lxl&age ...
- JS数据结构第四篇 --- 栈
一.什么是数据结构栈 在数据结构中有一个栈结构,在内存空间中也有一个栈空间,这两个”栈“是两个不同的概念.这篇我们说的是数据结构中的栈.栈是一种特殊的线性表,特殊性在哪?就是只能在栈顶进行操作,往栈顶 ...
- appcan中evaluateScript、evaluatePopoverScript的使用
1. 如果要在某个主窗体中执行JS,使用 appcan.window.evaluateScript(name,scriptContent) eg: appcan.window.evaluateScri ...
- 安装win7和linux [ubuntu14]双系统
想体验一把ubuntu18.10最新桌面版的快感,但是windows上面的数据又删除不得,所以百度了一下,win7和linux双系统的安装教程. 一.首先在win7上创建新的分区 https://ji ...
- 剖析Unreal Engine超真实人类的渲染技术Part 2 - 眼球渲染
目录 三.眼球渲染 3.1 眼球的构造及理论 3.1.1 眼球的构造 3.1.2 眼球的渲染理论 3.2 眼球的渲染技术 3.2.1 角膜的半透和光泽反射 3.2.2 瞳孔的次表面散射 3.2.3 瞳 ...
- python3的类
python3的类: python是一门面向对象的编程语言,学习python下的类,,能帮助自己形成一个基本的面向对象的概念.关于类和实例的理解,一个易懂的栗子就是动物类,我们把动物看做一个类,而狗啊 ...
- MySQL数据库设计与开发规范
目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ...
- 嵊州D2T3 玛利亚∙多斯普拉泽雷斯 完美配对
嵊州D2T3 玛利亚∙多斯普拉泽雷斯 公墓一共有 n 个墓地,通过 n − 1 条通道相连. 每次,推销员可以在选择一个墓地推销给玛利亚. 但是,考虑很多的玛利亚会尽量否决这个提议. 她会选择一个墓地 ...
- 7.秋招复习简单整理之请你讲讲 Statement 和 PreparedStatement 的区别?哪个性能更好?
Statement和PreparedStatement都是数据库用于执行SQL语句的句柄,但是PreparedStatement代表一个预编译的SQL. 以下是PreparedStatement和St ...