赞
踩
Message Broker是一种消息验证、传输、路由的架构模式,其设计目标主要应用于下面这些场景:
AMQP是Advanced Message Queuing Protocol的简称,它是一个面向消息中间件的开放式标准应用层协议。AMQP定义了这些特性:
本文要介绍的RabbitMQ就是以AMQP协议实现的一种中间件产品,它可以支持多种操作系统,多种编程语言,几乎可以覆盖所有主流的企业级技术平台。
在RabbitMQ官网的下载页面https://www.rabbitmq.com/download.html中,我们可以获取到针对各种不同操作系统的安装包和说明文档。这里,我们将对几个常用的平台一一说明。RabbitMQ的插件是由Erlang语言写的,所以需要安装Erlang环境。
下面我们采用的Erlang和RabbitMQ Server版本说明:
安装Erland,通过官方下载页面http://www.erlang.org/downloads获取exe安装包,直接打开并完成安装。
安装RabbitMQ,通过官方下载页面https://www.rabbitmq.com/download.html获取exe安装包。
下载完成后,直接运行安装程序。
RabbitMQ Server安装完成之后,会自动的注册为服务,并以默认配置启动起来。
我们可以直接通过配置文件的访问进行管理,也可以通过Web的访问进行管理。下面我们将介绍如何通过Web进行管理。
1、 overview(概述)
记录一些本地rabbit的磁盘信息和内存占用,而后是一个监听端口,意思是协议的端口.
这里我们需要记下amqp协议的端口5672.因为rabbitmq就是遵从amqp协议的erlang语言实现的消息列队框架技术.也就是我们需要在rabbitmq开发和实现时,必须要用此端口来进行连接.
2.、Connections (连接)
连接界面此时是空的,看似什么也没有,但是通过词意大概可以猜想到,这个界面记录应该是展示客户端或者某个服务连接到此rabbitmq的信息展示,那么通过什么连接呢?
IP?用户名?密码?还有端口,前3个都有了,那么后面的端口呢,是不是overview(概述)里面的监听协议端口.显然是的.
刚入门之初,我一直以为是15672,事实证明是错的,5672才是正确的协议连接端口.
3、Channels
信道抽象理解一下,就是在创建连接的时候,我们还需要给一个信道,来承载信息的传输.好比一根电线,当它通电后,其实是其内的铜线来传输电力一样.
4. Exchanges (交换器)
交换器的理解就是在第三步创建信道后,信道上需要设置一个交换器.那么用交换器去做什么呢,往下看.
界面一个列表,Name列就是名称,Type是交换器类型,既然类型那么交换器肯定通过类型会做不同的逻辑处理.还有一个Features特性列,证明在我们实现代码的时候也需要如此定位类型.
D表示(durable(持久化的)),I表示(internal(内在的))
词面理解交换器可以是持久化的也可以定义为内部内在的,外部无法访问,只能通过交换器之间来访问
接下来点开某个交换器看下
5. Queues(列队)
下图是借用别人的图
列队用于存储消息.等待消息被接收.
在理论层面上来看,以上都是生产者需要做的工作.
问题:channel通道和queue队列的区别是什么?
答:
大家有没有做过这样一个实验。假设一个程序(或者一个线程),它有一个通道变量叫做channel,也有一个队列变量叫做queue。当这个线程调用queue.put(“我靠”)之后,再继续调用queue.take(),就可以把”我靠”又取了出来。但是如果这个线程调用channel.write(“我靠”),再调用一万遍channel.read(),你也不可能读到”我靠”了。
这么一说,大家有没有发现本质区别了?
队列对象就是一个存储,你扔东西进去,你自己也可以把它再拿出来。但是初始化通道变量的时候,你必须指定这个通道的另一端。你丢东西进去,就像丢到一个下水管道里面一样,你自己是拿不出来的。只有通道的另一端才可以拿到这个数据。
下面,我们通过在Spring Boot应用中整合RabbitMQ,并实现一个简单的发送、接收消息的例子来对RabbitMQ有一个直观的感受和理解。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
我这里是直接用的rabbitmq默认的guest用户来使用的
application.properties中定义的内容如下
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
@Component
public class Sender {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send() {
String context = "hello " + new Date();
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("hello", context);
}
}
package com.liu.rabbitmqhello;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue() {
return new Queue("hello"); //配置一个名称为"hello"的Queue队列
}
}
@Component
@RabbitListener(queues = "hello")
public class Receiver {
@RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
}
}
@SpringBootApplication
public class RabbitmqHelloApplication {
public static void main(String[] args) {
SpringApplication.run(RabbitmqHelloApplication.class, args);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class HelloApplicationTests {
@Autowired
private Sender sender;
@Test
public void hello() throws Exception {
sender.send();
}
}
完成程序编写之后,下面开始尝试运行。首先确保RabbitMQ Server已经开始,然后进行下面的操作:
同时,我们通过RabbitMQ的控制面板,可以看到Connection和Channels中包含当前连接的条目。
运行单元测试类,我们可以看到控制台中输出下面的内容,消息被发送到了RabbitMQ Server的hello队列中。
切换到应用主类的控制台,我们可以看到类似如下输出,消费者对hello队列的监听程序执行了,并输出了接受到的消息信息。
通过上面的示例,我们在Spring Boot应用中引入spring-boot-starter-amqp模块,进行简单配置就完成了对RabbitMQ的消息生产和消费的开发内容。然而在实际应用中,我们还有很多内容没有演示,这里不做更多的讲解,读者可以自行查阅RabbitMQ的官方教程,有更全面的了解。
转载地址;http://blog.didispace.com/spring-boot-rabbitmq/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。