1.异步发送
消息生产者使用持久(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
2.单独确认
在 ActiveMQ 5.2 中添加了一个新的确认模式,这种确认模式是特定于 ActiveMQ 的,jms 规范暂时并不支持这种确认模式。这种确认模式由ora.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 表示,用来确认一个单独的消息。这中确认模式是相对于 Session.CLIENT_ACKNOWLEDGE 的,在 CLIENT_ACKNOWLEDGE 模式下,调用消息的 acknowledge() 方法会确认由此 session 消费的所有消息,而在INDIVIDUAL_ACKNOWLEDGE 模式下,仅会确认调用 acknowledge() 方法的消息。
3.企业集成模式
通过 Apache Camel ,ActiveMQ 支持《EIP 》一书中提到的企业集成模式。参见http://activemq.apache.org/enterprise-integration-patterns.html。
4.消息游标
在 ActiveMQ 的之前版本中,broker 会把正在传输的消息保存在内存中。使用这种内存模型,当一个消费者消费消息的速度跟不上生产者生产消息的速度的时候,会是 broker 内存中维护的正在传输的消息数量迅速增长,最终到达最大限额。当到达此最大限额后,broker 就不能接受来自客户端的消息,这样生产者就会被阻塞直到 broker 的内存中有保存消息的空间为止。
从 5.0 版本开始,ActiveMQ 实现了一种新的内存模型以防止慢速的消费者阻塞运行速度更快的生产者。这种内存模型使用了消息游标,详情请查看http://activemq.apache.org/message-cursors.html 。
5.连接池
org.apache.activemq.pool 包中提供了一个服务提供者对象 PooledConnectionFactory,通过这个类应用程序可以缓存 Connection、Session 以及 MessageProducer。更详细的信息可以查看PooledConnectionFactory 的文档。
PooledConnectionFactory 主要用来与其它一些框架或工具集成使用,例如 spring。
6.消息转换器
从 ActiveMQ 5 开始,ActiveMQ 允许开发人员把他们的消息转换对象添加到 ActiveMQ 的消息总线上。一个ActiveMQ 转换对象(或者是转换器)必须实现 org.apache.activemq.MessageTransformaer 接口。
如果要设置一个消息转换器,可以调用一下对象的 setTransformaer() 方法设置一个消息转换器:ActiveMQConnectionFactory、ActiveMQConnection、 ActiveMQSession、ActiveMQMessageConsumer和 ActiveMQMessageProducer。消息转化器是可继承的,也就是说当设置了 ActiveMQConenctionFactory的消息转化器后,由此 ActiveMQConnectionFacttory 创建的连接、会话、消费者和生产者都会继承 ActiveMQConnectionFactory 的消息转换器。
7.组合目的
组合目的是 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>
8.镜像队列
镜像队列特性允许应用程序监控通过队列的消息流。如果启用镜像队列,那么发送到某个队列的消息会被发布到一个主题中,因此对通过队列传递的消息感兴趣的应用程序就可以订阅相应的主题。例如,应用程序中有生产者向队列 Q.TEST 发送消息,同样有一些消费者接收此队列中的消息。假设现在希望能够监控通过这个主题的消息,这可以通过镜像队列来实现,监控程序则可以监听主题VirtualTopic.Mirror.Q.TEST,这样就能接收到发送到主题 Q.TEST 上的所有消息。
默认情况下没有启用镜像队列功能,如果希望启用这个特性可以设置 broker xml 配置文件中 <broker> 元素的属性 useMirroredQueues 为 true。
相关推荐
消息队列:ActiveMQ:ActiveMQ的高级特性:虚拟目的地与代理.docx
本文将深入探讨虚拟Topic及路由功能,帮助读者理解如何利用这些特性来优化消息传递机制。 #### 一、虚拟Topic配置与原理 ##### 1.1 虚拟Topic简介 虚拟Topic是一种特殊的Topic配置,它允许将一个Topic的消息转发到...
在提供的“一头扎进JMS之ActiveMQ视频教程”中,你将学习如何配置和使用ActiveMQ,包括安装和启动服务、创建和管理消息队列、使用生产者和消费者发送与接收消息、理解不同消息模式的工作原理,以及如何利用ActiveMQ...
3. **高级特性**:ActiveMQ具备如消息组通信、消息优先级、延迟接收、虚拟接收者、消息持久化等高级特性,增强了消息处理的灵活性和可靠性。 4. **JMS 1.1及J2EE规范支持**:ActiveMQ完全符合JMS 1.1和J2EE 1.4规范...
除了基本的发布/订阅和点对点模式,ActiveMQ还提供了其他高级特性,如消息优先级、分页、虚拟主题等。例如,通过设置消息优先级,可以确保关键任务优先处理;虚拟主题(Virtual Topics)允许广播消息到多个订阅者,...
ActiveMQ提供了丰富的高级特性,包括但不限于: - **Broker拓扑(Broker Topologies)**:允许搭建集群、主备等复杂架构,提高系统的可用性和性能。 - **高级Broker特性**:如虚拟主机、负载均衡、镜像等功能,增强了...
"ActiveMQ in Action"是一本权威的ActiveMQ专著,深入探讨了ActiveMQ的高级特性,如集群、持久化、网络连接等,适合已经有一定基础并希望深入了解的开发者。 通过这些资料,用户可以系统性地学习和掌握ActiveMQ,...
自己做的尚硅谷周阳老师ActiveMQ课程脑图,其中自己所用做案例的环境搭建都...进行MQ多节点集群的部署,最后学习MQ的高级特性和高频面试题的分析。 希望通过本次的学习, 能够帮助同学们取得更大的进步,加油O(∩_∩)O
2. 配置管理:通过Web控制台(默认地址:http://localhost:8161/admin/)进行配置和监控,或者修改`conf/activemq.xml`进行高级设置。 3. 创建和管理资源:在Web控制台或通过API创建消息队列、主题等,并管理消费者...
8. 高级特性:提供了关于ActiveMQ高级特性的讨论,例如集群、故障转移、消息持久化等。 ActiveMQ与JMS的关系十分紧密,因为JMS是一套规范,提供了消息传输的抽象,而ActiveMQ则是实现了这一套规范的一个中间件产品...
除了基本的消息传递功能外,ActiveMQ还提供了许多高级特性,如消息路由、事务支持、集群等。这些特性使得ActiveMQ成为一个强大的企业级消息中间件解决方案。 - **消息路由**:通过集成Apache Camel等工具,ActiveMQ...
4. **高级特性**:包括事务、持久化、优先级、时间戳、消息组、死信队列、DLQ 等。 5. **集群与高可用**:描述如何通过集群配置实现 ActiveMQ 的高可用性。 6. **监控与管理**:介绍使用 Web Console 或 JMX 进行...
综上所述,Spring ActiveMQ的整合涵盖了Spring的JMS支持、ActiveMQ的配置和使用、消息的生产和消费、事务管理、以及ActiveMQ的高级特性。这些知识点对于构建可扩展、健壮且可靠的分布式系统至关重要。在实际开发中,...
- **ActiveMQ 5.15.0**:该版本开始支持JDK 1.8.x,这是目前最常用的JDK版本之一。 - **面向未来**:随着JDK 1.8的推出,ActiveMQ也开始逐步优化其架构,以更好地适应未来的开发趋势和技术需求。 ### 结论 从上述...
ActiveMQ 的高级特性也是教程的重点,例如事务支持、优先级队列、消息分页和网络集群。事务支持确保了消息的原子性,保证了数据一致性;优先级队列使得高优先级的消息可以优先处理;消息分页则解决了大数据量下的...
在实际应用中,ActiveMQ还支持许多高级特性,如持久化存储、消息确认、事务处理、消息分页、消息优先级和死信队列等。这些特性确保了在大规模并发和高负载情况下,消息的可靠传递和系统性能。 总结来说,ActiveMQ...
Apache ActiveMQ 是一款非常流行的开源消息中间件,它支持 Java 消息服务 (JMS) 标准,并提供了多种高级功能,例如持久化、集群、故障转移等。ActiveMQ 能够帮助开发者实现解耦、可靠的消息传输以及高性能的应用程序...
除了上述配置,ActiveMQ还支持主题和队列的动态创建、网络集群、消息重试策略、消息分页、消息压缩等多种特性,这些都可以在`activemq.xml`中进行配置。 理解并灵活运用这些配置,能帮助你更好地管理和优化ActiveMQ...
分为基础/实战/面试上中下三大部分,带你从零基础入门到熟练掌握ActiveMQ,能够结合Spring/SpringBoot进行实际开发配置并能够进行MQ多节点集群的部署,可以学习到MQ的高级特性,并对高频面试题进行了剖析讲解。