RabbitMQ初探(Java版)
来源:互联网 发布:stm32用什么软件编程 编辑:程序博客网 时间:2024/06/06 05:15
一、RabbitMQ 简介——用Erlang实现的一个高并发高可靠AMQP消息队列服务器
AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列和路由,可靠且安全。RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 Ajax。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ 中有一些概念需要我们在使用前先搞清楚,主要包括以下几个:Broker、Exchange、Queue、Binding、Routingkey、Producter、Consumer、Channel。
1.Broker
简单来说就是消息队列服务器的实体。
2.Exchange
接收消息,转发消息到绑定的队列上,指定消息按什么规则,路由到哪个队列。
3.Queue
消息队列载体,用来存储消息,相同属性的 queue 可以重复定义,每个消息都会被投入到一个或多个队列。
4.Binding
绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来。
5.RoutingKey
路由关键字,Exchange 根据这个关键字进行消息投递。
6.Producter
消息生产者,产生消息的程序。
7.Consumer
消息消费者,接收消息的程序。
8.Channel
消息通道,在客户端的每个连接里可建立多个 Channel,每个 channel 代表一个会话。
二、RabbitMQ服务安装
- RabbitMQ的运行需要erlang的支持,因此先下载并安装erlang。
- 前面我们也讲到RabbitMQ就是一个消息服务器,所以需要安装对应服务端。下载地址:https://www.rabbitmq.com/download.html 。
- 安装好之后需要启动服务:点击开始菜单,搜索RabbitMQ Command Prompt,打开RabbitMQ命令行输入:rabbitmq-server start,如果在这之前已经启动,则会显示:
4.验证是否启动成功:此时我们可能通过 Web 浏览器来查看 RabbitMQ 的运行状态,浏览器中输入 http://{server_ip}:15672,用 guest/guest 默认的用户和密码登录后即可查看 RabbitMQ 的运行状态。
三、Demo
生产消息任务:
public class Task { // 队列名称 private final static String QUEUE_NAME = "workqueue"; public static void main(String[] args) throws Exception { // 创建连接和频道 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("127.0.0.1"); // 指定用户名和密码 factory.setUsername("zhangsan"); factory.setPassword("123"); // 指定端口 factory.setPort(AMQP.PROTOCOL.PORT); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); boolean durable = true;// 设置消息持久化 RabbitMQ不允许使用不同的参数重新定义一个队列,所以已经存在的队列,我们无法修改其属性 // 声明队列 channel.queueDeclare(QUEUE_NAME, durable, false, false, null); // 发送10条消息,依次在消息后面附加1-10个点 for (int i=10; i>0; i--) { String dots=""; for (int j=0; j<=i; j++) { dots += "."; } String message = "hello world" + dots + dots.length(); // MessageProperties.PERSISTENT_TEXT_PLAIN 标识我们的信息为持久化的 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println("Sent Message: '" + message + "'"); } //关闭频道和资源 channel.close(); connection.close(); }}
消费消息任务:
public class Work { private final static String QUEUE_NAME = "workqueue"; public static void main(String[] args) throws Exception { //区分不同工作进程的输出 int hashCode = Work.class.hashCode(); //创建连接和频道 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("127.0.0.1"); //指定用户名和密码 factory.setUsername("zhangsan"); factory.setPassword("123"); //指定端口 factory.setPort(AMQP.PROTOCOL.PORT); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); boolean durable = true; // 声明队列 channel.queueDeclare(QUEUE_NAME,durable,false,false,null); QueueingConsumer consumer = new QueueingConsumer(channel); boolean ack = false;// 打开应答机制 // 指定消费队列 channel.basicConsume(QUEUE_NAME, ack, consumer); // 公平转发 设置最大服务转发消息数量 只有在消费者空闲的时候会发送下一条信息 int prefetchCount = 1; channel.basicQos(prefetchCount); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println(hashCode + "Received Message: '" + message + "'"); doWork(message); System.out.println(hashCode + "Received Done"); // 发送应答 channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); } } /** * 每个点耗时1s * @param message * @throws InterruptedException */ private static void doWork(String msg) throws InterruptedException { for (char ch : msg.toCharArray()) { if (ch == '.') { Thread.sleep(1000); } } }}
四、演示
发送消息
接收消息
参考文章:
1. https://www.ibm.com/developerworks/cn/opensource/os-cn-rabbit-mq/
2. http://blog.csdn.net/u013142781/article/details/50487028
3. http://blog.csdn.net/zhu_tianwei/article/details/40887717
- RabbitMQ初探(Java版)
- RabbitMQ初探-JAVA
- RabbitMQ 之 RPC 初探(Java)
- RabbitMQ初探
- RabbitMQ初探
- RabbitMQ初探
- RabbitMQ初探
- rabbitmq初探
- RabbitMQ 初探/安装 Fedora
- [Erlang 0079] RabbitMQ 初探
- rabbitmq-c初探
- RabbitMQ-C初探
- 消息中间件RabbitMQ 初探
- RabbitMQ指南(Java)
- RabbitMQ学习笔记二:rabbitmq发送接收消息Helloworld(Java版)
- RabbitMQ 入门指南(Java)
- RabbitMQ 入门指南(Java)
- RabbitMQ 入门指南(Java)
- ClustrixDB-关键特性
- 从A页面打开了B页面,对B页面进行修改,修改成功后关闭B页面同时刷新A页面
- Spring入门之HelloWorld
- 串行通信接口RS-232C
- 如何判断电脑CPU大小端
- RabbitMQ初探(Java版)
- 8、字典
- OpenStack 支持的虚拟化技术种类
- php学习第一天
- android五中数据传递方式
- python入门学习教程之dictionary(字典)
- Spring入门之setter DI注入
- 你所不知道的 Console
- OkHttp简单的请求