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 标准予诺客户创建持久定阅,这在必然程度上放松了时刻上的相关性要求。

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

ActiveMQ客户端使用手册

ActiveMQ客户端使用手册

3.2.客户端异常的处理客户端必须对如下异常进行处理:∙确保异常后数据能重新发送接收和与MQ重连∙消费者发生异常,应该优先考虑本地持久化重试,如果抛出了异常,造成消息没有消费,则会保留在MQ中一段时间,这时可能会阻塞新消息的处理。

∙消费者如果发生逻辑业务异常,例如某个信息错误,造成业务无法处理,也应该消费该条消息,记录下日志。

3.3.数据包大小消息大小的约束:推荐几K级别的消息,如果消息很大,采用技术减少消息体大小;减少标记的长度,采用JSON 格式替换XML,采用压缩格式。

3.4.开发及测试MQ服务器地址开发环境测试环境线上正式环境(使用非集群客户端需要直接连接MQ的请联系石冠雄)4.通用设置点对点的消息使用Queue模式;发有限布订阅模式的消息采用VirtualTopic模式,即每个消费者都有一个专用的Queue。

系统代码:字母开头,字母和数字组合消息类型代码:字母开头,字母、数字和下划线组合5.集群ActiveMQ客户端适用于原先没有使用JQ发送消息或是新的系统使用,具有如下特点:∙支持固定的MQ服务器,用于开发环境∙支持从Zookeepr获取管理端分配的MQ服务器,动态扩容∙支持异常递减分流,支持自定义异常立即完全切换到其他服务器分流∙支持MQ服务健康检测恢复分流∙支持异常重试,发送给一组MQ失败后,自动发送给其它组MQ5.1.Maven依赖:spring 3spring 2.5xmlSchema配置5.2.消息转换器及消息监听器委托配置(可选):集成了Xml、JSON、Hessian格式的转换类已经实现完毕,例如:spring普通消息监听器委托(重要:请不要注入带有返回值的方法)5.3.重试服务配置(推荐,可选)生产端以及消费端的数据库失败重试服务,可以将生产或是消费出现异常的消息先移动到数据库,不影响MQ的主线程工作。

MQ服务器提供方式:address 的配置5.5.发送端配置获取实例普通发送方式转换器发送方式批量发送方式转换器批量发送方式5.6.接收端配置:注意:目前批量消费接口在归档记录上存在一定问题,无法完整记录所有的消费记录,使用时请注意6.Java JQ兼容性客户端适用于原先使用JQ发送消息的Java系统,重新修改代码工作量大,采用原接口不改动的设计,最大程度兼容原有客户端。

ActiveMQ使用笔记

ActiveMQ使用笔记

ActiveMQ使用笔记(一)ActiveMQ的安装安装要求:部署需要jdk1.5及以上,编译需要jdk1.5(java5)及以上Java的环境变量(JAVA_HOME)必须设置,即jdk安装的目录,比如c:\Program Files\jsdk.1.6下载ActiveMQ:/download.html解压,如图:运行bin文件夹下的activemq.bat,出现如下图所示:验证是否运行成功:在浏览器中输入:http://localhost:8161/admin/,出现如下图所示表示成功:此时,ActiveMQ已经安装完成了,接下来配置登录监视控制台的用户名和密码。

打开conf文件夹下的jetty.xml,找到<bean id="securityConstraint" class="org.eclipse.jetty.http.security.Constraint"><property name="name" value="BASIC" /><property name="roles" value="admin" /><property name="authenticate" value="false" /></bean>把authenticate属性的值改成true即可,重启activemq.bat,再登录监视控制台,就需要输入密码了,默认的用户名和密码是admin/admin。

roles属性指的是登录的用户角色,这些登录的用户在jetty-realm.properties配置。

修改web的访问端口,在jetty.xml找到一下配置,修改8161即可。

<property name="connectors"><list><bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector"><property name="port" value="8161" /></bean></list></property>ActiveMQ的运行日志存放在data文件夹下的activemq.log中。

