1、RabbitMQ的简单使⽤
AMQP,即Advanced Message Queuing Protocol,⼀个提供统⼀消息服务的应⽤层标准⾼级队列协议,是协议的⼀个开放标准,为⾯向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/不同产品,不同的开发语⾔等条件的限制。中的实现有等。
2、RabbitMQ
Erlang是⼀种通⽤的并发程序设计语⾔,它由乔·阿姆斯特朗(Joe Armstrong)在瑞典电信设备制造商爱⽴信所辖的计算机科学研究室开发,⽬的是创造⼀种可以应付⼤规模开发活动的程序设计语⾔和运⾏环境。Erlang于1987年发布正式版本,最早是爱⽴信拥有的私有软件,经过⼗年的发展,于1998年发表开放源代码版本。
Erlang是运作于虚拟机的解释型语⾔,但是现在也包含有乌普萨拉⼤学⾼性能Erlang计划(HiPE)[3]开发的原⽣代码编译器,⾃R11B-4版本开始,Erlang也⽀持脚本⽅式执⾏。在编程范型上,Erlang属于多重典范编程语⾔,涵盖函数式、并⾏及分布式。循序运⾏的Erlang 是⼀个及早求值, 单次赋值和动态类型的函数式编程语⾔。
2、消息队列(Message Queue)
在计算机科学中,消息队列(英语:Message queue)是⼀种进程间通信或同⼀进程的不同线程间的通信⽅式,软件的贮列⽤来处理⼀系列的输⼊,通常是来⾃⽤户。消息队列提供了异步的通信协议,每⼀个贮列中的纪录包含详细说明的数据,包含发⽣的时间,输⼊设备的种类,以及特定的输⼊参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。
实际上,消息队列常常保存在链表结构中。拥有权限的进程可以向消息队列中写⼊或读取消息。
⽬前,有很多消息队列有很多开源的实现,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ、IBM MQ、Apache Qpid和HTTPSQS。
3、RabbitMQ简介
RabbitMQ是实现了⾼级消息队列协议(AMQP)的开源消息代理软件(亦称⾯向消息的中间件)。RabbitMQ服务器是⽤Erlang语⾔编写的,⽽集和故障转移是构建在开放电信平台框架上的。所有主要的编程语⾔均有与代理接⼝通讯的客户端库。
RabbitMQ⽀持以下操作系统:
Windows
Linux/Unix
MAC OS X
RabbitMQ⽀持下列编程语⾔:
C# (using /c# client)
clojure (using Langohr)
erlang (using erlang client)
java (using java client)
javascript/node.js (de)
perl (using Net::RabbitFoot)
python (using pika)
python-puka (using puka)
ruby (using Bunny)
activemq默认账号密码ruby (using amqp gem)
3、RabbitMQ安装
运⽤docker安装rabbitmq
下载安装rabbitmq:docker pull registry.docker-cn/library/rabbitmq:3.6-management
启动rabbitmq:docker run -d-p5672:5672-p15672:15672 --name myrabbitmq 01d6274c2217
5672:默认的客户端连接的端⼝
15672:默认的web管理界⾯的端⼝
访问15672端⼝出现下⾯界⾯代表RabbitMQ安装成功
默认账号密码都为guest
4、RabbitMQ使⽤
1、核⼼概念
Message :消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,⽽消息头则由⼀系列的可选属性组成,这些属性包括routing-key(路由键)、 priority(相对于其他消息的优先权)、 delivery-mode(指出
该消息可能需要持久性存储)等。
Publisher:消息的⽣产者,也是⼀个向交换器发布消息的客户端应⽤程序
Exchange:交换器,⽤来接收⽣产者发送的消息并将这些消息路由给服务器中的队列。Exchange有4种类型: direct(默认), fanout, topic, 和headers,不同类型的Exchange转发消息的策略有所区别
Queue:消息队列,⽤来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。⼀个消息可投⼊⼀个或多个队列。消息⼀直在队列⾥⾯,等待消费者连接到这个队列将其取⾛。
Binding:绑定,⽤于消息队列和交换器之间的关联。⼀个绑定就是基于路由键将交换器和消息队列连
接起来的路由规则,所以可以将交换器理解成⼀个由绑定构成的路由表。Exchange 和Queue的绑定可以是多对多的关系。 Connection:⽹络连接,⽐如⼀个TCP连接。
Channel:信道,多路复⽤连接中的⼀条独⽴的双向数据流通道。信道是建⽴在真实的TCP连接内的虚拟连接, AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建⽴和销毁 TCP 都是⾮常昂贵的开销,所以引⼊了信道的概念,以复⽤⼀条 TCP 连接。
Consumer:消息的消费者,表⽰⼀个从消息队列中取得消息的客户端应⽤程序。
Virtual Host:虚拟主机,表⽰⼀批交换器、消息队列和相关对象。虚拟主机是共享相同的⾝份认证和加密环境的独⽴服务器域。每个vhost 本质上就是⼀个 mini 版的 RabbitMQ 服务器,拥有⾃⼰的队列、交换器、绑定和权限机制。 vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
2、⼏种消息模型
2.1、简单模式
⼀个⽣产者,⼀个消费者
/**
* 获取连接
* @return Connection
* @throws Exception
*/
public static Connection getConnection() throws Exception {
/
/定义连接⼯⼚
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.1.235");
factory.setPort(5672);
//设置vhost
factory.setVirtualHost("/tzb");
factory.setUsername("test");
factory.setPassword("123456");
//通过⼯⼚获取连接
Connection connection = wConnection();
return connection;
}
//创建队列,发送消息
public static void main(String[] args) throws Exception {
//获取连接
Connection connection = Connection();
//创建通道
Channel channel = ateChannel();
//声明创建队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//消息内容
String message = "Hello World!";
channel.basicPublish("",QUEUE_NAME,Bytes());
System.out.println("发送消息:"+message);
//关闭连接和通道
channel.close();
connection.close();
}
//消费者消费消息
public static void main(String[] args) throws Exception {
//获取连接和通道
Connection connection = Connection();
Channel channel = ateChannel();
/
/声明通道
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//定义消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
//监听队列
channel.basicConsume(QUEUE_NAME,true,consumer);
while(true){
//这个⽅法会阻塞住,直到获取到消息
QueueingConsumer.Delivery delivery = Delivery();
String message = new Body());
System.out.println("接收到消息:"+message);
}
}
2.2、work模式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论