ActiveMQ简介
ActiveMQ面试题及答案
ActiveMQ面试题及答案1、什么是ActiveMQ?activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
2、Activemq的瓶颈值根据网上一般评测文档上来看,每秒的消息吞吐在2000以上, acticemq 也可以集群化部署,也是使用zookeeper来搭建。
3、ActiveMQ服务器宕机怎么办?这得从ActiveMQ的储存机制说起。
在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的<systemUsage>节点中配置。
但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。
虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。
那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以下实验:设置2G左右的持久化文件限制,大量生产持久化消息直到文件达到最大限制,此时生产者阻塞,但消费者可正常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息,服务自动恢复正常。
设置2G左右的临时文件限制,大量生产非持久化消息并写入临时文件,在达到最大限制时,生产者阻塞,消费者可正常连接但不能消费消息,或者原本慢速消费的消费者,消费突然停止。
整个系统可连接,但是无法提供服务,就这样挂了。
具体原因不详,解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。
4、AcitveMQ的作用、原理?(生产者、消费者。
p2p、订阅实现流程)Activemq的作用就是系统之间进行通信。
当然可以使用其他方式进行系统间通信,如果使用Activemq的话可以对系统之间的调用进行解耦,实现系统间的异步通信。
activemq面试题
activemq面试题ActiveMQ是一种开源的消息中间件,常用于解决系统之间的异步通信,提供高可靠性、高性能的消息传递服务。
在面试中,考官可能会询问与ActiveMQ相关的知识点,下面是一些常见的面试题及其答案。
1. 什么是ActiveMQ?ActiveMQ是一个基于Java的开源消息中间件,它实现了Java Message Service (JMS)的规范,并提供了高性能、高可靠性的消息传递服务。
它支持多种传输协议,包括TCP、UDP、HTTP等。
2. 请简要说明ActiveMQ的特点和优势。
ActiveMQ具有以下特点和优势:- 可靠性:提供消息持久化机制,确保消息在发送和接收过程中的可靠性。
- 高性能:使用异步发送和接收机制,在传输层面提高了性能。
- 可扩展性:支持多种消息传输协议和编程语言,能够轻松与不同的应用集成。
- 支持多种通信模型:支持点对点和发布/订阅两种常见的通信模型。
- 容错性:支持主备、集群等模式,提供了高可用性的消息传递服务。
3. 请说明点对点通信和发布/订阅通信模型的区别。
点对点通信模型中,消息的生产者将消息发送到一个队列中,消息的消费者从队列中接收消息。
每个消息只能被一个消费者接收,消息的传递是一对一的关系。
发布/订阅通信模型中,消息的生产者将消息发送到一个主题中,多个消费者可以订阅该主题并接收消息。
每个消息可以被多个消费者接收,消息的传递是一对多的关系。
4. ActiveMQ如何保证消息的可靠性?ActiveMQ通过持久化机制保证消息的可靠性。
当一个消息被发送到队列或主题时,ActiveMQ会将该消息保存到磁盘上。
即使在ActiveMQ服务崩溃或重启后,也能够保证消息不会丢失。
另外,ActiveMQ还提供了事务机制,可以将发送和接收操作绑定到一个事务中进行管理,以保证消息的完整性。
5. ActiveMQ的集群模式是如何实现的?ActiveMQ可以通过使用Networks of Brokers(简称NoB)来实现集群模式。
activemq用法
activemq用法ActiveMQ是一个消息中间件,它实现了Java Message Service (JMS)规范,通过提供高性能、可靠的消息传递机制,帮助开发人员构建分布式系统和异步应用程序。
以下是关于ActiveMQ的一些常见用法:1. 消息队列:ActiveMQ允许应用程序通过消息队列进行异步通信。
发送方将消息放入队列中,接收方可以从队列中获取消息进行处理。
这种方式可以实现解耦和异步处理,提高应用程序的可伸缩性和性能。
2. 发布/订阅模型:ActiveMQ还提供了发布/订阅模型,允许发布者将消息发布到主题(Topic),然后订阅者可以从主题中订阅消息进行处理。
这种模型适用于广播和通知场景,可以实现消息的多播。
3. 消息传递可靠性:ActiveMQ提供了多种机制来确保消息传递的可靠性。
包括持久化存储、消息重发机制、事务机制等。
持久化存储可以确保即使在应用程序关闭或崩溃后,消息也不会丢失。
消息重发机制可以确保消息在网络故障或其他错误情况下的可靠传递。
4. 消息过滤和选择:ActiveMQ允许消费者使用消息选择器来选择订阅的消息。
通过指定一些条件,可以筛选出需要处理的消息,减少消费者的工作量和网络传输的开销。
5. 点对点和异步处理:ActiveMQ支持点对点的消息传递方式,也支持异步消息处理。
可以将消息发送到指定的队列,然后异步地处理消息,提高应用程序的整体性能和吞吐量。
6. 集成Spring框架:ActiveMQ与Spring框架可以很好地集成,Spring提供了ActiveMQ的连接工厂(ConnectionFactory)和JmsTemplate等组件,简化了ActiveMQ的使用和配置。
7. 监控和管理:ActiveMQ提供了Web控制台和JMX接口,用于监控和管理ActiveMQ服务器。
可以查看连接数、队列状态、消息的发送和接收情况等,并可以进行动态配置和调整。
总之,ActiveMQ是一个功能强大的消息中间件,可以帮助开发人员实现可靠、高性能的消息传递。
ActiveMQ的介绍及使用实例.
ActiveMQ的介绍及使⽤实例.今天就来说下这个项⽬中使⽤ActiveMQ的情况, MQ: message queue, 顾名思义就是消息队列的意思.⼀: 使⽤场景:消息队列在⼤型电⼦商务类⽹站,如京东、淘宝、去哪⼉等⽹站有这深⼊的应⽤,队列的主要作⽤是消除⾼并发访问⾼峰,加快⽹站的响应速度。
在不使⽤消息队列的情况下,⽤户的请求数据直接写⼊数据库,在⾼并发的情况下,会对数据库造成巨⼤的压⼒,同时也使得系统响应延迟加剧。
在使⽤队列后,⽤户的请求发给队列后⽴即返回(当然不能直接给⽤户提⽰订单提交成功,京东上提⽰:您“您提交了订单,请等待系统确认”),再由消息队列的消费者进程从消息队列中获取数据,异步写⼊数据库。
由于消息队列的服务处理速度远快于数据库,因此⽤户的响应延迟可得到有效改善。
那么在babasport这个项⽬中, 我们可以在上架的时候使⽤消息队列的模式:我们之前在点击⼀款商品上架的时候, 我们需要分成2步, 第⼀: 更新商品表中该商品的上架状态. 第⼆: 将该商品信息保存到Solr服务器中. 那么如果我们使⽤了消息队列后, 第⼆步就可以使⽤发送message来异步完成.消息队列可以接收消息和发送消息消息队列类型:队列:⼀对⼀聊天私聊 QQ主题(订阅模式):⼀对多聊天群聊 QQ名词解释:⼆, 代码原型ActiveMQ需要部署到Linux系统下, 这⾥就不再做概述.这⾥也是tar包, 导⼊到linux下直接解压启动即可, 前⾯已经有过很多博⽂讲Linux下⼀些常⽤软件的安装步骤.上架代码原型:项⽬构件图:未使⽤ActiveMQ前ProductServiceImpl.cs:1//上架2public void isShow(Long[] ids){3 Product product = new Product();4 product.setIsShow(true);5for (final Long id : ids) {6//上下架状态7 product.setId(id);8 productDao.updateByPrimaryKeySelective(product);910//这个地⽅的代码应该在babasport-solr中写, 现在使⽤ActiveMQ进⾏迁移.11//TODO 保存商品信息到Solr服务器12 SolrInputDocument doc = new SolrInputDocument();13//ID14 doc.setField("id", id);15//名称16 Product p = productDao.selectByPrimaryKey(id);17 doc.setField("name_ik", p.getName());18//图⽚URL19 doc.setField("url", p.getImgUrls()[0]);20//品牌 ID21 doc.setField("brandId", p.getBrandId());22//价格 sql查询语句: select price from bbs_sku where product_id = ? order by price asc limit 123 SkuQuery skuQuery = new SkuQuery();24 skuQuery.createCriteria().andProductIdEqualTo(id);25 skuQuery.setOrderByClause("price asc");26 skuQuery.setPageNo(1);27 skuQuery.setPageSize(1);28 List<Sku> skus = skuDao.selectByExample(skuQuery);29 doc.setField("price", skus.get(0).getPrice());30//...时间等剩下的省略3132try {33 solrServer.add(doc);34 mit();35 } catch (Exception e) {36// TODO Auto-generated catch block37 e.printStackTrace();3940414243//TODO 静态化44 }45 }上⾯的代码除了更改本来就该更改的商品状态信息外, 还去见商品信息保存到了Solr服务器中了. 这⾥我们使⽤ActiveMQ进⾏改造: 使⽤ActiveMQ后的ProductServiceImpl.cs:1//上架2public void isShow(Long[] ids){3 Product product = new Product();4 product.setIsShow(true);5for (final Long id : ids) {6//上下架状态7 product.setId(id);8 productDao.updateByPrimaryKeySelective(product);910//发送商品ID到ActiveMQ即可.11 jmsTemplate.send(new MessageCreator() {1213 @Override14public Message createMessage(Session session) throws JMSException {1516return session.createTextMessage(String.valueOf(id));17 }18 });1920//TODO 静态化21 }22 }接着就是配置消息发送⽅(JMS⽣产者) mq.xml:1<beans xmlns="/schema/beans"2 xmlns:xsi="/2001/XMLSchema-instance" xmlns:mvc="/schema/mvc"3 xmlns:context="/schema/context"4 xmlns:aop="/schema/aop"5 xmlns:tx="/schema/tx"6 xmlns:task="/schema/task"7 xmlns:dubbo="/schema/dubbo"8 xsi:schemaLocation="/schema/beans9 /schema/beans/spring-beans-4.0.xsd10 /schema/mvc11 /schema/mvc/spring-mvc-4.0.xsd12 /schema/context13 /schema/context/spring-context-4.0.xsd14 /schema/aop15 /schema/aop/spring-aop-4.0.xsd16 /schema/tx17 /schema/tx/spring-tx-4.0.xsd18 /schema/task19 /schema/task/spring-task-4.0.xsd20 /schema/dubbo21 /schema/dubbo/dubbo.xsd">222324<!-- 配置Spring 来管理MQ消息队列 , 连接ActiveMQ-->25<!-- 连接⼯⼚, 此⼯⼚由Apache提供 -->26<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">27<!-- 连接地址28在⽹页端访问是:http://192.168.200.128:8161, 但是这⾥是tcp连接, 端⼝号是6161629-->30<property name="brokerURL" value="tcp://192.168.200.128:61616"/>31<!-- 设置⽤户名及密码 -->32<property name="userName" value="admin"></property>33<property name="password" value="admin"></property>34</bean>3536<!-- 配置连接池管理⼯⼚ -->37<bean id="pooledConnectionFactoryBean" class="org.apache.activemq.pool.PooledConnectionFactoryBean">38<!-- 注⼊⼯⼚ -->39<property name="connectionFactory" ref="activeMQConnectionFactory"></property>40<!-- 设置最⼤连接数 -->41<property name="maxConnections" value="5"></property>42</bean>4344<!-- 把上⾯的⼯⼚交给Spring管理 -->45<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">46<!-- 注⼊上⾯的⼯⼚ -->47<property name="targetConnectionFactory" ref="pooledConnectionFactoryBean"></property>4950<!-- 使⽤Spring提供的jmsTemplate模板来操作ActiveMQ -->51<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">52<!-- 注⼊Spring单例⼯⼚ -->53<property name="connectionFactory" ref="singleConnectionFactory"></property>54<!-- 设置默认的⽬标管道 -->55<property name="defaultDestinationName" value="pId"/>56</bean>57</beans>配置说明: 这⾥是⾸先构建⼀个MQ的连接⼯⼚, 只要ActiveMQ启动后就可以这样构建连接了. 配置登录的⽤户名和和密码.接着就是配置连接池, 把连接⼯⼚交给连接池去管理. 这些都是Apache⼚商提供的.接着就是再将连接池交由Spring管理.最后我们再来配置⼀个jmsTemplate模板来操作ActiveMQ, 这个类似于jdbcTemplate模板. ⽽且我们这个⾥⾯注⼊了⼀个默认的管道, 也就是productId,因为我们现在是传递消息⼀⼀去对应, 关于怎么对应就是依赖于这个管道.接下来我们就看下消息的接收⽅(JMS消费者)的⼀些东西:消费者的⽬录结构:(Solr)Solr项⽬中的ActiveMQ配置⽂件mq.xml:1<beans xmlns="/schema/beans"2 xmlns:xsi="/2001/XMLSchema-instance" xmlns:mvc="/schema/mvc"3 xmlns:context="/schema/context"4 xmlns:aop="/schema/aop"5 xmlns:tx="/schema/tx"6 xmlns:task="/schema/task"7 xmlns:dubbo="/schema/dubbo"8 xsi:schemaLocation="/schema/beans9 /schema/beans/spring-beans-4.0.xsd10 /schema/mvc11 /schema/mvc/spring-mvc-4.0.xsd12 /schema/context13 /schema/context/spring-context-4.0.xsd14 /schema/aop15 /schema/aop/spring-aop-4.0.xsd16 /schema/tx17 /schema/tx/spring-tx-4.0.xsd18 /schema/task19 /schema/task/spring-task-4.0.xsd20 /schema/dubbo21 /schema/dubbo/dubbo.xsd">222324<!-- 配置Spring 来管理MQ消息队列 , 连接ActiveMQ-->25<!-- 连接⼯⼚, 此⼯⼚由Apache提供 -->26<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">27<!-- 连接地址28在⽹页端访问是:http://192.168.200.128:8161, 但是这⾥是tcp连接, 端⼝号是6161629-->30<property name="brokerURL" value="tcp://192.168.200.128:61616"/>31<!-- 设置⽤户名及密码 -->32<property name="userName" value="admin"></property>33<property name="password" value="admin"></property>34</bean>3536<!-- 配置连接池管理⼯⼚ ,由Apache提供.-->37<bean id="pooledConnectionFactoryBean" class="org.apache.activemq.pool.PooledConnectionFactoryBean">38<!-- 注⼊⼯⼚ -->39<property name="connectionFactory" ref="activeMQConnectionFactory"></property>40<!-- 设置最⼤连接数 -->41<property name="maxConnections" value="5"></property>42</bean>4344<!-- 把上⾯的⼯⼚交给Spring管理 -->45<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">46<!-- 注⼊上⾯的⼯⼚ -->47<property name="targetConnectionFactory" ref="pooledConnectionFactoryBean"></property>48</bean>4950<!-- 使⽤Spring提供的jmsTemplate模板来操作ActiveMQ -->51<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">52<!-- 注⼊Spring单例⼯⼚ -->53<property name="connectionFactory" ref="singleConnectionFactory"></property>54<!-- 设置默认的⽬标管道 -->55<property name="defaultDestinationName" value="pId"/>56</bean>5758<!-- 实例化⼀个监听到消息后处理此消息的类 -->59<bean id="customMessageListener" class="cn.itcast.core.service.message.CustomMessageListener"/>6061<!-- 配置实时监听器 -->62<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">63<!-- 配置⼯⼚, 需要配置spirng的⼯⼚ -->64<property name="connectionFactory" ref="singleConnectionFactory"/>65<!-- 设置监听的⽬标 -->66<property name="destinationName" value="pId"/>67<!-- 监听后获取消息的类, 接收监听到的消息 -->68<property name="messageListener" ref="customMessageListener"></property>69</bean>70</beans>我们来说下和上⾯配置不同的地⽅, 我们在这⾥配置了⼀个监听器, 因为接收到 JMS ⽣产者发过来的消息后我们需要有个监听器去监听且将监听到的消息拿过来处理.接下来看看监听器的处理⽅法做了些什么事情:CustomMessageListener.java:1/*2 * 接收MQ中的消息3*/4public class CustomMessageListener implements MessageListener{5 @Autowired6private SearchService searchService;78 @Override9public void onMessage(Message message) {10//先将接收到的消息强转为ActiveMQ类型的消息11//因为在消息发送⽅那边传递的是Text类型的消息对象, 所以需要转成ActiveMQTextMessage12 ActiveMQTextMessage amtm = (ActiveMQTextMessage)message;13try {14 String id = amtm.getText();15 System.out.println("接收到的ID:"+id);16 searchService.insertProductToSolr(Long.parseLong(id));17 } catch (JMSException e) {18// TODO Auto-generated catch block19 e.printStackTrace();20 }21 }因为我们接收到的是string类型的⽂本, 所以这⾥我们直接将接收到的消息转换为ActiveMQText类型, 然后通过getText去得到传递过来的id, 然后我们就可以通过这个productId去做相应的操作了.接下来就看保存商品信息到Solr服务器的逻辑:SearchServiceImpl.java:1//保存商品信息到Solr服务器中, 通过ActiveMQ2public void insertProductToSolr(Long productId){3//TODO 保存商品信息到Solr服务器4 SolrInputDocument doc = new SolrInputDocument();5//ID6 doc.setField("id", productId);7//名称8 Product p = productDao.selectByPrimaryKey(productId);9 doc.setField("name_ik", p.getName());10//图⽚URL11 doc.setField("url", p.getImgUrls()[0]);12//品牌 ID13 doc.setField("brandId", p.getBrandId());14//价格 sql查询语句: select price from bbs_sku where product_id = ? order by price asc limit 115 SkuQuery skuQuery = new SkuQuery();16 skuQuery.createCriteria().andProductIdEqualTo(productId);17 skuQuery.setOrderByClause("price asc");18 skuQuery.setPageNo(1);19 skuQuery.setPageSize(1);20 List<Sku> skus = skuDao.selectByExample(skuQuery);21 doc.setField("price", skus.get(0).getPrice());22//...时间等剩下的省略2324try {25 solrServer.add(doc);26 mit();27 } catch (Exception e) {28// TODO Auto-generated catch block29 e.printStackTrace();30 }31 }这样就⽐较明朗了, ActiveMQ 队列就是这样来实现的.====================接下来还会有 ActiveMQ 订阅者模式的⽰例, 这⾥只是⽣产者发送消息给单个消费者, 下次还会更新⽣产者发送消息给多个消费者.2016/09/04 20:32 更新上⾯已经说了消息的队列模式, 及点对点发送消息, 那么接下来就来说下消息的⼀对多模式, 也就是发布/订阅模式.项⽬原型: 当商品上架后(babasport-product), 发送消息id给solr(babasport-solr)来将商品信息保存到solr服务器和cms(babasport-cms)来对商品详情页⾯做页⾯静态化.===================babasport-product:结构图:babasport-product下的项⽬结构图:ProductServiceImpl.java中的上架:1 @Autowired2private JmsTemplate jmsTemplate;34//上架5public void isShow(Long[] ids){6 Product product = new Product();7 product.setIsShow(true);8for (final Long id : ids) {9//上下架状态10 product.setId(id);11 productDao.updateByPrimaryKeySelective(product);1213//发送商品ID到ActiveMQ即可.14 jmsTemplate.send(new MessageCreator() {1516 @Override17public Message createMessage(Session session) throws JMSException {1819return session.createTextMessage(String.valueOf(id));20 }21 });22 }23 }View Codemq.xml:1<beans xmlns="/schema/beans"2 xmlns:xsi="/2001/XMLSchema-instance" xmlns:mvc="/schema/mvc"3 xmlns:context="/schema/context"4 xmlns:aop="/schema/aop"5 xmlns:tx="/schema/tx"6 xmlns:task="/schema/task"7 xmlns:dubbo="/schema/dubbo"8 xsi:schemaLocation="/schema/beans9 /schema/beans/spring-beans-4.0.xsd10 /schema/mvc11 /schema/mvc/spring-mvc-4.0.xsd12 /schema/context13 /schema/context/spring-context-4.0.xsd14 /schema/aop15 /schema/aop/spring-aop-4.0.xsd16 /schema/tx17 /schema/tx/spring-tx-4.0.xsd18 /schema/task19 /schema/task/spring-task-4.0.xsd20 /schema/dubbo21 /schema/dubbo/dubbo.xsd">222324<!-- 配置Spring 来管理MQ消息队列 , 连接ActiveMQ-->25<!-- 连接⼯⼚, 此⼯⼚由Apache提供 -->26<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">27<!-- 连接地址28在⽹页端访问是:http://192.168.200.128:8161, 但是这⾥是tcp连接, 端⼝号是6161629-->30<property name="brokerURL" value="tcp://192.168.200.128:61616"/>31<!-- 设置⽤户名及密码 -->32<property name="userName" value="admin"></property>33<property name="password" value="admin"></property>34</bean>3536<!-- 配置连接池管理⼯⼚ -->37<bean id="pooledConnectionFactoryBean" class="org.apache.activemq.pool.PooledConnectionFactoryBean">38<!-- 注⼊⼯⼚ -->39<property name="connectionFactory" ref="activeMQConnectionFactory"></property>40<!-- 设置最⼤连接数 -->41<property name="maxConnections" value="5"></property>42</bean>4344<!-- 把上⾯的⼯⼚交给Spring管理 -->45<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">46<!-- 注⼊上⾯的⼯⼚ -->47<property name="targetConnectionFactory" ref="pooledConnectionFactoryBean"></property>48</bean>4950<!-- 使⽤Spring提供的jmsTemplate模板来操作ActiveMQ -->51<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">52<!-- 注⼊Spring单例⼯⼚ -->53<property name="connectionFactory" ref="singleConnectionFactory"></property>54<!-- 设置默认的⽬标管道 -->55<property name="defaultDestinationName" value="pId"/>56<!-- 默认是队列模式, 可改为主题, 发布模式 publish subject -->57<property name="pubSubDomain" value="true"/>58</bean>59</beans>View Code这⾥⾯的最⼤的变化就是将消息发布模式改为了: publish subject.============================================babasport-solr:mq.xml配置⽂件:1<beans xmlns="/schema/beans"2 xmlns:xsi="/2001/XMLSchema-instance" xmlns:mvc="/schema/mvc"3 xmlns:context="/schema/context"4 xmlns:aop="/schema/aop"5 xmlns:tx="/schema/tx"6 xmlns:task="/schema/task"7 xmlns:dubbo="/schema/dubbo"8 xsi:schemaLocation="/schema/beans9 /schema/beans/spring-beans-4.0.xsd10 /schema/mvc11 /schema/mvc/spring-mvc-4.0.xsd12 /schema/context13 /schema/context/spring-context-4.0.xsd14 /schema/aop15 /schema/aop/spring-aop-4.0.xsd16 /schema/tx17 /schema/tx/spring-tx-4.0.xsd18 /schema/task19 /schema/task/spring-task-4.0.xsd20 /schema/dubbo21 /schema/dubbo/dubbo.xsd">222324<!-- 配置Spring 来管理MQ消息队列 , 连接ActiveMQ-->25<!-- 连接⼯⼚, 此⼯⼚由Apache提供 -->26<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">27<!-- 连接地址28在⽹页端访问是:http://192.168.200.128:8161, 但是这⾥是tcp连接, 端⼝号是6161629-->30<property name="brokerURL" value="tcp://192.168.200.128:61616"/>31<!-- 设置⽤户名及密码 -->32<property name="userName" value="admin"></property>33<property name="password" value="admin"></property>34</bean>3536<!-- 配置连接池管理⼯⼚ ,由Apache提供.-->37<bean id="pooledConnectionFactoryBean" class="org.apache.activemq.pool.PooledConnectionFactoryBean">38<!-- 注⼊⼯⼚ -->39<property name="connectionFactory" ref="activeMQConnectionFactory"></property>40<!-- 设置最⼤连接数 -->41<property name="maxConnections" value="5"></property>42</bean>4344<!-- 把上⾯的⼯⼚交给Spring管理 -->45<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">46<!-- 注⼊上⾯的⼯⼚ -->47<property name="targetConnectionFactory" ref="pooledConnectionFactoryBean"></property>48</bean>4950<!-- 使⽤Spring提供的jmsTemplate模板来操作ActiveMQ -->51<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">52<!-- 注⼊Spring单例⼯⼚ -->53<property name="connectionFactory" ref="singleConnectionFactory"></property>54<!-- 设置默认的⽬标管道 -->55<property name="defaultDestinationName" value="pId"/>56</bean>5758<!-- 实例化⼀个监听到消息后处理此消息的类 -->59<bean id="customMessageListener" class="cn.itcast.core.service.message.CustomMessageListener"/> 6061<!-- 配置实时监听器 -->62<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">63<!-- 配置⼯⼚, 需要配置spirng的⼯⼚ -->64<property name="connectionFactory" ref="singleConnectionFactory"/>65<!-- 设置监听的⽬标 -->66<property name="destinationName" value="pId"/>67<!-- 监听后获取消息的类, 接收监听到的消息 -->68<property name="messageListener" ref="customMessageListener"></property>69<!-- 默认是队列模式, 可改为主题, 发布模式 publish subject -->70<property name="pubSubDomain" value="true"/>71</bean>72</beans>View CodeSearchServiceImpl.java: 保存商品信息到Solr服务器中, 通过ActiveMQ1//保存商品信息到Solr服务器中, 通过ActiveMQ2public void insertProductToSolr(Long productId){3//TODO 保存商品信息到Solr服务器4 SolrInputDocument doc = new SolrInputDocument();5//ID6 doc.setField("id", productId);7//名称8 Product p = productDao.selectByPrimaryKey(productId);9 doc.setField("name_ik", p.getName());10//图⽚URL11 doc.setField("url", p.getImgUrls()[0]);12//品牌 ID13 doc.setField("brandId", p.getBrandId());14//价格 sql查询语句: select price from bbs_sku where product_id = ? order by price asc limit 115 SkuQuery skuQuery = new SkuQuery();16 skuQuery.createCriteria().andProductIdEqualTo(productId);17 skuQuery.setOrderByClause("price asc");18 skuQuery.setPageNo(1);19 skuQuery.setPageSize(1);20 List<Sku> skus = skuDao.selectByExample(skuQuery);21 doc.setField("price", skus.get(0).getPrice());22//...时间等剩下的省略2324try {25 solrServer.add(doc);26 mit();27 } catch (Exception e) {28// TODO Auto-generated catch block29 e.printStackTrace();30 }31 }View CodeCustomMessageListener.java: 监听ActiveMQ中传递过来的消息, 且对传递过来的消息进⾏处理: 1public class CustomMessageListener implements MessageListener{2 @Autowired3private SearchService searchService;45 @Override6public void onMessage(Message message) {7//先将接收到的消息强转为ActiveMQ类型的消息8//因为在消息发送⽅那边传递的是Text类型的消息对象, 所以需要转成ActiveMQTextMessage9 ActiveMQTextMessage amtm = (ActiveMQTextMessage)message;10try {11 String id = amtm.getText();12 System.out.println("接收到的ID:"+id);13 searchService.insertProductToSolr(Long.parseLong(id));14 } catch (JMSException e) {15// TODO Auto-generated catch block16 e.printStackTrace();17 }18 }19 }===============================babasport-cms:mq.xml:1<!-- 配置Spring 来管理MQ消息队列 , 连接ActiveMQ-->2<!-- 连接⼯⼚, 此⼯⼚由Apache提供 -->3<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">4<!-- 连接地址5在⽹页端访问是:http://192.168.200.128:8161, 但是这⾥是tcp连接, 端⼝号是616166-->7<property name="brokerURL" value="tcp://192.168.200.128:61616"/>8<!-- 设置⽤户名及密码 -->9<property name="userName" value="admin"></property>10<property name="password" value="admin"></property>11</bean>1213<!-- 配置连接池管理⼯⼚ ,由Apache提供.-->14<bean id="pooledConnectionFactoryBean" class="org.apache.activemq.pool.PooledConnectionFactoryBean"> 15<!-- 注⼊⼯⼚ -->16<property name="connectionFactory" ref="activeMQConnectionFactory"></property>17<!-- 设置最⼤连接数 -->18<property name="maxConnections" value="5"></property>19</bean>2021<!-- 把上⾯的⼯⼚交给Spring管理 -->22<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"> 23<!-- 注⼊上⾯的⼯⼚ -->24<property name="targetConnectionFactory" ref="pooledConnectionFactoryBean"></property>25</bean>2627<!-- 使⽤Spring提供的jmsTemplate模板来操作ActiveMQ -->28<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">29<!-- 注⼊Spring单例⼯⼚ -->30<property name="connectionFactory" ref="singleConnectionFactory"></property>31<!-- 设置默认的⽬标管道 -->32<property name="defaultDestinationName" value="pId"/>33</bean>3435<!-- 实例化⼀个监听到消息后处理此消息的类 -->36<bean id="customMessageListener" class="cn.itcast.core.service.message.CustomMessageListener"/>3738<!-- 配置实时监听器 -->39<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">40<!-- 配置⼯⼚, 需要配置spirng的⼯⼚ -->41<property name="connectionFactory" ref="singleConnectionFactory"/>42<!-- 设置监听的⽬标 -->43<property name="destinationName" value="pId"/>44<!-- 监听后获取消息的类, 接收监听到的消息 -->45<property name="messageListener" ref="customMessageListener"></property>46<!-- 默认是队列模式, 可改为主题, 发布模式 publish subject -->47<property name="pubSubDomain" value="true"/>48</bean>View CodeCustomMessageListener.java: 监听ActiveMQ中传递过来的消息, 且对传递过来的消息进⾏处理:1public class CustomMessageListener implements MessageListener{2 @Autowired3private StaticPageService staticPageService;4 @Autowired5private CMSService cmsService;67 @Override8public void onMessage(Message message) {9//先将接收到的消息强转为ActiveMQ类型的消息10//因为在消息发送⽅那边传递的是Text类型的消息对象, 所以需要转成ActiveMQTextMessage11 ActiveMQTextMessage amtm = (ActiveMQTextMessage)message;12try {13 String id = amtm.getText();14 System.out.println("CMS接收到的ID:"+id);15 Map<String, Object> root = new HashMap<String, Object>();1617 Product product = cmsService.selectProductById(Long.parseLong(id));18 List<Sku> skus = cmsService.selectSkuListByProductIdWithStock(Long.parseLong(id));19//去掉重复的颜⾊20 Set<Color> colors = new HashSet<Color>();21for (Sku sku : skus) {22 colors.add(sku.getColor());24 root.put("colors", colors);25 root.put("product", product);26 root.put("skus", skus);2728 staticPageService.index(root, id);29 } catch (JMSException e) {30// TODO Auto-generated catch block31 e.printStackTrace();32 }33 }34 }View CodeStaticPageServiceImpl.java: 静态化页⾯的核⼼类:1public class StaticPageServiceImpl implements StaticPageService, ServletContextAware{2//SpringMvc 管理 conf3private Configuration conf;4public void setFreeMarkerConfig(FreeMarkerConfig freeMarkerConfig) {5this.conf = freeMarkerConfig.getConfiguration();6 }78//静态化页⾯的⽅法9public void index(Map<String, Object> root, String id){10//输出⽬录: 通过getPath⽅法获取的是绝对路径11 String path = getPath("/html/product/" + id +".html");12 File f = new File(path);13 File parentFile = f.getParentFile();14if(!parentFile.exists()){15 parentFile.mkdirs();16 }1718//spring中已经设置了模板路径:<property name="templateLoaderPath" value="/WEB-INF/ftl/" /> 19 Writer out = null;2021try {22//读23 Template template = conf.getTemplate("product.html");2425//设置输出的位置26//写27 out = new OutputStreamWriter(new FileOutputStream(f), "UTF-8");28 template.process(root, out);29 } catch (Exception e) {30// TODO Auto-generated catch block31 e.printStackTrace();32 }finally {33if (out != null)34 {35try {36 out.close();37 } catch (IOException e) {38// TODO Auto-generated catch block39 e.printStackTrace();40 }41 }4243 }4445 }4647//获取webapp下的html⽂件夹所在的位置48//将相对路径转换为绝对路径49public String getPath(String path){50return servletContext.getRealPath(path);51 }5253private ServletContext servletContext;54 @Override55public void setServletContext(ServletContext servletContext) {56this.servletContext = servletContext;57 }58 }View CodeSpring管理 freemarkerConfig配置类:1<!-- 配置freemarker 实现类 -->2<bean class="cn.itcast.core.service.StaticPageServiceImpl">3<property name="freeMarkerConfig">4<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 5<!-- 设置模板所在⽬录或⽂件夹的位置, 相对路径 -->6<property name="templateLoaderPath" value="/WEB-INF/ftl/"/>7<!-- 设置默认编码集 -->8<property name="defaultEncoding" value="UTF-8"></property>9</bean>10</property>11</bean>View Code更多关于freemarker的讲解请关注我以后的博客...关于ActiveMQ的内容就更新到这么多.。
ActiveMQ培训教程
一、ActiveMQ介绍 二、ActiveMQ安装配置 三、ActiveMQ架构 四、ActiveMQ消息模式 四、 消息模式 五、Java for ActiveMQ
入门实例
实例说明:
ActiveMQ发送和异步接受文本类型消息的简单功能 , 采用PTP模式
MQBroker
类com.honno.activemq.MQBroker负责启动ActiveMQ的消息代理。 代码片段: BrokerService broker = new BrokerService(); try { broker.addConnector("tcp://localhost:61616"); broker.start(); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }
谢谢
1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, P HP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP 。 2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务) 3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而 且也支持Spring2.0的特性 4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试, 其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署 到任何兼容J2EE 1.4 商业服务器上 5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA 6. 支持通过JDBC和journal提供高速的消息持久化 7. 从设计上保证了高性能的集群,客户端-服务器,点对点 8. 支持Ajax 9. 支持与Axis的整合 10. 可以很容易得调用内嵌JMS provider,进行测试
activemq面试题及答案
activemq面试题及答案ActiveMQ是一款广泛使用的开源消息中间件,常常用于构建高性能、可靠的分布式系统。
在面试过程中,你可能会遇到与ActiveMQ相关的问题。
本文将为您提供一些常见的ActiveMQ面试题及答案,帮助您更好地应对面试。
1. 什么是ActiveMQ?请简要介绍一下。
ActiveMQ是Apache软件基金会的一个开源消息中间件,它实现了Java Message Service(JMS)API,并支持多种消息协议。
ActiveMQ提供了高度扩展性和可靠性,可用于构建可靠的消息传递和事件驱动的应用程序。
2. ActiveMQ有哪些主要特性?- 完全支持JMS规范:ActiveMQ完全实现了JMS规范,提供了丰富的消息传递功能。
- 分布式通信:ActiveMQ支持分布式部署,可以在多个节点之间进行通信。
- 持久化支持:ActiveMQ提供了消息持久化的功能,确保消息在传递过程中不会丢失。
- 高可用性:ActiveMQ支持主从复制和集群模式,提供高可用性和负载均衡的能力。
- 事务支持:ActiveMQ允许将消息发送和接收操作与事务关联,确保消息的原子性。
- 消息过滤:ActiveMQ支持使用SQL标准语句进行消息过滤,满足不同场景下的需求。
3. ActiveMQ与其他消息中间件(如RabbitMQ、Kafka)相比有什么优势?ActiveMQ相较于其他消息中间件,具有以下优势:- 易于使用:ActiveMQ使用简单,支持JMS标准,提供了丰富的功能和易于理解的API。
- 社区活跃:ActiveMQ作为Apache项目,拥有庞大的开发者社区支持,可以获得及时的技术支持和更新。
- 成熟稳定:ActiveMQ经过多年的发展和使用,已经稳定且可靠,在各种场景下都有广泛应用。
- 可扩展性:ActiveMQ提供了可扩展的体系架构,可以根据需求进行横向和纵向扩展,满足高并发和大规模消息处理的需求。
ActiveMQ简介
ActiveMQ简介ActiveMQ简介1. 什么是ActiveMQActiveMQ是⼀种开源的,实现了JMS1.1规范的,⾯向消息(MOM)的中间件,为应⽤程序提供⾼效的、可扩展的、稳定的和安全的企业级消息通信。
ActiveMQ使⽤Apache提供的授权,任何⼈都可以对其实现代码进⾏修改。
ActiveMQ的设计⽬标是提供标准的,⾯向消息的,能够跨越多语⾔和多系统的应⽤集成消息通信中间件。
ActiveMQ实现了JMS标准并提供了很多附加的特性。
这些附加的特性包括,JMX管理(java Management Extensions,即java管理扩展),主从管理(master/salve,这是集群模式的⼀种,主要体现在可靠性⽅⾯,当主中介(代理)出现故障,那么从代理会替代主代理的位置,不⾄于使消息系统瘫痪)、消息组通信(同⼀组的消息,仅会提交给⼀个客户进⾏处理)、有序消息管理(确保消息能够按照发送的次序被接受者接收)。
消息优先级(优先级⾼的消息先被投递和处理)、订阅消息的延迟接收(订阅消息在发布时,如果订阅者没有开启连接,那么当订阅者开启连接时,消息中介将会向其提交之前的,其未处理的消息)、接收者处理过慢(可以使⽤动态负载平衡,将多数消息提交到处理快的接收者,这主要是对PTP消息所说)、虚拟接收者(降低与中介的连接数⽬)、成熟的消息持久化技术(部分消息需要持久化到数据库或⽂件系统中,当中介崩溃时,信息不会丢失)、⽀持游标操作(可以处理⼤消息)、⽀持消息的转换、通过使⽤Apache的Camel可以⽀持EIP、使⽤镜像队列的形式轻松的对消息队列进⾏监控等。
2. ActiveMQ 特性⽀持JMS规范:ActiveMQ完全实现了JMS1.1规范。
JMS规范提供了同步消息和异步消息投递⽅式、有且仅有⼀次投递语义(指消息的接收者对⼀条消息必须接收到⼀次,并且仅有⼀次)、订阅消息持久接收等。
如果仅使⽤JMS规范,表明⽆论您使⽤的是哪家⼚商的消息代理,都不会影响到您的程序。
ActiveMQ之基础讲解篇
ActiveMQ之基础讲解篇文档编号:2020-03-09当前版本:V1.0.0编写者:海带发布时间:2020-03-09修订记录1.概述 (4)1.1ActiveMQ是什么 (4)1.2整体架构 (4)1.2.1相关概念 (4)2.P2P (5)3.Publish (6)4.代码流程 (6)5.存储方式 (7)5.1KahaDB (7)5.2AMQ (8)5.3JDBC (8)5.4内存存储 (9)6.部署模式 (9)6.1单例模式 (9)6.2无共享主从模式 (9)6.3共享存储主从模式 (11)6.3.1基于数据库 (11)6.3.2基于文件系统 (12)7.网络连接 (13)7.1代理网络 (13)7.2网络发现 (14)8.实例 (15)9.性能调优 (15)1.概述本文档为海带中间件系列之ActiveMQ基础篇,描述了ActiveMQ的基本概念、运行机制及单Broker、多Broker的使用方法。
给大家明确一点,ActiveMQ只是一种工具,安装、配置后使用即可,可以简单地集成到Spring等框架中来,就像我们使用MySql数据库一样。
1.1ActiveMQ是什么ActiveMQ是一种MOM,即消息中间件,是用于以分布式应用或系统中的异步、松耦合、可靠、可扩展和安全通信的一类软件。
MOM 的总体思想是它作为消息发送器和消息接收器之间的消息中介,这种中介提供了一个全新水平的松耦合。
JMS 叫做Java 消息服务(Java Message Service),是Java 平台上有关面向MOM 的技术规范,旨在通过提供标准的产生、发送、接收和处理消息的API 简化企业应用的开发,类似于JDBC 和关系型数据库通信方式的抽象。
1.2整体架构1.2.1相关概念●Provider:纯Java 语言编写的JMS 接口实现(如ActiveMQ )●Domains:消息传递方式,包括点对点(P2P)、发布/订阅(Pub/Sub)两种●Connection factory:客户端使用连接工厂来创建与JMS provider 的连接●Destination:消息被寻址、发送以及接收的对象2.P2PP2P (点对点)消息域使用queue 作为Destination,消息可以被同步或异步的发送和接收,每个消息只会给一个Consumer 传送一次。
activemq用法(一)
activemq用法(一)ActiveMQ用法详解概述ActiveMQ是一款开源的,基于JMS(Java消息服务)规范的消息中间件。
它提供了高性能、可靠的消息传递方式,支持多种通信协议。
安装配置1.下载ActiveMQ二进制文件,解压到指定目录。
2.配置ActiveMQ启动脚本,设置JAVA_HOME和ActiveMQ_HOME环境变量。
3.启动ActiveMQ服务器,通过命令行或脚本方式启动。
发送消息•创建连接工厂对象使用ActiveMQConnectionFactory类创建连接工厂对象,需要指定ActiveMQ服务器的地址和端口。
•创建连接对象通过连接工厂对象的createConnection()方法创建连接对象。
•创建会话对象通过连接对象的createSession()方法创建会话对象,可以设置事务和确认模式。
•创建目标对象使用会话对象的createQueue()或createTopic()方法创建目标对象,分别代表点对点和发布订阅模式。
•创建消息生产者对象通过会话对象的createProducer()方法创建消息生产者对象。
•创建消息对象使用会话对象的createTextMessage()方法创建文本消息对象,可以设置消息内容。
•发送消息通过消息生产者对象的send()方法发送消息。
接收消息•创建连接工厂对象、连接对象、会话对象和目标对象同上。
•创建消息消费者对象通过会话对象的createConsumer()方法创建消息消费者对象。
•注册消息监听器通过消息消费者对象的setMessageListener()方法注册消息监听器,实现对消息的接收和处理。
•接收消息在消息监听器的onMessage()方法中处理接收到的消息。
消息持久化•配置持久化方式在ActiveMQ的配置文件中配置消息持久化方式,可以选择将消息持久化到磁盘,从而保证消息的持久性。
消息传递模式•点对点模式点对点模式下,消息发送者将消息发送到一个指定的队列,消息接收者从队列中接收消息。
ActiveMQ入门
ActiveMQ介绍ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。
ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
主要特点:1. 多种语言和协议编写客户端。
语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。
应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP2. 完全支持JMS1.1和J2EE 1.4规范(持久化,XA消息,事务)3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性4. 通过了常见J2EE服务器(如Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA6. 支持通过JDBC和journal提供高速的消息持久化7. 从设计上保证了高性能的集群,客户端-服务器,点对点8. 支持Ajax9. 支持与Axis的整合10. 可以很容易得调用内嵌JMS provider,进行测试JMS介绍jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。
ACTIVEMQ入门教程
ACTIVEMQ入门教程ActiveMQ是一个开源的消息中间件,它具有高性能、可靠性和可扩展性的特点,可以在分布式系统中处理大量的消息通信。
本教程将介绍如何入门使用ActiveMQ,包括安装配置、基本概念和使用方法等。
一、安装配置3. 启动ActiveMQ:进入解压目录,找到bin文件夹,执行activemq命令(Windows下执行activemq.bat,Linux下执行activemq.sh)。
5. 配置连接信息:在管理控制台中,可以配置ActiveMQ的连接信息,包括端口号、用户名、密码等。
二、基本概念1. Broker:Broker是ActiveMQ中的核心组件,负责接收和分发消息。
一个Broker可以同时连接多个生产者和消费者。
2. Destination:Destination是消息发送和接收的目的地。
可以分为两种类型:Queue和Topic。
Queue用于Point-to-Point的消息通信,每个消息只能被一个消费者接收;Topic用于Publish/Subscribe的消息通信,每个消息可以被多个订阅者接收。
3. Producer:Producer是消息的发送者,负责将消息发送到Broker的Destination中。
4. Consumer:Consumer是消息的接收者,负责从Broker的Destination中接收消息。
5. Message:Message是ActiveMQ中的消息对象,包含消息的内容和一些元数据信息。
三、使用方法1. 发送和接收消息:首先需要创建一个连接,并创建一个会话。
然后创建一个Destination,并创建一个Producer发送消息到该Destination中。
接收消息的方法类似,创建一个Destination,并创建一个Consumer用于接收消息。
2. 消息过滤:可以通过消息选择器来过滤消息。
消息选择器使用SQL-92语法来选择消息。
例如,可以通过消息属性来选择消息:consumer.receive("color = 'red'")。
ActiveMQ简介
ActiveMQ简介我们都知道ActiveMQ是消息中间件,⾸先我们先来了解下⼀些相关的概念;消息“消息”是在两台计算机间传送的数据单位。
消息可以⾮常简单,例如只包含⽂本字符串;也可以更复杂,可能包含嵌⼊对象。
消息队列“消息队列”是在消息的传输过程中保存消息的容器,消息队列管理器在将消息从它的源中继到它的⽬标时充当中间⼈,队列的主要⽬的是提供路由并保证消息的传递;如果发送消息时接收者不可⽤,消息队列会保留消息,直到可以成功地传递它。
消息队列的特点消息队列的主要特点是异步处理,主要⽬的是减少请求响应时间和解耦。
所以主要的使⽤场景就是将⽐较耗时⽽且不需要即时(同步)返回结果的操作作为消息放⼊消息队列。
同时由于使⽤了消息队列,只要保证消息格式不变,消息的发送⽅和接收⽅并不需要彼此联系,也不需要受对⽅的影响,即解耦和。
ActiveMQ简介ActiveMQ是Apache软件基⾦会所研发的开放源代码消息中间件;由于ActiveMQ是⼀个纯Java程序,因此只需要操作系统⽀持Java虚拟机,ActiveMQ便可执⾏。
对Spring的⽀持,ActiveMQ可以很容易内嵌到使⽤Spring的系统⾥⾯去通过了常见J2EE服务器的测试ActiveMQ⾓⾊介绍1,Destination ⽬的地,消息发送者需要指定Destination才能发送消息,接收者需要指定Destination才能接收消息。
2,Producer 消息⽣产者,负责发送Message到⽬的地3,Consumer/Receiver 消息消费者,负责从⽬的地中消费(处理/监听/订阅)Message4,Message 消息消息封装⼀次通信的内容。
这⾥我们在spring整合ActiveMQ来写个⼩例⼦.先创建⼀个maven项⽬,并在pom.xml添加相关依赖,如下:<dependencies><!-- ActiveMQ客户端完整jar包依赖 --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>5.9.0</version></dependency><!-- ActiveMQ和Spring整合配置⽂件标签处理jar包依赖 --><dependency><groupId>org.apache.xbean</groupId><artifactId>xbean-spring</artifactId><version>4.5</version></dependency><!-- Spring-JMS插件相关jar包依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>4.1.6.RELEASE</version></dependency><!-- Spring框架上下⽂jar包依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.6.RELEASE</version></dependency></dependencies>然后定义消息载体类型. 即要在ActiveMQ中传递的数据实体类型,消息载体对象必须实现接⼝java.io.Serializable, 因为消息需要在⽹络中传递,要求必须可序列化。
activemq主从切换原理
activemq主从切换原理
ActiveMQ是一个基于消息队列的分布式消息中间件,可以实现高性能、高可用的消息传输。
在ActiveMQ中,主从切换是一个关键的特性,可以确保在主服务器宕机时,从服务器可以接管消息传输的任务。
下面是ActiveMQ主从切换的原理:
1. 主服务器和从服务器都连接到同一个共享的存储(如数据库、文件系统),共享的存储中保存着消息队列中的数据。
2. 主服务器负责处理消息的生产和消费,并将消息写入共享的
存储中。
3. 从服务器监听主服务器发送的数据变化,并从共享的存储中
读取数据。
4. 当主服务器宕机时,从服务器会检测到这个状态,并会接管
成为新的主服务器。
5. 新的主服务器会接管消息的生产和消费,并继续将消息写入
共享的存储中。
6. 一旦原来的主服务器恢复正常,它会重新连接到共享的存储,并成为从服务器,接收并处理新的数据变化。
通过在主服务器和从服务器之间共享存储,ActiveMQ实现了主从切换的高可用性。
当主服务器宕机时,从服务器会接管消息传输任务,确保消息的可靠传递。
而当主服务器恢复正常时,它会重新连接到共
享的存储,并从中读取新的数据变化,实现了主从切换的无缝切换。
activemq指标 -回复
activemq指标-回复什么是ActiveMQ?ActiveMQ是一个开源的、基于Java消息代理的解决方案,它实现了Java Message Service(JMS)API,并提供了丰富的特性和功能。
作为一种消息代理,ActiveMQ充当了消息的中介,负责接收、转发和传递消息。
它是一个高性能、可扩展、高可用的消息代理,被广泛应用于企业系统的消息传递和异步通信。
ActiveMQ的主要特点1. 消息可靠性:ActiveMQ提供了多种消息确认机制,确保消息的可靠性传递。
可以设定消息持久化机制,保证即使在系统故障的情况下也不会丢失消息。
2. 容错性:ActiveMQ支持主-备模式,可以实现高可用性和故障转移。
当主节点出现故障时,备节点会接管服务,并确保消息的连续性。
3. 异步通信:ActiveMQ支持发布-订阅模式和点对点模式,可以实现系统内部的异步通信。
发布-订阅模式可以实现消息的广播,点对点模式可以确保消息只被一个消费者处理。
4. 多语言支持:ActiveMQ使用标准的JMS API,因此可以轻松集成到几乎任何编程语言中。
无论是Java、C++、Python,还是.NET平台,都可以通过合适的JMS客户端进行与ActiveMQ的交互。
ActiveMQ的核心指标1. 吞吐量:吞吐量是指ActiveMQ在单位时间内能够处理的消息数量。
这个指标反映了ActiveMQ的处理能力和性能。
通过监控吞吐量,可以了解系统的繁忙程度,并作出相应的调整,以提高系统的性能和稳定性。
2. 延迟:延迟是指消息从发送到接收的时间间隔。
较低的延迟意味着消息能够快速地传递和处理,有助于提高系统的响应速度和用户体验。
监控延迟可以帮助我们发现系统中的瓶颈和潜在问题,并及时调整配置和优化系统性能。
3. 错误率:错误率是指消息处理过程中出现错误的比例。
较低的错误率代表着系统的稳定性和可靠性,而较高的错误率则可能意味着系统存在问题。
通过监控错误率,可以及时发现和解决潜在的bug和异常情况,确保系统的正常运行。
activemq zookeeper一主两从集群原理
activemq zookeeper一主两从集群原理
ActiveMQ是一个消息中间件,它使用ZooKeeper来协调分布
式系统中的主从集群。
在ActiveMQ的一主两从集群中,有一个主节点和两个从节点。
主节点负责接收和处理消息,同时也负责监控和管理从节点。
从节点主要用于备份和故障转移。
1. 首先,所有节点都会连接到ZooKeeper集群,并注册自己的身份和状态信息。
2. 主节点会竞选出来,成为主节点。
这个竞选过程是基于ZooKeeper的临时有序节点实现的,具有最小序号的节点会成
为主节点。
3. 一旦主节点选举完成,主节点就会开始接收和处理消息。
同时,它会向ZooKeeper注册自己为主节点,并更新自己的状态。
4. 从节点会监视主节点的状态。
如果主节点发生故障或者不可用,从节点会检测到这个变化,并通过ZooKeeper进行通知。
然后,选取一个从节点成为新的主节点,并更新状态。
5. 一旦新的主节点选举完成,它就会接管主节点的职责,并开始接收和处理消息。
旧的主节点变成从节点,负责备份和故障转移。
通过使用ZooKeeper来协调主从节点的选举和状态变化,
ActiveMQ可以实现高可用性和故障恢复。
如果主节点发生故障,系统可以快速地选举新的主节点,并保持消息的可靠性和一致性。
activemq maxinactivityduration -回复
activemq maxinactivityduration -回复"activemq maxinactivityduration" 在ActiveMQ 中指定了在没有活动连接的情况下,连接保持活动的最大间隔。
在本文中,我们将逐步回答与该主题相关的问题并对其进行详细解释。
第一步:什么是ActiveMQ?ActiveMQ 是一个开源的、基于Java 的消息中间件软件。
它实现了Java Message Service (JMS) API,是一种用于发送和接收数据的标准化方式。
ActiveMQ 允许不同的应用程序之间进行异步通信,允许应用程序以可靠和高效的方式进行消息处理。
第二步:什么是maxInactivityDuration?maxInactivityDuration 是ActiveMQ 中一个用于配置连接的属性,它指定了一个连接在没有活动的情况下保持活动的最大间隔时间。
活动包括任何传输层上的流量,例如读取数据或向服务器发送心跳信号。
如果在指定的时间内没有发生活动,则连接会被关闭。
第三步:为什么需要maxInactivityDuration?maxInactivityDuration 可以确保连接在一定时间内没有活动时不会无限期地保持打开状态。
如果两个端点之间的连接没有活动,那么可能是由于断网、客户端崩溃或其他故障。
在这种情况下,保持连接打开可能会浪费资源并占用服务器资源。
第四步:如何配置maxInactivityDuration?在ActiveMQ 中,可以通过在连接URI 中添加配置参数来设置maxInactivityDuration。
例如,在连接URL 中添加"?maxInactivityDuration=60000" 可以将最大间隔时间设置为60秒。
这将使得如果连接在60秒内没有活动,则会被关闭。
此外,还可以使用ActiveMQ 的配置文件来设置maxInactivityDuration。
ActiveMQ基础教程----简单介绍与基础使用
ActiveMQ基础教程----简单介绍与基础使⽤概述ActiveMQ是由Apache出品的,⼀款最流⾏的,能⼒强劲的开源消息总线。
ActiveMQ是⼀个完全⽀持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它⾮常快速,⽀持多种语⾔的客户端和协议,⽽且可以⾮常容易的嵌⼊到企业的应⽤环境中,并有许多⾼级功能。
特性遵循JMS规范:ActiveMQ的各种特性是JMS1.1规范的实现。
它们包括同步和异步消息传递,⼀次和只有⼀次的消息传递,对于预订者的持久消息等等。
依附于JMS规范意味着,不论JMS消息提供者是谁,同样的基本特性都是有效的。
(JMS可查看前篇博⽂(ActiveMQ基础教程(⼀)JMS概述)。
连接:ActiveMQ提供各种连接选择,包括HTTP,HTTPS,IP多点传送,SSL,STOMP,TCP,UDP,XMPP等。
⼤量的连接协议⽀持使之具有更好的灵活性。
⽀持多种语⾔客户端:ActiveMQ对多种语⾔提供客户端API,除了Java之外还有C/C++、.NET、Perl、PHP、Ruby、Python等。
这使得ActiveMQ能⽤在Java之外的其它语⾔中。
很多其它语⾔都可以通过ActiveMQ提供的客户端API使⽤ActiveMQ的全部特性。
当然,ActiveMQ代理器(broker)仍然是运⾏在java虚拟机上,但是客户端能够使⽤其它的被⽀持的语⾔。
可插拔的持久性和安全:ActiveMQ提供多种持久性⽅案可供选择,也可以完全按⾃⼰需求定制验证和授权。
例如,ActiveMQ通过KahaDB提供⾃⼰的超快速消息持久⽅案(ultra-fast message persistence),但也⽀持标准的JDBC⽅案。
ActiveMQ可以通过配置⽂件提供简单的验证和授权,也提供标准的JAAS登陆模块。
简单的管理:ActiveMQ是为开发者设计的。
它并不需要专门的管理⼯具,因为它提供各种易⽤且强⼤的管理特性。
activemq指标 -回复
activemq指标-回复什么是ActiveMQ?ActiveMQ是一个开源消息代理软件,它实现了Java Message Service (JMS)规范。
作为一个消息代理,ActiveMQ允许不同应用程序在分布式环境中异步地发送和接收消息,从而实现系统之间的解耦。
它可以用于构建可靠的消息传递系统,同时提供高扩展性、高可用性和高性能。
ActiveMQ是一个基于Java的消息代理,使用支持跨平台的Apache Camel框架,因此可以在各种操作系统上运行。
其具有可插拔的设计,可以与各种技术进行集成,包括Spring、Hibernate、Axis等。
同时,它还提供了多个语言绑定,包括Java、C++、Python和.NET等,使得开发人员能够使用自己喜欢的语言进行消息传递。
ActiveMQ提供了多种消息传递模式,包括点对点模式和发布/订阅模式。
在点对点模式中,消息发送者将消息发送到特定的队列中,只有单个的消息消费者能够接收并处理该消息。
而在发布/订阅模式中,消息发送者将消息发送到主题中,多个消息消费者可以订阅主题并独立地接收消息。
作为一个开源项目,ActiveMQ拥有强大的社区支持和活跃的开发团队。
它具有良好的文档和示例,并提供了丰富的功能,如消息分组、事务支持、消息持久化等。
同时,ActiveMQ还提供了监控和管理功能,可以通过Web控制台或JMX进行管理和监控。
那么,我们来看一下ActiveMQ的一些关键指标。
第一个关键指标是消息吞吐量。
消息吞吐量指的是在给定时间内处理的消息数量。
通常以每秒处理的消息数量(TPS)来衡量。
高消息吞吐量意味着系统能够处理更多的消息,具有更高的性能和效率。
要提高消息吞吐量,可以采取一些措施,如增加服务器资源、优化代码、调整ActiveMQ的配置等。
第二个关键指标是消息延迟。
消息延迟是指消息从发送到接收所需的时间。
对于一些实时性要求较高的应用程序,较低的消息延迟非常重要。
ActiveMQ基本介绍
ActiveMQ基本介绍预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制ActiveMQ基本介绍1、ActiveMQ服务器工作模型通过ActiveMQ消息服务交换消息。
消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。
这些消息传送操作是使用一组实现 ActiveMQ应用编程接口 (API) 的对象来执行的。
ActiveMQ客户端使用 ConnectionFactory 对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。
Connection 是客户端与消息服务的活动连接。
创建连接时,将分配通信资源以及验证客户端。
这是一个相当重要的对象,大多数客户端均使用一个连接来进行所有的消息传送。
连接用于创建会话。
Session 是一个用于生成和使用消息的单线程上下文。
它用于创建发送的生产者和接收消息的消费者,并为所发送的消息定义发送顺序。
会话通过大量确认选项或通过事务来支持可靠传送。
客户端使用MessageProducer 向指定的物理目标(在API 中表示为目标身份对象)发送消息。
生产者可指定一个默认传送模式(持久性消息与非持久性消息)、优先级和有效期值,以控制生产者向物理目标发送的所有消息。
同样,客户端使用MessageConsumer 对象从指定的物理目标(在API 中表示为目标对象)接收消息。
消费者可使用消息选择器,借助它,消息服务可以只向消费者发送与选择标准匹配的那些消息。
消费者可以支持同步或异步消息接收。
异步使用可通过向消费者注册MessageListener 来实现。
当会话线程调用 MessageListener 对象的onMessage 方法时,客户端将使用消息。
2、ActiveMQ消息传送模型ActiveMQ 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布/订阅模型),分别称作:PTP Domain 和Pub/Sub Domain。
activemq主从切换原理
activemq主从切换原理ActiveMQ是一种开源的消息中间件,它提供了可靠的消息传递机制,支持主从切换。
主从切换是指在ActiveMQ集群中,当主节点出现故障时,自动切换到备用节点,确保消息的可靠传递和高可用性。
ActiveMQ主从切换的原理如下:首先,ActiveMQ集群中有一个主节点和多个备用节点。
主节点负责接收和处理消息,备用节点则处于待命状态,等待主节点故障时接管工作。
主节点和备用节点之间通过网络进行通信。
主节点会定期向备用节点发送心跳信号,以确保备用节点处于正常工作状态。
如果主节点长时间没有收到备用节点的心跳信号,就会认为备用节点出现故障,触发主从切换。
当主节点故障时,备用节点会接管主节点的工作。
备用节点会立即启动并接收消息,确保消息的连续传递。
同时,备用节点会向其他备用节点发送通知,告知它们主节点已经故障,需要进行主从切换。
其他备用节点收到通知后,会进行选举,选择一个新的主节点。
选举的原则通常是根据节点的优先级和可用性进行判断。
选举出的新主节点会接管原主节点的工作,并开始处理消息。
在主从切换过程中,客户端不需要做任何修改。
客户端只需要连接到ActiveMQ集群的地址,由集群自动将消息发送到可用的节点。
当主节点故障时,客户端会自动切换到备用节点,继续发送和接收消息,不会中断服务。
主从切换的过程通常是无感知的,对于客户端来说,只是在某个时刻发生了一次短暂的连接中断,然后恢复正常。
这是因为备用节点会尽快接管主节点的工作,并继续处理消息,确保消息的可靠传递。
总结起来,ActiveMQ主从切换的原理是通过主节点和备用节点之间的心跳信号进行监测,当主节点故障时,备用节点会接管主节点的工作,并通知其他备用节点进行选举,选择一个新的主节点。
主从切换过程对于客户端来说是无感知的,确保了消息的可靠传递和高可用性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. JMS消息队列
1.1. 消息队列概述
消息队列是在消息的传输过程中保存消息的容器。
消息队列管理器在将消息从它的源中继到它的目标时充当中间人。
队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
1.1.1.JMS
JMS是由包括Sun Microsystems和IBM等在内的几个公司合作设计的一个面向消息的中间件(MOM)API。
JMS定义了Java 中访问消息中间件的接口,但JMS 只是接口,并没有给予实现,实现JMS 接口的消息中间件称为JMS提供者(JMS Provider)。
JMS的目的是应用程序能在异步情况下可靠地传输和接受消息。
从编程的角度来看,JMS可以被当作一个容器管理的资源,与JDBC连接类似。
正如可以通过JDBC去访问许多不同的关系数据库一样,可以通过JMS 访问独立于厂商的消息服务系统。
JMS主要包括三个部分――JMS提供者(JMS Provider)、消息发送者(Message Producer)和消息接收者(Message Consumer)。
JMS提供者是指实现JMS API接口的消息系统,是消息的中转站;消息发送者是指消息的创造和发送者,是消息的发源地;消息接收者是指接收消息的应用程序,是消息最终的目的地。
JMS消息是异步处理的,消息发送者可以发送一个消息而无须等待响应。
消息发送者将消息发送到一条虚拟的通道(主题或队列)上,消息接收者则订阅或是监听该通道。
一条消息可能最终转发给一个或多个消息接收者,这些接收者都无需对消息发送者做出回应。
1.1.1.1. JMS消息传递模式
JMS支持两种消息传递模式――点对点模式(P2P)和发布/订阅模式(Publish/Subscribe)。
这两种都是人们熟知的push模式,消息的发送者是活动的发起人,而接收者则是被动的接收消息。
在JMS中,这些消息传递模式被称为消息域(message domain)。
JMS点对点消息域
在点对点模式中,发送者和接收者对消息传送的目的地址达成一致,即所谓的队列(queue)。
消息队列位于JMS提供者中,消息发送者向一个消息队列发送消息,消息接收者可以在消息发送后的任何时刻从这个队列中(被动地)接收消息,在接收者确认之前消息一直保存在消息队列中直到过期。
JMS点对点消息域具有以下特点:
◆每条消息能而且只能被一个接收者接收。
◆每条消息或者被接收者从队列中取走,或者被JMS提供者在超时的情况
下删除。
◆消息产生的时候接收者不一定要存在,接收者可以在消息产生后的任何
时间里取走消息。
◆接收者不能请求一个消息。
◆接收者必须在收到消息后发出确认信息。
JMS发布/订阅消息域
在发布/订阅模式下,发送者被称为发布者(publisher),一个消息可已有很多接收者,这些接收者被称为订阅者(subscriber)。
发布/订阅模式采用与点对点模式完全不同的消息发送模式。
在发布/订阅模式下,发布者给一个主题(topic)发送消息,多个订阅者在订阅的时候可以订阅他们感兴趣的主题。
一个主题可以被多个订阅者订阅,一个订阅者也可以订阅多个主题。
一个主题的消息只被发给该主题的所有订阅者。
订阅者只能接收它订阅的主题中的消息,并且,在默认情况下,订阅者在消息发送的时候必须是活动的,并随时准备接收消息,否则它将
错过该消息。
为了避免这种时间依赖性JMS API允许订阅者创建持久订阅。
JMS发布/订阅消息域具有以下特点:
◆每一条消息由一个发布者创建而由0个或多个订阅者接收它。
◆消息立刻被分发给现有的订阅者。
◆订阅者必须在消息发送的时候存在以接收消息。
◆持久订阅允许订阅者接收它处于非活动状态时由发布者向主题发送的消
息。
◆订阅者必须在接收到消息后发出确认信息。
1.1.1.
2. JMS消息的组成
在J2EE1.4后,JMS API不再区分在点对点域和发布/订阅域中创建的消息。
JMS消息由以下三部分组成:
消息头(header)――JMS消息头包含了许多字段,它们是消息发送后由JMS 提供者或消息发送者产生,用来表示消息、设置优先权和失效时间等等,并且为消息确定路由。
属性(property)――由消息发送者产生,用来添加删除消息头以外的附加信息。
消息体(body)――由消息发送者产生,JMS中定义了5种消息体:ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。
1.1.1.3. ActiveMQ
ActiveMQ是最受欢迎并且功能最强大的开源消息队列。
ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现。
ActiveMQ支持以下特性:
1)多种语言和协议编写客户端。
语言:Java、C、C++、C#、Ruby、Perl、
Python、PHP。
应用协议:OpenWire、Stomp REST、WS Notification、
XMPP、AMQP。
2)完全支持JMS1.1和J2EE 1.4规范(持久化、XA消息、事务)。
3)对Spring的支持,ActiveMQ可以很容得内嵌到使用Spring的系统里面
去,而且也支持Spring2.0的特性。
4)通过了常见J2EE服务器(如Geronimo、JBoss 4、GlassFish、WebLogic)
的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ 可以自动的部署到任何兼容J2EE 1.4 商业服务器上。
5)支持多种传送协议:in-VM、TCP、SSL、NIO、UDP、JGroups、JXTA。
6)支持通过JDBC和journal提供高速的消息持久化。
7)从设计上保证了高性能的集群,客户端——服务器、点对点。
8)支持Ajax。
9)支持与Axis的整合。
10)可以很容易得调用内嵌JMS provider进行测试。
其架构图如下所示:
图1. ActiveMQ架构图。