ActiveMQ高级特性

标签: activemq | 发表时间:2014-11-07 11:56 | 作者:
出处:http://m635674608.iteye.com

异步发送

消息生产者使用持久(persistent)传递模式发送消息的时候,Producer.send() 方法会被阻塞,直到 broker 发送一个确认消息给生产者,这个确认消息暗示生产者 broker 已经成功地将它发送的消息路由到目标目的并把消息保存到二级存储中。这个过程通常称为同步发送。但有一个例外,当发送方法在一个事物上下文中时,被阻塞的是commit 方法而不是 send 方法。commit 方法成功返回意味着所有的持久消息都以被写到二级存储中。

同步发送持久消息能够提供更好的可靠性,但这潜在地影响了程序的相应速度,因为在接受到 broker 的确认消息之前应用程序或线程会被阻塞。如果应用程序能够容忍一些消息的丢失,那么可以使用异步发送。异步发送不会在受到 broker 的确认之前一直阻塞 Producer.send 方法。如果想启动异步传送可以把 connector uri 的jms.useAsyncSend 选项设为 true,如下所示:
               
               tcp://localhost:61616?jms.useAsyncSend=true

从 ActiveMQ 5 开始可以控制异步发送流。也就是说,在受到 broker 的确认应答之前,生产者能够传送消息给broker 的最大信息量。即使是异步发送消息,生产者也是在收到 broker 的确认应答后才把下一条消息传送给broker。当使用异步传送的时候,可以设置jms.producerWindowSize(单位为字节)属性,当生产者中等待发送的信息量到达设置的值时,即使没有收到 broker 的应答消息,生产者同样会把这些消息发给 broker。如下面的示例设置:

               tcp://localhost:61616?jms.useAsyncSend=true&jms.producerWindowSize=1024000

单独确认 

在 ActiveMQ 5.2 中添加了一个新的确认模式,这种确认模式是特定于 ActiveMQ 的,jms 规范暂时并不支持这种确认模式。这种确认模式由ora.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 表示,用来确认一个单独的消息。这中确认模式是相对于 Session.CLIENT_ACKNOWLEDGE 的,在CLIENT_ACKNOWLEDGE 模式下,调用消息的 acknowledge() 方法会确认由此 session 消费的所有消息,而在INDIVIDUAL_ACKNOWLEDGE 模式下,仅会确认调用 acknowledge() 方法的消息。

企业集成模式 

通过  Apache Camel ,ActiveMQ 支持《 EIP 》一书中提到的企业集成模式。参见 http://activemq.apache.org/enterprise-integration-patterns.html 。

消息游标 

在 ActiveMQ 的之前版本中,broker 会把正在传输的消息保存在内存中。使用这种内存模型,当一个消费者消费消息的速度跟不上生产者生产消息的速度的时候,会是 broker 内存中维护的正在传输的消息数量迅速增长,最终到达最大限额。当到达此最大限额后,broker 就不能接受来自客户端的消息,这样生产者就会被阻塞直到 broker的内存中有保存消息的空间为止。

从 5.0 版本开始,ActiveMQ 实现了一种新的内存模型以防止慢速的消费者阻塞运行速度更快的生产者。这种内存模型使用了消息游标,详情请查看  http://activemq.apache.org/message-cursors.html 。

对 spring 的支持

请查看 ActiveMQ 的  spring support 页面,查看如何在 spring 中配置 ActiveMQ 的 jms 客户端。

连接池 

org.apache.activemq.pool 包中提供了一个服务提供者对象 PooledConnectionFactory,通过这个类应用程序可以缓存 Connection、Session 以及 MessageProducer。更详细的信息可以查看PooledConnectionFactory 的文档。

PooledConnectionFactory 主要用来与其它一些框架或工具集成使用,例如 spring。

消息转换器 

从 ActiveMQ 5 开始,ActiveMQ 允许开发人员把他们的消息转换对象添加到 ActiveMQ 的消息总线上。一个ActiveMQ 转换对象(或者是转换器)必须实现 org.apache.activemq.MessageTransformaer 接口。

如果要设置一个消息转换器,可以调用一下对象的 setTransformaer() 方法设置一个消息转换器:ActiveMQConnectionFactory、ActiveMQConnection、 ActiveMQSession、ActiveMQMessageConsumer和ActiveMQMessageProducer。消息转化器是可继承的,也就是说当设置了 ActiveMQConenctionFactory的消息转化器后,由此 ActiveMQConnectionFacttory 创建的连接、会话、消费者和生产者都会继承ActiveMQConnectionFactory 的消息转换器。

组合目的 

组合目的是 ActiveMQ 特有的一个特性,jms 规范并不支持。组合目的是指多个物理目的被映射到一个虚目的,当生产者向虚目的发送一条消息时,这条消息会被转发到映射到此虚目的地物理目的上。组合目的分为客户端组合目的以及消息代理端组合目的。

客户端组合目的

在客户端可以通过 jndi 给一个虚目的配置多个物理目的。如下面的 jndi.properties示例文件所示,生产者向目的Q.BLAST 发送一条消息后,这条消息会被转发到物理目的 Q.REQ、Q.FOO 和 Q.TEST。

               java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
               connectionFactoryNames=local
               connection.local.brokerURL=tcp://localhost:61616
               queue.Q.BLAST=Q.REQ, Q.FOO, Q.TEST

 



