消息队列技术是分布式应用间交换信息的一种技术。使用消息队列能够很好的将任务以异步的方式进行处理或者进行数据传送和储存等。例如当你频繁地向数据库中插入数据、频繁的向搜索引擎提交数据,就可采起消息队列来异步插入。另外,还能够将较慢/较复杂的处理逻辑、有并发数量限制的处理逻辑,经过消息队列放在后台处理。
常规的使用场景:短信服务、电子邮件服务、图片处理服务、好友动态推送服务等。
特性:异步、顺序读写、高性能、协议简单。因此通常会用于解决大量的服务器端异步请求,同时能够实现服务端的负载均衡和业务的容灾。html
ActiveMQ简介java
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个彻底支持JMS1.1和J2EE
1.4规范的 JMS Provider实现,尽管JMS规范出台已是好久的事情了,可是JMS在当今的J2EE应用中间仍然扮演着特殊的地位spring
消息模型: 点对点(p2p)、发布/广播(Pub/Sub)。数据库
流程:apache
p2p:消息生产者>消息队列>消息消费者django
Pub/Sub:主题>发布者>订阅者缓存
ActiveMQ准备性能优化
apache官网下载activeMQ:服务器
activemq.apache.org/download.ht…session
进行解压后运行其bin目录下面的win32或者win64文件夹下的activemq.bat文件启动activeMQ。
Maven配置
配置connectionFactory
connectionFactory是Spring用于建立到JMS服务器连接的,Spring提供了多种connectionFactory.
PooledConnectionFactory: JmsTemlate每次发送消息时只会缓存connection,session和productor,不会缓存consumer。所以只适合于生产者发送消息,这个只是在要求消息处理的及时性不是特别高的状况下。
SingleConnectionFactory: 对于创建JMS服务器连接的请求会一直返回同一个连接,而且会忽略Connection的close方法调用。
CachingConnectionFactory: 继承了SingleConnectionFactory,因此它拥有SingleConnectionFactory的全部功能,同时它还新增了缓存功能,它能够缓存Session、MessageProducer和MessageConsumer。咱们使用CachingConnectionFactory来做为示例。
在此我向你们推荐一个架构学习交流群。交流学习群号:478030634 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
Spring配置
applicationContext.xml 设置:
<!-- 获取ActiveMQ提供的ConnectionFactory --> <amq:connectionFactory id="amqConnectionFactory" <!--设置ActiveMQ服务器地址及端口--> brokerURL="failover:(tcp://localhost:61616)?initialReconnectDelay=100" /> <!-- 配置ActiveMQ服务器链接conneciotnFactory --> <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <!-- 将ActiveMQ提供的ConnectionFactory注入到Spring管理的connectionFactory中 --> <constructor-arg ref="amqConnectionFactory" /> <!--设置缓存大小--> <property name="sessionCacheSize" value="100" /> </bean> <!-- 配置JMS消息生产者 --> <!-- Spring提供的JMS工具类,它能够进行消息发送、接收等 --> <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate"> <constructor-arg ref="connectionFactory" /> <!-- 非pub/sub模型(发布/订阅),即队列模式 --> <property name="pubSubDomain" value="false" /> </bean> <!-- 定义Queue监听器 --> <jms:listener-container concurrency="10" destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto"> <!--监听的java类--> <jms:listener destination="queue" ref="ConsumerMessageListener" /> </jms:listener-container> 复制代码
实现消息监听,获取消息并消费