ActiveMQ 高级特性
异步发送
消息生产者使用持久(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。
分享到:
相关推荐
本文将深入探讨虚拟Topic及路由功能,帮助读者理解如何利用这些特性来优化消息传递机制。 #### 一、虚拟Topic配置与原理 ##### 1.1 虚拟Topic简介 虚拟Topic是一种特殊的Topic配置,它允许将一个Topic的消息转发到...
8. 高级特性:提供了关于ActiveMQ高级特性的讨论,例如集群、故障转移、消息持久化等。 ActiveMQ与JMS的关系十分紧密,因为JMS是一套规范,提供了消息传输的抽象,而ActiveMQ则是实现了这一套规范的一个中间件产品...
7. **ActiveMQ高级特性** - 事务支持:JMS允许在消息发送和接收中使用事务,确保消息的一致性。 - 持久化:即使服务器重启,ActiveMQ也能恢复未处理的消息,保证消息不丢失。 - 网络拓扑:通过网络连接,多个...
四、ActiveMQ高级特性 除了基本功能外,ActiveMQ还提供了许多高级特性,如: 1. 高效的消息存储机制,如KahaDB和LevelDB。 2. 路由策略,如网络连接、负载均衡和故障转移。 3. 策略配置,用于设置消息过期、死信处理...
消息队列:ActiveMQ:ActiveMQ的高级特性:虚拟目的地与代理.docx
ActiveMQ高级特性 - **持久化**: ActiveMQ支持消息持久化,即使服务器重启,消息也不会丢失。 - **网络连接**: 支持多台ActiveMQ服务器之间的网络连接,实现高可用性和负载均衡。 - **消息优先级**: 可以设置消息...
2. 配置管理:通过Web控制台(默认地址:http://localhost:8161/admin/)进行配置和监控,或者修改`conf/activemq.xml`进行高级设置。 3. 创建和管理资源:在Web控制台或通过API创建消息队列、主题等,并管理消费者...
四、高级特性 1. **消息优先级**:ActiveMQ支持为消息设置优先级,优先级高的消息将优先被消费。 2. **消息选择器**:消费者可以使用消息选择器过滤接收到的消息,只消费满足特定条件的消息。 3. **临时目的地**:...
ActiveMQ提供了丰富的高级特性,包括但不限于: - **Broker拓扑(Broker Topologies)**:允许搭建集群、主备等复杂架构,提高系统的可用性和性能。 - **高级Broker特性**:如虚拟主机、负载均衡、镜像等功能,增强了...
ActiveMQ提供了多种特性,如持久性、事务支持、安全性等,并且支持多种协议,包括AMQP、OpenWire、MQTT、STOMP等。ActiveMQ因其高性能和可靠性,在企业级应用中被广泛采用。 ### 版本对应表 下面根据给定的部分...
除了上述配置,ActiveMQ还支持主题和队列的动态创建、网络集群、消息重试策略、消息分页、消息压缩等多种特性,这些都可以在`activemq.xml`中进行配置。 理解并灵活运用这些配置,能帮助你更好地管理和优化ActiveMQ...
Apache ActiveMQ 是一款非常流行的开源消息中间件,它支持 Java 消息服务 (JMS) 标准,并提供了多种高级功能,例如持久化、集群、故障转移等。ActiveMQ 能够帮助开发者实现解耦、可靠的消息传输以及高性能的应用程序...
- **Winkeemq-cpp**:这是一个基于 ActiveMQ-CPP 封装的高级 API 库,它简化了许多常见的初始化和清理工作,同时也隐藏了一些不必要的细节,从而进一步简化了开发流程。 #### 三、术语解析 - **ActiveMQ**:一个...
### ActiveMQ 快速上手知识点详解 #### 一、ActiveMQ简介 - **定义**:ActiveMQ 是 ...通过以上详细介绍,读者可以全面了解 ActiveMQ 的基础知识和高级特性,从而更好地利用 ActiveMQ 构建高效、可靠的应用系统。
"ActiveMQ in Action"是一本权威的ActiveMQ专著,深入探讨了ActiveMQ的高级特性,如集群、持久化、网络连接等,适合已经有一定基础并希望深入了解的开发者。 通过这些资料,用户可以系统性地学习和掌握ActiveMQ,...
除了基本的消息传递功能外,ActiveMQ还提供了许多高级特性,如消息路由、事务支持、集群等。这些特性使得ActiveMQ成为一个强大的企业级消息中间件解决方案。 - **消息路由**:通过集成Apache Camel等工具,ActiveMQ...
最后,ActiveMQ还提供了一些高级代理器特性和客户端选项,这些高级特性允许用户对消息代理进行更细粒度的控制,以适应各种复杂的业务场景。 总结来说,ActiveMQ是一个功能丰富、高度可靠且易于使用的消息中间件,它...
5. **高级特性**:ActiveMQ-CPP还包含事务支持、消息选择器、Durable Subscription等高级特性。事务保证了消息的原子性,消息选择器允许只接收满足特定条件的消息,而Durable Subscription则确保即使消费者离线,也...
通过深入学习和研究ActiveMQ的源代码,开发者不仅可以掌握消息中间件的基本原理,还能学习到高级特性如事务处理、消息优先级、延迟消息、死信队列等。同时,对于Java NIO、多线程编程、网络编程等领域也有很好的实践...