1、目标策略

在节点destinationPolicy配置策略,可以对单个或者所有的主题和队列进行设置,使用流量监控,当消息达到memoryLimit的时候,ActiveMQ会减慢消息的产生甚至阻塞,destinationPolicy的配置如下:


Java



<destinationPolicy>


            <policyMap>


               <policyEntries>


                <         policyEntry          topic         =         ">"                  producerFlowControl         =         "true"                  memoryLimit         =         "1mb"         >


                   <pendingSubscriberPolicy>


                    <         vmCursor                   /         >


                   <         /         pendingSubscriberPolicy         >


                <         /         policyEntry         >


                 <         policyEntry          queue         =         ">"                  producerFlowControl         =         "true"                  memoryLimit         =         "1mb"         >


                  <         !         --                  Use                   VM          cursor          for                   better          latency


                       For                   more          information         ,                   see         :                       


                       http         :         //activemq.apache.org/message-cursors.html             


                   <pendingQueuePolicy>


                    <         vmQueueCursor         /         >


                   <         /         pendingQueuePolicy         >


                  --         >


                 <         /         policyEntry         >


              <         /         policyEntries         >


             <         /         policyMap         >


<         /         destinationPolicy         >


producerFlowControl表示是否监控流量,默认为true,如果设置为false,消息就会存在磁盘中以防止内存溢出;memoryLimit表示在producerFlowControl=”true”的情况下,消息存储在内存中最大量,当消息达到这个值时,ActiveMQ会减慢消息的产生甚至阻塞。policyEntry的属性参考:http://activemq.apache.org/per-destination-policies.html

当producer发送的持久化消息到达broker之后,broker首先会把它保存在持久存储中。接下来,如果发现当前有活跃的consumer,如果这个consumer消费消息的速度能跟上producer生产消息的速度,那么ActiveMQ会直接把消息传递给broker内部跟这个consumer关联的dispatch queue;如果当前没有活跃的consumer或者consumer消费消息的速度跟不上producer生产消息的速度,那么ActiveMQ会使用Pending Message Cursors保存对消息的引用。在需要的时候,Pending Message Cursors把消息引用传递给broker内部跟这个consumer关联的dispatch queue。以下是两种Pending Message Cursors:

VM Cursor:在内存中保存消息的引用。

File Cursor:首先在内存中保存消息的引用,如果内存使用量达到上限,那么会把消息引用保存到临时文件中。

在缺省情况下,ActiveMQ 会根据使用的Message Store来决定使用何种类型的Message Cursors,但是你可以根据destination来配置Message Cursors。

对于topic,可以使用的pendingSubscriberPolicy 有vmCursor和fileCursor。可以使用的PendingDurableSubscriberMessageStoragePolicy有

vmDurableCursor 和 fileDurableSubscriberCursor;对于queue,可以使用的pendingQueuePolicy有vmQueueCursor 和 fileQueueCursor。

Message Cursors的使用参考:http://activemq.apache.org/message-cursors.html

2、存储设置

设置消息在内存、磁盘中存储的大小,配置如下:


Java



<systemUsage>


          <systemUsage>


               <memoryUsage>


                  <         memoryUsage          limit         =         "20 mb"         /         >


               <         /         memoryUsage         >


              <storeUsage>


                   <         storeUsage          limit         =         "1 gb"         /         >


              <         /         storeUsage         >


               <tempUsage>


                  <         tempUsage          limit         =         "100 mb"         /         >


               <         /         tempUsage         >


          <         /         systemUsage         >


<         /         systemUsage         >


memoryUsage表示ActiveMQ使用的内存,这个值要大于等于destinationPolicy中设置的所有队列的内存之和。

storeUsage表示持久化存储文件的大小。

tempUsage表示非持久化消息存储的临时内存大小。