rabbitmq学习当然是跟着官网走最好了,官网的教程写的很好,跟着官网教程走一遍就会有个初步了解了

下面的教程转自http://cmsblogs.com/?p=2768,该博客对官网的翻译还不错

介绍

RabbitMQ 是一个消息代理:它接受并转发消息。你可以将其视为邮局:当你将要发布的邮件放在邮箱中时,您可以确信 Postman 先生最终会将邮件发送给收件人。在这个比喻中,RabbitMQ 是一个邮箱,邮局和邮递员。

RabbitMQ 和邮局之间的主要区别在于它不处理纸张,而是接受,存储和转发二进制数据块的消息。

常见术语

RabbitMQ 使用一些术语:生产者、队列、消费者。

生产者

一个发送消息的程序是一个生产者。

队列

队列类似于邮箱。虽然消息通过 RabbitMQ 在你的应用中传递,但是它们只能存储在队列中。队列只受主机的内存和磁盘限制的限制,它本质上是一个大的消息缓冲区。不同的生产者可以通过同一个队列发送消息,此外,不同的消费者也可以从同一个队列上接收消息。

消费者

一个等待接收消息的程序是一个消费者。

整个过程非常简单,生产者创建消息,消费者接收这些消息。你的应用程序既可以作为生产者向其他应用程序发送消息,也可以作为消费者,等待接收其他应用程序的消息。其中,存储消息的是消息队列,它类似于邮箱,消息通过消息队列进行投递。

案例实战 – 使用 Java 客户端实现 “Hello World!”

在本教程的这一部分,我们将用 Java 编写一个 “Hello World” 的消息传递案例,它涉及两个程序:发送单个消息的生产者,以及接收消息并将其打印出来的消费者。

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

准备工作

使用 Maven 进行依赖管理。

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

发送端

我们会调用生产者发送消息给消费者。生产者连接到 RabbitMQ,发送一条数据,然后退出

public class Send {
private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接
ConnectionFactory factory = new ConnectionFactory();
// 设置 RabbitMQ 的主机名
factory.setHost("localhost");
// 创建一个连接
Connection connection = factory.newConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 指定一个队列
// queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
// 参数1 queue :队列名
// 参数2 durable :是否持久化 默认false
// 参数3 exclusive :仅创建者可以使用的私有队列,断开后自动删除
// 参数4 autoDelete : 当所有消费客户端连接断开后,是否自动删除队列
// 参数5 arguments
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 发送消息
String message = "Hello World!";
// basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
// 参数1 exchange :交换器
// 参数2 routingKey : 路由键
// 参数3 props : 消息的其他参数
// 参数4 body : 消息体
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
// 关闭频道和连接
channel.close();
connection.close();
}
}

声明队列是幂等的, 队列只会在它不存在时才会被创建,多次声明并不会重复创建。消息内容是一个字节数组,也就意味着可以传递任何数据。

接受端

这就是我们的消费者。它不断等待消息队列推送消息,然后在控制台输出。

public class Recv {
private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接
ConnectionFactory factory = new ConnectionFactory();
// 设置 RabbitMQ 的主机名
factory.setHost("localhost");
// 创建一个连接
Connection connection = factory.newConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 指定一个队列
// queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
// 参数1 queue :队列名
// 参数2 durable :是否持久化
// 参数3 exclusive :仅创建者可以使用的私有队列,断开后自动删除
// 参数4 autoDelete : 当所有消费客户端连接断开后,是否自动删除队列
// 参数5 arguments
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 + "'");
}
};
// basicConsume(String queue, boolean autoAck, Consumer callback)
// 参数1 queue :队列名
// 参数2 autoAck : 是否自动ACK
// 参数3 callback : 消费者对象的一个接口,用来配置回调
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}

源代码

相关示例完整代码: https://github.com/lianggzone/rabbitmq-action

最新文章

  1. 运行带cocoa pods 的项目,遇到的问题是找不到文件,解决办法
  2. Linq实例
  3. javascript设计模式--状态模式(State)
  4. 用于主题检测的临时日志(383b4f88-5dc7-4b08-a585-27104eb4ee7f - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
  5. 这样就算会了PHP么?-11
  6. eclipse中输入的中文为繁体的问题
  7. 构造函数为什么不能为虚函数 &amp;amp; 基类的析构函数为什么要为虚函数
  8. 雪花降落CADisplayLink
  9. DbContext 中的 Explicit interface implementation
  10. html获取输入框的值
  11. Dynamics 365中的非交互式账号(Non-interactive User)介绍
  12. pyspider爬虫框架webui简介-爬取阿里招聘信息
  13. notepad++ 代码注释快捷键
  14. windows文件名格式的中文+数字混合字符串排序
  15. 2198: 小P当志愿者送餐
  16. MT【4】坐标平移后齐次化
  17. TCP是如何实现三次握手的?
  18. bzoj1853幸运数字
  19. Grafana+Prometheus监控
  20. 照着官网来安装openstack pike之environment设置

热门文章

  1. Docker 初相见
  2. 【CodeForces】961 G. Partitions 斯特林数
  3. 33、Map简介
  4. Linux服务-搭建NFS
  5. VS2010 项目属性的默认包含路径设置方法
  6. iOS学习笔记(2)— UIView用户事件响应
  7. 20155303 2016-2017-2 《Java程序设计》第三周学习总结
  8. Hibernate5笔记8--Hibernate事务相关内容
  9. Material Design In Action——重构bilibili客户端
  10. 金蝶K3物料选择问题(感觉Ctrl被按住了一样)