ActiveMQ实践入门指南

合集下载

ActiveMQ(一):安装启动及测试

ActiveMQ(一):安装启动及测试

ActiveMQ(⼀):安装启动及测试1. 预备知识 1.1 JMS JMS(Java Messaging Service)是Java平台上有关⾯向消息中间件(MOM)的技术规范。

<> 1.2 JMX JMX(Java Management Extensions,即Java管理扩展)是⼀个为应⽤程序、设备、系统等植⼊管理功能的框架。

<> 1.3 订阅者模式 ⼀种设计模式,存在⽣产者和消费者两种⾓⾊,多个消费者订阅⽣产者的内容,⽣产者产⽣内容后分发到各个消费者中。

2. 2.1 简介 ActiveMQ 是Apache出品,最流⾏的,能⼒强劲的开源消息总线。

ActiveMQ 是⼀个完全⽀持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应⽤中间仍然扮演着特殊的地位。

2.2 安装⽅式有多种,这⾥选择 Binary Installation. 2.1.1 Windows a. 下载zip压缩包 下载地址: 在此地址下,选择⾃⼰要使⽤的版本,进⼊到指定的⽂件夹下,选择zip压缩包,下载; 由于我使⽤Spring版本的原因,我使⽤如下activemq版本: b. 将压缩包放到指定⽬录下,解压。

c. 启动 打开cmd,进⼊到%ACTIVEMQ_HOME%\bin⽬录下,使⽤命令: activemq start //打开服务 打开后有如下提⽰,即已正确启动: d. 测试 浏览器进⼊到127.0.0.1:8161,activemq控制台,可查看activemq中的各消息信息; ⽤户名:admin 密码:admin ⽤户名和密码在%ACTIVEMQ_HOME%\conf中的jetty-realm.properties中配置。

如下: e. 启动中遇到的问题及解决⽅案 Q1. 端⼝被占⽤ A1. activemq的默认端⼝为:61616 此端⼝可能被windows的某种服务占⽤掉,所以需要修改activemq的默认端⼝; 进⼊到%ACTIVEMQ_HOME%\conf中的actviemq.xml中修改61616位61618(此端⼝可为任意未被占⽤端⼝)即可; <transportConnectors><!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --><transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/><!-- 此处修改端⼝为:61618 --> <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/><transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/><transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/><transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/></transportConnectors> Q2. 将%ACTIVEMQ_HOME%\bin写⼊环境变量中 A2. 可避免每次启动服务需cmd进⼊指定⽂件夹下命令操作。

activemq用法

activemq用法

activemq用法ActiveMQ是一个开源的分布式消息中间件,采用Java编写,它是Apache软件基金会的一个顶级项目。

ActiveMQ实现了Java Message Service(JMS)规范,可以在不同系统之间进行消息传递和通信。

下面将介绍ActiveMQ的用法。

1.安装与配置:2.创建队列:在ActiveMQ管理界面上,点击"Queues"选项卡,然后点击"Add a new Queue"按钮。

给队列指定一个名称,并配置其他参数,如持久性、最大消息数等。

点击"Add"按钮后,队列就会被创建。

3.发送和接收消息:ActiveMQ提供了多种编程语言的客户端库,可以方便地发送和接收消息。

以Java为例,使用JMS API可以完成这些操作。

首先,需要创建一个ConnectionFactory对象,指定ActiveMQ的连接URL。

然后,通过ConnectionFactory创建一个Connection对象,并启动连接。

接下来,创建一个Session对象,用于发送和接收消息。

最后,创建一个MessageProducer对象,通过调用它的send方法发送消息。

同样地,可以创建一个MessageConsumer对象,接收消息。

接收消息的时候,可以通过调用MessageConsumer的receive方法,阻塞等待接收消息;也可以注册一个MessageListener,通过回调方式接收消息。

具体代码如下:```javaimport javax.jms.*;public class ActiveMQExamplepublic static void main(String[] args) throws JMSException ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);Connection connection = connectionFactory.createConnection(;connection.start(;Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);Destination destination = session.createQueue("myQueue");MessageProducer producer =session.createProducer(destination);//发送消息TextMessage message = session.createTextMessage(;message.setText("Hello, ActiveMQ!");producer.send(message);//接收消息MessageConsumer consumer =session.createConsumer(destination);Message receivedMessage = consumer.receive(;if (receivedMessage instanceof TextMessage)String text = ((TextMessage) receivedMessage).getText(;System.out.println("Received message: " + text);}session.close(;connection.close(;}}```4.持久化与事务:ActiveMQ支持消息的持久化,保证消息在传送过程中不会丢失。