ActiveMQ(中文)参考手册

ActiveMQ(中文)参考手册

1 JMS在介绍Ac‎t iveM‎Q之前,首先简要介‎绍一下JM‎S规范。

1.1 JMS的基‎本构件1.1.1 连接工厂连接工厂是‎客户用来创‎建连接的对‎象,例如Act‎i veMQ‎提供的Ac‎t iveM‎Q Conn‎e ctio‎n Fact‎o ry。

1.1.2 连接JMS Conne‎c tion‎封装了客户‎与JMS提‎供者之间的‎一个虚拟的‎连接。

1.1.3 会话JMS Sessi‎o n是生产‎和消费消息‎的一个单线‎程上下文。

会话用于创‎建消息生产‎者(produ‎c er)、消息消费者‎(consu‎m er)和消息(messa‎g e)等。

会话提供了‎一个事务性‎的上下文,在这个上下‎文中,一组发送和‎接收被组合‎到了一个原‎子操作中。

1.1.4 目的地目的地是客‎户用来指定‎它生产的消‎息的目标和‎它消费的消‎息的来源的‎对象。

JMS1.0.2规范中定‎义了两种消‎息传递域:点对点(PTP)消息传递域‎和发布/订阅消息传‎递域。

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

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

无论消费者‎在生产者发‎送消息的时‎候是否处于‎运行状态,它都可以提‎取消息。

发布/订阅消息传‎递域的特点‎如下:•‎每个消息可‎以有多个消‎费者。

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

订阅一个主‎题的消费者‎只能消费自‎它订阅之后‎发布的消息‎。

JMS规范‎允许客户创‎建持久订阅‎,这在一定程‎度上放松了‎时间上的相‎关性要求。

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

在点对点消‎息传递域中‎,目的地被成‎为队列(queue‎);在发布/订阅消息传‎递域中,目的地被成‎为主题(topic‎)。

1.1.5 消息生产者‎消息生产者‎是由会话创‎建的一个对‎象,用于把消息‎发送到一个‎目的地。

1.1.6 消息消费者‎消息消费者‎是由会话创‎建的一个对‎象,它用于接收‎发送到目的‎地的消息。

Active MQ教程+配置

Active MQ教程+配置

ActiveMQ-陈波Active MQ是一个基于Apcache 2.0licenced发布,开放源码的JMS产品。

其特点为:1)提供点到点消息模式和发布/订阅消息模式;2)支持JBoss、Geronimo等开源应用服务器,支持Spring框架的消息驱动;3)新增了一个P2P传输层,可以用于创建可靠的P2P JMS网络连接;4)拥有消息持久化、事务、集群支持等JMS基础设施服务。

Apache activemq是最受欢迎和最强大的开源消息中间件。

Apache activemq是非常快速的,支持多种跨客户端语言和协议,并且还有许多先进功能。

Apache activemq完全遵守JMS1.1和J2EE 1.4规范。

Apache activemq是在Apache 2.0License许可下发布的。

一.ActiveMQ是什么?ActiveMQ is the most popular and powerful open source MessageBus.ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现,尽管JMS 规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

下面是它的特性列表1.多种语言和协议编写客户端。

语言:Java,C,C++,C#,Ruby,Perl,Python,PHP。

