ActiveMQ 高级特性
?
异步发送
消息生产者使用持久(persistent)传递模式发送消息的时候,Producer.send() 方法会被阻塞,直到 broker 发送一个确认消息给生产者,这个确认消息暗示生产者 broker 已经成功地将它发送的消息路由到目标目的并把消息保存到二级存储中。这个过程通常称为同步发送。但有一个例外,当发送方法在一个事物上下文中时,被阻塞的是 commit 方法而不是 send 方法。commit 方法成功返回意味着所有的持久消息都以被写到二级存储中。
同步发送持久消息能够提供更好的可靠性,但这潜在地影响了程序的相应速度,因为在接受到 broker 的确认消息之前应用程序或线程会被阻塞。如果应用程序能够容忍一些消息的丢失,那么可以使用异步发送。异步发送不会在受到 broker 的确认之前一直阻塞 Producer.send 方法。如果想启动异步传送可以把 connector uri 的 jms.useAsyncSend 选项设为 true,如下所示:
?? ??? ??? ????
?? ??? ??? ???? tcp://localhost:61616?jms.useAsyncSend=true
从?
在客户端组合目的中也可以混合使用主题和队列。如果一个虚目的映射的物理目的中既有队列又有主题,那么必须使用 queue:// 或 topic:// 前缀。如下所示,在上面示例的基础上为虚目的 Q.BLAST 添加了一个主题。
?? ??? ??? ??? java.naming.factory.initial=org.apache.?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? <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。