什么是消息队列?
消息队列(message queue):是一种进程间通信或同一进程的不同线程间的通信方式。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:
消息的发送者和接收者不需要同时与消息队列互交。消息会保存在队列中,直到接收者取回它;
优缺点
消息队列本身是异步的,它允许接受者在消息发送很长时间后再取回消息,这个和大多数通信协议是不同的。例如http协议是同步的,因为客户端在发出请求后必须等待服务器回应。然而,很多情况下我们需要同步的通信协议。
和信号相比,消息队列能够传递更多的信息。与管道相比,消息队列提供了有格式的数据,但消息队列仍有大小限制。
RabbitMq:性能好,支持高并发,基于erlang语言,支持持久化消息:就是mq挂了或者服务器挂了,重新连接后消息不会丢失···
QM特点
mq是消费者-生产者模型的一个典型代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息MQ 和 JMS 类似,但不同的是 JMS是 SUN JAVA 消息中间件服务的一个标准和 API 定义,而 MQ 则是遵循了 AMQP 协议的具体实现和产品。
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端、中间件不同产品,不同的开发语言等条件的限制。
使用场景
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
消息队列RabbitMq
实时性要求不高的场景,通过异步处理程序中产生的消息 第三方实现(软件) RabbitMq 属于MQ产品中的一种底层通过C环境编写,基于Erlang 环境 。
应用场景
1.用户注册(短信、邮件发送操作)
2.日志收集(用户系统操作日志(管理后台),用户行为日志)
3.电商商品页面静态化(Freemarker)
4.电商秒杀场景(流量削峰)
5.电商中高并发场景下订单
···
RabbitMq
RabbitMq 下载与安装
1.下载erlang并安装
先下载指定版本Erlang 软件 版本对照参考:http://www.rabbitmq.com/which-erlang.html
安装Erlang (与普通软件安装没有区别)
2.下载并安装Rabbitm
下载地址 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9.exe
安装RabbitMq (与普通软件安装没有区
3. 校验RabbitMq是否安装成功
rabbitmqctl status 校验Rabbitmq安装状态
rabbitmq-plugins.bat list 列表展示Rabbitmq支持的插件列表
rabbitmq-plugins.bat enable rabbitmq_management 启用管理控制台
4.连接rabbitmq服务器
1270.0.1:15672 ---- 用户名:guest 密码:guest
RabbitMq 的用户角色分类
none、management、policymaker、monitoring、administrator
RabbitMq的几种模式
http://www.rabbitmq.com/getstarted.html
Spring集成RabbitMq
1.添加依赖
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.6.5.RELEASE</version>
</dependency>
2.通过加载配置文件
添加配置文件Rabbitmq.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit.xsd" >
<context:component-scan base-package="com.shsxt"></context:component-scan>
<!--
rabbitmq 基本配置
-->
<!--
连接工厂配置
-->
<rabbit:connection-factory id="connectionFactory" host="127.0.0.1" port="5672" username="xxx" password="xxx" virtual-host="/xxx"></rabbit:connection-factory>
<rabbit:admin connection-factory="connectionFactory"></rabbit:admin>
<!--
交换机
队列
模板类
监听容器
-->
<rabbit:topic-exchange name="springExchange">
<rabbit:bindings>
<rabbit:binding pattern="test.#" queue="myQueue"></rabbit:binding>
<rabbit:binding pattern="sms.#" queue="spring_sms"></rabbit:binding>
<rabbit:binding pattern="mail.#" queue="spring_mail"></rabbit:binding>
</rabbit:bindings>
</rabbit:topic-exchange>
<!--
指定队列
-->
<rabbit:queue name="myQueue"></rabbit:queue>
<rabbit:queue name="spring_sms"></rabbit:queue>
<rabbit:queue name="spring_mail"></rabbit:queue>
<!--
模板类
-->
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="springExchange" routing-key="test" ></rabbit:template>
<!--
监听容器
-->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener ref="testService" method="test" queue-names="myQueue"></rabbit:listener>
<rabbit:listener ref="testService" method="sms" queue-names="spring_sms"></rabbit:listener>
<rabbit:listener ref="testService" method="mail" queue-names="spring_mail"></rabbit:listener>
</rabbit:listener-container>
</beans>
编写一个消费 TestService的类
@Service
public class TestService {
public void test(Object obj){
System.out.println("消费者获取到消息-->"+obj);
}
public void sms(Object obj){
System.out.println("短信发送消费方收到消息-->msg"+obj);
}
public void mail(Object obj){
System.out.println("邮件发送消费方收到消息-->msg:"+obj);
}
}
添加测试方法
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("rabbitmq.xml");
AmqpTemplate ampqTemplate = (AmqpTemplate) applicationContext.getBean("amqpTemplate");
//amqpTemplate.convertAndSend("hello spring rabbitmq");
ampqTemplate.convertAndSend("springExchange","mail","ch@163.com");
}
}