在客户端组合目的中也可以混合使用主题和队列。如果一个虚目的映射的物理目的中既有队列又有主题,那么必须使用 queue:// 或 topic:// 前缀。如下所示,在上面示例的基础上为虚目的 Q.BLAST 添加了一个主题。

              java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
               connectionFactoryNames=local
               connection.local.brokerURL=tcp://localhost:61616
               queue.Q.BLAST=Q.REQ, Q.FOO, Q.TEST, topic://TOPIC.TEST

消息代理端组合目的

在 broker 的 xml 配置文件中使用元素 <destinationInterceptors> 可以配置组合目的。如下示例配置片段所示:

               <broker brokerName="mybroker"xmlns="http://activemq.org/config/1.0">
                              ....
                       <desinationInterceptors>
                              <virualDestinationInterceptors>
                                      <virtualDesinations>
                                             <compositeQueue name="Q.BLAST">
                                                     <forwardTo>
                                                            <queue physicalName="Q.REQ" />
                                                           <queue physicalName="Q.FOO" />
                                                           <queue physicalName="Q.TEST" />
                                                            <topic physicalName="TOPIC.TEST" />
                                                     </forwardTo>
                                            </compositeQueue>
                                     </virtualDestinations>
                             </virtualDestinationInterceptors>
                       </destinationInterceptors>
               </broker>

镜像队列 

镜像队列特性允许应用程序监控通过队列的消息流。如果启用镜像队列,那么发送到某个队列的消息会被发布到一个主题中,因此对通过队列传递的消息感兴趣的应用程序就可以订阅相应的主题。例如,应用程序中有生产者向队列 Q.TEST 发送消息,同样有一些消费者接收此队列中的消息。假设现在希望能够监控通过这个主题的消息,这可以通过镜像队列来实现,监控程序则可以监听主题VirtualTopic.Mirror.Q.TEST,这样就能接收到发送到主题Q.TEST 上的所有消息。

 


默认情况下没有启用镜像队列功能,如果希望启用这个特性可以设置 broker xml 配置文件中 <broker> 元素的属性useMirroredQueues 为 true。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [activemq] 推荐:

【ActiveMQ Tuning】Prefetch Limit

- - 博客园_首页
   摘要:ActiveMQ优化 客户端优化 预取限制. 原文: http://fusesource.com/docs/broker/5.4/tuning/GenTuning-Consumer-Prefetch.html. Overview:图列4.1阐明了Broker在等待之前发送给客户端消息的反馈的行为.

【ActiveMQ Tuning】Serializing to Disk

- - 博客园_首页
     翻译自: http://fusesource.com/docs/broker/5.4/tuning/PersTuning-SerialToDisk.html.      KahaDB message store:KahaDB 是ActiveMQ Broker 为了高性能而推荐使用的消息存储机制.

ActiveMQ 桥接

- - CSDN博客互联网推荐文章
使用目的:将本地产生的消息转发到远程,通过远程服务器来处理消息,处理完成后,再启动消费者处理本地服务器消息(验证消息是否被转走,本地无消息可处理为正常). 消息在下面的地址被消费,无需任何特别配置,采用默认的配置即可. 生产消息地址为localhost:7001,需要做如下配置. 注意: 表示只有这个队列的会进行桥接转发.

ActiveMQ学习小结

- - CSDN博客架构设计推荐文章
   Activemq是众多开源消息中间件的一种,支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,和J2EE1.4容器无缝结合. 它是apache基金会的一个项目,而且经过多年发展,有了很高的稳定性. 目前被很多知名项目使用,比如Apache serviceMix、FuseESB.  消息中间件一般被用在异步消息通信、整合多个系统的场景,比如你注册CSDN论坛,你填写完注册信息点提交时,它会发一份验证邮箱的验证邮件给到你,这封邮件就可以通过消息中间异步发送给你.

ActiveMQ与Spring整合

- - 博客园_首页
ActiveMQ 是Apache出品, 是最流行​​和最强大的开源消息总线. 同时完全支持 JMS 1.1和J2EE 1.4规范. 支持多种编程语言和协议编写客户端. 在JMS客户端和消息代理完全支持企业集成模式. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务). 对Spring的支持, ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性.

ActiveMQ高级特性

- - zzm
消息生产者使用持久(persistent)传递模式发送消息的时候,Producer.send() 方法会被阻塞,直到 broker 发送一个确认消息给生产者,这个确认消息暗示生产者 broker 已经成功地将它发送的消息路由到目标目的并把消息保存到二级存储中. 但有一个例外,当发送方法在一个事物上下文中时,被阻塞的是commit 方法而不是 send 方法.

ActiveMQ持久化方式

- - CSDN博客架构设计推荐文章
消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和ReliableMessaging结合起来应该是很好的保证了消息的可靠传送. 消息持久性的原理很简单,就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝试.

[MQ]关于ActiveMQ的配置

- - 企业架构 - ITeye博客
  目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较. 简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统. (对于这点我并去调研过MSMQ是否可以部署在非微软系统,比如:Linux,只是拍脑袋想了想,感觉上是不可以).

优化ActiveMQ性能(zhuan)

- - zzm
1.  优化ActiveMQ性能. 1.PERSISTENT(持久性消息). 这是 ActiveMQ 的默认传送模式,此模式保证这些消息只被传送一次和成功使用一次. 对于这些消息,可靠性是优先考虑的因素. 可靠性的另一个重要方面是确保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息.

ActiveMQ性能调优2

- - zzm
转自 :  http://setting.iteye.com/blog/1484498. amq自己带了一个性能test: http://activemq.apache.org/activemq-performance-module-users-manual.html. 使用jmeter压测的介绍: http://activemq.apache.org/jmeter-performance-tests.html.