ActiveMQ应用开发指南

ActiveMQ应用开发指南

ActiveMQ应用开发指南ActiveMQ是一个开源的消息传递中间件,它能够通过许多协议和编程语言与各种系统集成。

作为Apache软件基金会的一个项目,ActiveMQ保证了可靠性和数据完整性,使得应用开发者更加轻松地开发分布式应用程序和服务。

1. 安装ActiveMQ要使用ActiveMQ进行应用开发,首先需要在本地计算机上安装ActiveMQ。

安装过程取决于操作系统和平台,因此应该访问ActiveMQ官方网站并从下载页面上获取适当的安装程序。

在安装过程中,应该选择默认设置以确保正确地安装ActiveMQ。

2. 使用ActiveMQActiveMQ提供了一种灵活而易于使用的API,它可以与多种开发语言集成,例如Java、C++、Python和Ruby等。

在使用ActiveMQ之前,必须先熟悉其基本概念和术语。

- Destination:消息发送和接收的地址- Producer:创建和发送消息的客户端- Consumer:接收和处理消息的客户端- Message:传递的数据单元,包含消息正文和相关元数据3. 创建ActiveMQ应用程序在使用ActiveMQ API之前,必须添加ActiveMQ类库到项目中。

这些类库在ActiveMQ安装目录的lib目录下,可以直接添加到项目中或通过构建工具来引用。

3.1 生产者创建生产者的主要任务是将数据转换为消息并将其发送到一个或多个消息目的地。

对于基于Java的应用程序而言,可以使用ActiveMQ所提供的几个类来创建一个生产者。

要创建与ActiveMQ Broker的连接并发送消息,需要以下步骤:- 创建ConnectionFactory对象- 创建Connection对象- 启动连接- 创建一个Session对象- 创建一个Destination(队列或主题)- 创建一个MessageProducer对象- 发送消息3.2 消费者对于基于Java的应用程序而言,需要使用ActiveMQ API中的许多具有各种方法和属性的类,以便从队列或主题中接收消息。

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的情况, 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 是Apache出品,最流行的,能力强劲的开源消息总线。