应用协议:OpenWire,Stomp REST,WS Notification,XMPP,AMQP2.完全支持JMS1.1和J2EE1.4规范(持久化,XA消息,事务)3.对Spring的支持,ActiveMQ可以很容得内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性4.通过了常见J2EE服务器(如Geronimo,JBoss4,GlassFish,WebLogic)的测试,其中通过JCA1.5resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE1.4商业服务器上5.支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA6.支持通过JDBC和journal提供高速的消息持久化7.从设计上保证了高性能的集群,客户端-服务器,点对点8.支持Ajax9.支持与Axis的整合10.可以很容易得调用内嵌JMS provider,进行测试二.ActiveMQ的竞争者1,其他开源JMS provider(资料来自):jbossmq(jboss4)jboss messaging(jboss5)joram-4.3.212006-09-22openjms-0.7.7-alpha-3.zip December26,2005mantamqubermqSomnifugiJMS2005-7-27开源的JMS Provider大部分都已经停止发展了,剩下的几个都是找到了东家,和某种J2EE 服务器挂钩,比如jboss mq与jboss,joram与jonas(objectweb组织),ActiveMQ与Geronimo(ASF APACHE基金组织),而在这3个之间,从网络底层来看,只有ActiveMQ使用了NIO,单从这个角度来看ActiveMQ在性能上会有一定的优势。

activemq用法(一)

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入门教程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是由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实践入门指南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使用手册

ActiveMQ使用手册

ActimeMQ使用手册目录第一章前言 01.1 编写目的 01.2 术语 01.3 参考文档 0第二章ActiveMQ介绍 (1)2.1 ActiveMQ的原理 (1)2.1.1 JMS的基本构件 (1)2.1.1.1 连接工厂 (1)2.1.1.2 会话 (1)2.1.1.3 目的地 (1)2.1.1.4 生产者 (2)2.1.1.5 消息消费者 (2)2.1.1.6 消息 (2)2.1.2 JMS的可靠性机制 (3)2.1.2.1 消息确认 (3)2.1.2.2 持久性 (4)2.1.2.3 优先级 (4)2.1.2.4 消息过期 (4)2.1.2.5 临时目的地 (4)2.1.2.6 持久订阅 (4)2.1.2.7 本地事务 (5)2.2 ActiveMQ基本配置 (5)2.2.1 配置ActiveMQ服务IP和端口 (5)2.2.2 监控ActiveMQ (6)2.3 ActiveMQ的Broker (7)2.3.1 Running Broker: (7)2.3.2 Embedded Broker: (8)2.4 ActiveMQ Broker的Transport (9)2.4.1 TCP Transport (10)2.4.2 Failover Transport (10)2.4.3 Discover Transport (12)2.5 ActiveMQ Broker的持久方式 (14)2.5.1 AMQ Message Store (14)2.5.2 Kaha Message Store (16)2.5.3 JDBC Message Store (16)2.6 ActimveMQ的其他特性 (17)2.6.1 异步发送消息 (17)2.6.2 消费者异步分派 (18)2.6.3 消费者优先级 (18)2.6.4 独占消费者 (18)2.6.5 消息重发策略 (18)2.6.6 目标相关的属性 (19)2.6.7 消息预取处理 (21)2.6.8 配置连接URL (22)2.6.9 消息重发与死信管理 (24)第三章ActiveMQ集群方式 (28)3.1 AMQ集群特点 (28)3.2 AMQ集群方式-- Queue consumer clusters (28)3.3 AMQ集群方式-- Broker clusters (29)3.3.1 管道订阅conduitSubscriptions (31)3.3.2 双向网络连接(duplex networkConnector) (31)3.3.3 指定和限制Destination (32)3.3.4 被卡住的消息 (33)3.3.5 其他说明 (34)3.4 AMQ集群方式-- Master Slave (34)3.4.1 Pure Master Slave (35)3.4.2 Shared Master Slave (35)3.4.3 JDBC Master Slave (35)第四章ActiveMQ+Mongodb集群实践 (37)4.1 AMQ+Mongodb的群集 (37)第五章ActiveMQ的JMX监控 (38)5.1 JMX的配置 (43)5.2 JMX的JAVA端获取信息 (43)第六章ActiveMQ的使用注意 (45)6.1 发现数据中存在queue://ActiveMQ.DLQ (45)6.2 对应的客户端URL配置 (45)第一章前言1.1编写目的某平台的消息队列采用ActiveMQ来实现,搭建分布式消息平台,提供可靠的传递消息及数据的消息服务,实现平台间的消息传递。

  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 了。

相关文档
最新文档