选择ActiveMQ作为JMS的入门学习中间件,是因为其拥有以下优点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.完全支持JMS1.1和J2EE 1.4规范(持久化,XA消息,事务)5.通过了常见J2EE服务器(如Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上6.支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA7.从设计上保证了高性能的集群,客户端-服务器,点对点8.支持Ajax9.支持与Axis的整合10.可以很容易得调用内嵌JMS provider,进行测试学会了ActiveMQ之后,其它供应商的MQ也可以在短时间内快速上手。

安装:ActiveMQ(本文简称MQ)要求JDK1.5以上,推荐1.6以上版本。

还没安装JDK的朋友,请先安装,在此不赘诉了。

安装完JDK后,从/download.html下载MQ的最新版本,本教程使用版本为5.5。

解压后,可以看到MQ目录下有以下文件和目录activemq-all-5.5.0.jar:所有MQ JAR包的集合,用于用户系统调用bin:其中包含MQ的启动脚本conf:包含MQ的所有配置文件data:日志文件及持久性消息数据example:MQ的示例lib:MQ运行所需的所有Libwebapps:MQ的Web控制台及一些相关的DEMO启动MQ:双击bin目录下的activemq.bat文件即可启动MQ第一个示例:新建一个JAVA工程,引用activemq-all-5.5.0.jar,SLFAPI其及对应版本LOG4J的JAR 包(懒的上网找的到附件里下载)Publisher.javaJava代码1import java.util.Hashtable;2import java.util.Map;34import javax.jms.Connection;5import javax.jms.ConnectionFactory;6import javax.jms.Destination;7import javax.jms.JMSException;8import javax.jms.MapMessage;9import javax.jms.Message;10import javax.jms.MessageProducer;11import javax.jms.Session;1213import org.apache.activemq.ActiveMQConnectionFactory;14import mand.ActiveMQMapMessage;1516public class Publisher {1718protected int MAX_DELTA_PERCENT = 1;19protected Map<String, Double> LAST_PRICES = new Hashtable<String, Double>();20protected static int count = 10;21protected static int total;2223protected static String brokerURL = "tcp://localhost:61616";24protected static transient ConnectionFactory factory;25protected transient Connection connection;26protected transient Session session;27protected transient MessageProducer producer;2829public Publisher() throws JMSException {30factory = new ActiveMQConnectionFactory(brokerURL);31connection = factory.createConnection();32try {33connection.start();34} catch (JMSException jmse) {35connection.close();36throw jmse;37}38session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);39producer = session.createProducer(null);40}4142public void close() throws JMSException {43if (connection != null) {44connection.close();45}46}4748public static void main(String[] args) throws JMSException {49Publisher publisher = new Publisher();50while (total < 1000) {51for (int i = 0; i < count; i++) {52publisher.sendMessage(args);53}54total += count;55System.out.println("Published '" + count + "' of '" + total + "' price56try {57Thread.sleep(1000);58} catch (InterruptedException x) {59}60}61publisher.close();62}6364protected void sendMessage(String[] stocks) throws JMSException { 65int idx = 0;66while (true) {67idx = (int)Math.round(stocks.length * Math.random());68if (idx < stocks.length) {69break;70}71}72String stock = stocks[idx];73Destination destination = session.createTopic("STOCKS." + stock); 74Message message = createStockMessage(stock, session);75System.out.println("Sending: " +((ActiveMQMapMessage)message).getContentMap() + " on destination: " +76producer.send(destination, message);77}7879protected Message createStockMessage(String stock, Session session) throws JMSException {80Double value = LAST_PRICES.get(stock);81if (value == null) {82value = new Double(Math.random() * 100);83}8485// lets mutate the value by some percentage86double oldPrice = value.doubleValue();87value = new Double(mutatePrice(oldPrice));88LAST_PRICES.put(stock, value);89double price = value.doubleValue();9091double offer = price * 1.001;9293boolean up = (price > oldPrice);9495MapMessage message = session.createMapMessage();96message.setString("stock", stock);97message.setDouble("price", price);98message.setDouble("offer", offer);99message.setBoolean("up", up);100return message;101}102103protected double mutatePrice(double price) {104double percentChange = (2 * Math.random() * MAX_DELTA_PERCENT) - MAX_DELTA_PERCENT;105106return price * (100 + percentChange) / 100;107}108109}Consumer.javaJava代码110import javax.jms.Connection;111import javax.jms.ConnectionFactory;112import javax.jms.Destination;113import javax.jms.JMSException;114import javax.jms.MessageConsumer;115import javax.jms.Session;116117import org.apache.activemq.ActiveMQConnectionFactory;118119public class Consumer {120121private static String brokerURL = "tcp://localhost:61616"; 122private static transient ConnectionFactory factory;123private transient Connection connection;124private transient Session session;125126public Consumer() throws JMSException {127factory = new ActiveMQConnectionFactory(brokerURL); 128connection = factory.createConnection();129connection.start();130session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);131}132133public void close() throws JMSException {134if (connection != null) {135connection.close();136}137}138139public static void main(String[] args) throws JMSException {140Consumer consumer = new Consumer();141for (String stock : args) {142Destination destination =consumer.getSession().createTopic("STOCKS." + stock);143MessageConsumer messageConsumer =consumer.getSession().createConsumer(destination);144messageConsumer.setMessageListener(new Listener());145}146}147148public Session getSession() {149return session;150}151152}Listener.javaJava代码153import java.text.DecimalFormat;154155import javax.jms.MapMessage;156import javax.jms.Message;157import javax.jms.MessageListener;158159public class Listener implements MessageListener {160161public void onMessage(Message message) {162try {163MapMessage map = (MapMessage)message;164String stock = map.getString("stock");165double price = map.getDouble("price");166double offer = map.getDouble("offer");167boolean up = map.getBoolean("up");168DecimalFormat df = new DecimalFormat( "#,###,###,##0.00" ); 169System.out.println(stock + "\t" + df.format(price) + "\t" +df.format(offer) + "\t" + (up?"up":"down"));170} catch (Exception e) {171 e.printStackTrace();172}173}174}先运行Consumer.java, 输入参数ORCL,然后运行Publisher.java,输入参数ORCL,就可以看到Publisher在发送消息,Consumer在接收消息了。

ActiveMQ入门

ActiveMQ入门

ActiveMQ入门作者:一路向北摘要:本文主要讲述ActiveMQ的基本知识和使用方法,并简单结合spr ing使用ActiveMQ。

一、ActiveMQ特性和使用总览企业消息软件从80年代起就存在,它不只是一种应用间消息传递风格,也是一种集成风格。

因此,消息传递可以满足应用间的通知和互相操作。

但是开源的解决方案是到最近10年才出现的。

Apache ActiveMQ就是其中一种。

它使应用间能以异步,松耦合方式交流。

本章将向您介绍ActiveMQ。

1、ActiveMQ的特性ActiveMQ是Apache软件基金下的一个开源软件,它遵循JMS1.1规范(Java Message Service),是消息驱动中间件软件(MOM)。

它为企业消息传递提供高可用,出色性能,可扩展,稳定和安全保障。

ActiveMQ使用Apac he许可协议。

因此,任何人都可以使用和修改它而不必反馈任何改变。

这对于商业上将ActiveMQ用在重要用途的人尤为关键。

MOM的工作是在分布式的各应用之间调度事件和消息,使之到达指定的接收者。

所以高可用,高性能,高可扩展性尤为关键。

ActiveMQ的目标是在尽可能多的平台和语言上提供一个标准的,消息驱动的应用集成。

ActiveMQ实现JMS规范并在此之上提供大量额外的特性。

下面是一个高层次的特性列表。

欢迎访问本人百度空间:/snowslince浣花草堂·遵循JMS规范----理解ActiveMQ的起始点是明白ActiveMQ的各种特性是JMS1.1规范的实现。

本章后面将讨论JMS规范提供的好处和保证。

它们包括同步和异步消息传递,一次和只有一次的消息传递,对于预订者的持久消息等等。

依附于JMS规范意味着,不论JMS消息提供者是谁,同样的基本特性都是有效的。

·连接----ActiveMQ提供各种连接选择,包括HTTP,HTTPS,IP多点传送,SSL,STOMP,TCP,UDP,XMPP等。

activeMQ操作手册

activeMQ操作手册

一、安装部署1、下载,下载0.0 Windows Distribution版本2、安装直接解压至任意目录(如:)3、启动 ActiveMQ效劳cmd到bin目录下直接运行: start启动成功:4、ActiveMQ消息治理后台系统:localhost:8161/admin(随包附带jetty、可直接启动)默许用户名:admin默许密码:admin※在conf/jetty-里能够修改用户和密码创建一个Queue二、Queue与 Topic 的比较1、JMS Queue 执行 load balancer语义:一条消息仅能被一个 consumer(消费者) 收到。

若是在 message 发送的时候没有可用的consumer,那么它将被保留一直到能处置该 message 的 consumer 可用。

若是一个consumer 收到一条 message 后却不响应它,那么这条消息将被转到另一个consumer 那儿。

一个 Queue 能够有很多 consumer,而且在多个可用的 consumer中负载均衡。

注:点对点消息传递域的特点如下:•每一个消息只能有一个消费者。

•消息的生产者和消费者之间没有时刻上的相关性。

不管消费者在生产者发送消息的时候是不是处于运行状态,它都能够提取消息。

2、Topic 实现 publish和 subscribe 语义:一条消息被 publish时,它将发到所有感爱好的定阅者,因此0到多个subscriber将接收到消息的一个拷贝。

可是在消息代理接收到消息时,只有激活定阅的subscriber能够取得消息的一个拷贝。

注:发布/定阅消息传递域的特点如下:•每一个消息能够有多个消费者。

•生产者和消费者之间有时刻上的相关性。

定阅一个主题的消费者只能消费自它定阅以后发布的消息。

JMS 标准予诺客户创建持久定阅,这在必然程度上放松了时刻上的相关性要求。

持久定阅许诺消费者消费它在未处于激活状态时发送的消息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ActiveMQ实践入门指南ActiveMQ实践入门指南ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。

ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

下面我们将分四部分来介绍ActiveMQ的相关内容。

ActiveMQ实践:松耦合和ActiveMQ回到2003年,一群开源开发者聚在一起组成了Apache Geronimo。

他们发现没有一个很好的使用BSD风格许可证的消息中间件可用。

因为Geronimo需要一个JMS实现J2EE兼容性,所以一些开发者开始探讨这种可能性。

ActiveMQ实践:松耦合和ActiveMQActiveMQ实践:特性列表和安装这一部分,我们将介绍ActiveMQ的特性列表和如何进行安装和如何对其进行测试。

ActiveMQ实践:特性列表和安装ActiveMQ实践:使用场景在系统架构中,有很多场景ActiveMQ和异步消息都会产生深远的影响。

这部分中,我们将介绍一些使用ActiveMQ的场景实例。

ActiveMQ实践:使用场景ActiveMQ实践:ActiveMQ使用入门开始使用ActiveMQ并不是很难,你只需要启动代理,确保它能够接受连接和发送消息。

这部分中,我们将介绍如何开始使用ActiveMQ。

ActiveMQ实践:ActiveMQ使用入门ActiveMQ实践:松耦合和ActiveMQ回到2003年,一群开源开发者聚在一起组成了Apache Geronimo。

在这种情况下,他们发现没有一个很好的使用BSD风格许可证的消息中间件可用。

因为Geronimo需要一个JMS实现J2EE兼容性,所以一些开发者开始探讨这种可能性。

他们拥有大量的商业MOM经验,而且他们甚至之前已经创建了一些MOM,这些开发者打算创建下一代伟大的开源消息中间件。

ActiveMQ其他的一些灵感来源于市场上的大多数MOM是商业化的这个事实,封闭源码,而且购买和支持的成本高昂。

商业MOM的确在业务上很流行,但是很多业务并不能负担的起不合理的成本。

这也进一步增加了创建一个开源替代物的积极性。

使用Apache许可证的开源MOM确实有着市场潜力。

Apache ActiveMQ随着时间进步。

ActiveMQ打算作为JMS的标准,以供分布式应用之间的远程通信。

为了更好地理解这个意思,最佳的做法就是回顾一下分布式应用设计,尤其是通信。

松耦合和ActiveMQActiveMQ为应用架构提供了松耦合的好处。

松耦合通常被引入到一个架构迁移到一个古典的紧耦合的远程过程调用(RPC)中。

这样一个松耦合设计被认为是异步的,调用两个应用中的任何一个应用对另一个都没有影响;不相互依赖或者有时间要求。

应用可以信任ActiveMQ有能力保障消息交付。

因此,通常表述为应用发送消息是发送后自寻的。

也就是他们把消息发给ActiveMQ,并不关心消息如何交付和什么时候交付。

同样的,消费应用也不用关心消息来自哪里何以如何发送到ActiveMQ的。

这对于在非均匀环境中来说尤其有用,这种环境中允许客户端使用不同的语言编写,甚至可能是不同的网格协议。

ActiveMQ充当中间人,允许以异步的方式进行非均匀集成和交互。

在考虑分布式应用设计的时候,应用耦合很重要。

耦合引用两个或者多个应用或系统的依赖性。

简单的理解耦合就是考虑从系统中任何应用改变对其他应用产生的影响,这种含义穿过架构中的其他应用作为性能被添加。

改变一个应用会迫使所涉及的其他应用改变呢?如果回答是肯定的,这些应用就是紧耦合。

然而,如果一个应用可以在不影响其他应用的情况下改变,这些应用就是松耦合的。

对比松耦合,紧耦合应用很难维护。

像COM、CORBA、DCE和EJB这样的技术使用的技术称之为远程过程调用(RPC),RPC 被认为是紧耦合的。

使用RPC,当一个应用调用另一个应用的时候,调用者是锁定的,直到被调用者返还会控制权。

图一描述了这个概念。

图一通信图一中的调用者是锁定的,直到被调用者返还会控制权。

许多系统架构使用RPC,而且很成功。

然而,是有这种紧耦合设计也有很多缺点,最显著的就是很高的维护费用需求,可谓一石激起千层浪。

在另个应用见正确的时间是必要的。

对于应用都必须在同时可用的这种需求从应用一到应用二,响应从应用二到应用一。

这样的时间需求很难处理。

对比这样设计中的紧耦合和松耦合,两个应用彼此完全不知道对方,如图二所示。

图二图二中的应用一给MOM 发送了一个消息,可能过了一段时间,应用二从MOM收到一条消息。

另个应用都不知道对方的存在,在两个应用之间也没有时间需求。

这种单一风格的交互结果维护成本很低,因为一个应用改变对另一个没有影响。

因此,松耦合应用在分布式应用设计中更具优势。

试想在应用必须转移到另一个地点的这种改变。

这种情况可能发生在新的硬件需求或简单的机器转移的时候。

紧耦合的系统设计,这样的环境很难转移,因为所有应用片段必须经历断电。

松耦合设计的应用,不同的系统片段可以独立的转移。

假如应用一和应用二都有多个实例,每个实例都属于不同的机器中。

ActiveMQ安装在另外完全独立于这两个应用的机器上。

在这种场景中,这些实例都可以移动,而不影响彼此。

实际上,ActiveMQ的多个实例被认为是中间件配置网络。

它允许ActiveMQ实例不影响其他实例的情况下自由转移。

这意味着这个架构中的任何片段可以在任何时间被维护,而无需影响这个系统。

因此ActiveMQ为应用架构提供了一种不可思议的灵活性,松耦合的概念也成为现实。

但是ActiveMQ应该在何时使用呢?欢迎继续关注。

(作者:Bruce Snyder, Dejan Bosanac, Rob Davies 译者:张培颖来源:TechTarget中国)原文链接:/showcontent_41843.htmActiveMQ实践:特性列表和安装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,进行测试安装ActiveMQ首先去/download.html下载最新版本4.1.0release,解压apache-activemq-4.1-incubator.zip(或者apache-activemq-4.1-incubator.tar.gz)目录如下:+bin (windows下面的bat和unix/linux下面的sh)+conf (activeMQ配置目录,包含最基本的activeMQ配置文件)+data (默认是空的)+docs (index,replease版本里面没有文档,不知道为啥不带)+example (几个例子)+lib (activemMQ使用到的lib)-apache-activemq-4.1-incubator.jar (ActiveMQ的binary)-LICENSE.txt-NOTICE.txt-README.txt-user-guide.html你可以使用bin\activemq.bat(activemq) 启动,如果一切顺利,你就会看见类似下面的信息:运行信息几个小提示1. 这个仅仅是最基础的ActiveMQ的配置,很多地方都没有配置因此不要直接使用这个配置用于生产系统2. 有的时候由于端口被占用,导致ActiveMQ错误,ActiveMQ可能需要以下端口1099(JMX),61616(默认的TransportConnector)3. 如果没有物理网卡,或者MS的LoopBackAdpater Multicast会报一个错误测试你的 ActiveMQ 由于 ActiveMQ 是一个独立的 jms provider,所以我们不需要其他任何第三方服务器 就可以马上做我们的测试了。

编译 example 目录下面的程序 ProducerTool/ConsumerTool 是 JMS 参考里面提到的典型应用,Producer 产生消息,Consumer 消费消息,而且这个例 子还可以加入参数帮助你测试刚才启动的本地 ActiveMQ 或者是远程的 ActiveMQ。

ProducerTool broker 的地址,默认的是 tcp://localhost:61616[true|flase] 是否使用 topic,默认是 false[subject] subject 的名字,默认是 TOOL.DEFAULT[durabl] 是否持久化消息,默认是 false[messagecount] 发送消息数量,默认是 10[messagesize] 消息长度,默认是 255[clientID] durable 为 true 的时候,需要配置 clientID[timeToLive] 消息存活时间[sleepTime] 发送消息中间的休眠时间[transacte] 是否采用事务ConsumerTool broker 的地址,默认的是 tcp://localhost:61616TT SOA 技术专题之“ActiveMQ 实践入门指南”Page 11 of 19[true|flase] 是否使用 topic,默认是 false [subject] subject 的名字,默认是 TOOL.DEFAULT [durabl] 是否持久化消息,默认是 false[maxiumMessages] 接受最大消息数量,0 表示不限制[clientID] durable 为 true 的时候,需要配置 clientID[transacte] 是否采用事务[sleepTime] 接受消息中间的休眠时间,默认是 0,onMeesage 方法不休眠[receiveTimeOut] 接受超时我们可以这样使用: 先启动 activeMQ,再打开两个命令窗口,都进入 D:\activemq\example,一个运行: ant consumer,一个运行:ant producer,如果成功发送/接收了消息就 OK 了。

相关文档
最新文档