Author: buildbot
Date: Wed Oct 25 16:24:29 2017
New Revision: 1020038

Log:
Production update by buildbot for activemq

Modified:
    websites/production/activemq/content/cache/main.pageCache
    websites/production/activemq/content/per-destination-policies.html
    websites/production/activemq/content/virtual-destinations.html

Modified: websites/production/activemq/content/cache/main.pageCache
==============================================================================
Binary files - no diff available.

Modified: websites/production/activemq/content/per-destination-policies.html
==============================================================================
--- websites/production/activemq/content/per-destination-policies.html 
(original)
+++ websites/production/activemq/content/per-destination-policies.html Wed Oct 
25 16:24:29 2017
@@ -71,7 +71,7 @@
   <tbody>
         <tr>
         <td valign="top" width="100%">
-<div class="wiki-content maincontent"><p>We support a number of different 
policies which can be attached to individual destinations (queues, topics) or 
to wildcards of queue/topic hierarchies. This makes it easy to configure how 
different regions of the JMS destination space are handled.</p><p>The 
properties you can set on a Destination are as follows:</p><div 
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" 
rowspan="1" class="confluenceTh"><p>Common Property</p></th><th colspan="1" 
rowspan="1" class="confluenceTh"><p>Default Value</p></th><th colspan="1" 
rowspan="1" class="confluenceTh"><p>Description</p></th></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>advisoryForConsumed</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Send an advisory message when a 
message is consumed by a client.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="c
 onfluenceTd"><p><code>advisoryForDelivery</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Send an advisory message when a message is 
sent to a client.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>advisoryForFastProducers</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Send an advisory message if a 
producer is deemed fast.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>advisoryForSlowConsumers</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Send an advisory message if a 
consumer is deemed slow.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>advisoryWhenFull</code></p></td><td colspan="1" 
rowspan="1" class="conf
 luenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Send an advisory message when a limit (memory, store, 
temp disk) is full.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>enableAudit</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td colspan="1" 
rowspan="1" 
class="confluenceTd"><p>When&#160;<strong><code>true</code></strong> the broker 
will track duplicate messages. Duplicates can happen for non-persistent 
messages during failover.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>gcInactiveDestinations</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Garbage collect inactive 
destinations.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>inactiveTimoutBeforeGC</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd">
 <p><code>5000</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The timeout (in ms) after which a destination is 
considered inactive.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>includeBodyForAdvisory</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Includes the body of the 
original message that triggered the advisory as part of 
the&#160;<strong><code>dataStructure</code></strong> field in the advisory 
message (where applicable). Normally the message body is 
cleared.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>maxBrowsePageSize</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>400</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>The maximum number of messages to page in 
from the store at one time for a browser.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="conflue
 nceTd"><p><code>maxDestinations</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>-1</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>(v5.12) If&#160;<strong><code>0</code></strong> or 
greater, sets the maximum number of destinations that can be created. This 
parameter is intended to limit the number of hierarchical destinations that can 
be created under a wildcard destination.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>maxPageSize</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>200</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>The maximum number of messages 
to page in from the store at one time. Increase this value to improve 
performance for queue destination's that contain grouped messages that are 
consumed by multiple concurrent consumers.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>memoryLimit</code></p></td><td 
colspan="1" rowspan
 ="1" class="confluenceTd"><p><code>n/a</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>The memory limit (in bytes) of the 
destination's cursor.</p><p>This memory limit is subordinate to the system 
level memory limit, as specified by the&#160;<a shape="rect" 
href="producer-flow-control.html"><code>&lt;systemUsage&gt;/&lt;memoryUsage&gt;</code></a>
 <span class="confluence-link">attribute</span>. There is no default for this 
value; it simply acts as a child to the overall broker memory until the broker 
memory is exhausted.</p><p><strong>Note</strong>: when this limit is specified 
the destination's&#160;<strong><code>cursorMemoryHighWaterMark</code></strong> 
will be applied against it and not 
the&#160;<strong><code>&lt;systemUsage&gt;/&gt;&lt;memoryUsage&gt;</code></strong>
 memory limit.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>minimumMessageSize</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>1024</code></p><
 /td><td colspan="1" rowspan="1" class="confluenceTd"><p>For non-serialized 
messages (embedded broker) - the assumed size of the message used for memory 
usage calculation. Serialized messages use the serialized size as the basis for 
the memory calculation.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>prioritizedMessages</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Persist message priority 
information.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>producerFlowControl</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>If 
<strong><code>true</code></strong> the broker will throttle (flow-control) the 
producer. Throttling is achieved either by withholding the producer's ACK or by 
raising a&#160;<strong><code>javax.jms.ResourceAllocationExc
 eption</code></strong> (that's propagated back to the client) when local 
resources e.g., memory and/or storage, have been 
exhausted.</p><p>If&#160;<strong><code>false</code></strong> excess messages 
will be written to the message store to prevent memory exhaustion. However, 
when the message store reaches capacity the producer will be throttled until 
resources are freed.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>slowConsumerStrategy</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Sets the strategy for handling 
slow consumers. See <a shape="rect" class="external-link" 
href="https://github.com/apache/activemq/blob/master/activemq-broker/src/main/java/org/apache/activemq/broker/region/policy/AbortSlowConsumerStrategy.java";
 rel="nofollow">AbortSlowConsumerStrategy.</a></p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>storeUsageHighWat
 erMark</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>100</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The percentage (%) threshold of 
the&#160;<strong><code>&lt;systemUsage&gt;/&lt;storeUsage&gt;</code></strong> 
store limit which when exceeded causes a send to block.</p></td></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>useCache</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>If&#160;<strong><code>true</code></strong> 
persistent messages are cached for fast retrieval from 
store.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><span><code>usePrefetchExtension</code><br 
clear="none"></span></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>true</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The prefetch extension is used when a&#160;message is 
delivered but not ACK
 'ed, such that the broker can dispatch&#160;another message, e.g., 
<code>prefetch == 0</code>, the idea being that there will always be prefetch 
number of messages pending. It also allows a transaction batch to exceed the 
prefetch&#160;value.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><code><span style="color: rgb(0,0,0);">sendFailIfNoSpace 
</span></code></td><td colspan="1" rowspan="1" class="confluenceTd"><code><span 
style="color: rgb(0,0,0);">false</span></code></td><td colspan="1" rowspan="1" 
class="confluenceTd"><span style="color: rgb(0,0,0);">(v5.16.0) If true, will 
cause a send to fail with a javax.jms.ResourceAllocationException when the 
destination has reached is resource limits (memory or 
storage)</span></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><code><span style="color: 
rgb(0,0,0);">sendFailIfNoSpaceAfterTimeout</span></code></td><td colspan="1" 
rowspan="1" class="confluenceTd"><code>0</code></td><td colspan="1" rowspan="1" 
clas
 s="confluenceTd"><span style="color: rgb(0,0,0);">(v5.16.0) if &gt; 0, will 
cause a send to fail with a javax.jms.ResourceAllocationException when the 
destination resource limits (memory or storage) remain exhausted for the 
configured duration in 
milliseconds</span></td></tr></tbody></table></div><p>Additional properties for 
a Queue</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Queue Only Property</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Default Value</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" 
rowspan="1" 
class="confluenceTd"><p><code>allConsumersExclusiveByDefault</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p>When&#160;<strong><code>true</code></strong> all 
consumers will be exclusive. See <a shape="rect" href="nms/activemq-exclus
 ive-consumers.html">ActiveMQ Exclusive Consumers</a></p></td></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>cursorMemoryHighWaterMark</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>70</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>The percentage (%) threshold 
applied either to 
the&#160;<strong><code>&lt;systemUsage&gt;/&lt;memoryUsage&gt;</code></strong> 
or the destination's&#160;<strong><code>memoryLimit</code></strong> (when 
defined) which when exceeded will cause the destination's cursor to either 
block or write to disk.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>consumersBeforeDispatchStarts</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>0</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>When the first consumer 
connects, wait for specified number of consumers before message dispatching 
starts.</p></td></tr><tr><td colspan="1" rowspan="1" c
 lass="confluenceTd"><p><code>expireMessagesPeriod</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>30000</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>The period (in ms) of checks 
for message expiry on queued messages, value of 0 
disables.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>lazyDispatch</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Only page in from store the number of 
messages that can be dispatched at time.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><pre>maxExpirePageSize</pre></td><td 
colspan="1" rowspan="1" class="confluenceTd"><pre>400</pre></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>The maximum number of messages to page in 
when periodically expiring messages.</p><p>Messages are paged in according to 
this setting if the number of messages in memory pending dis
 patch is less than this value, and there are messages in the store to page in. 
Messages are expired during this paging step as they are brought into memory 
from the store.</p><p>Once the paging process is completed, messages are 
expired from the list of those that are in memory and pending dispatch, then 
from the list of those that are in memory but not yet targeted at a 
subscription.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>optimizedDispatch</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Don't use a separate thread for dispatching 
from a Queue.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>persistJMSRedelivered</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>(v 5.10) If true, before a 
persistent message is dispatched by the br
 oker for the first time, the message is rewritten to reflect the possible 
delivery.</p><p>This ensures the 
message&#160;<strong><code>JMSRedelivered</code></strong> header is a reliable 
indication of possible duplicate delivery.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>queuePrefetch</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>n/a</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Sets the prefetch for consumers 
that are using the default value.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>strictOrderDispatch</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p>If&#160;<strong><code>true</code></strong> queue will 
not round robin consumers, but it'll use a single one until its prefetch buffer 
is full.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>timeBefore
 DispatchStarts</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>0</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>When the first consumer connects, wait for specified 
time (in ms) before message dispatching starts.</p></td></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>useConsumerPriority</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Use the priority of a consumer 
when dispatching messages from a 
Queue.</p></td></tr></tbody></table></div><p>Additional properties for a 
Topic</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th 
colspan="1" rowspan="1" class="confluenceTh"><p>Topic Only Property</p></th><th 
colspan="1" rowspan="1" class="confluenceTh"><p>Default Value</p></th><th 
colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>
 <code>advisoryForDiscardingMessages</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Send an advisory when a message is discarded from a non 
durable subscription.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>cursorMemoryHighWaterMark</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>70</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>The percentage (%) threshold 
applied to 
the&#160;<strong><code>&lt;systemUsage&gt;/&lt;memoryUsage&gt;</code></strong> 
which when exceeded will cause the destination's cursor to either block or 
write to disk.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><span style="color: 
rgb(0,0,0);"><code>alwaysRetroactive</code><br clear="none"></span></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confl
 uenceTd"><p>Makes all subscribers retroactive negating the need to modify the 
clients to enable this feature.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>durableTopicPrefetch</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>n/a</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Sets the prefetch for durable 
topic consumers that are using the default value.</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p><span style="color: 
rgb(0,0,0);"><code>expireMessagesPeriod</code><br 
clear="none"></span></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>30000</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The interval (in ms) between message expiration checks 
on inactive durable subscribers.</p><p><strong>Note</strong>: set to 
<strong><code>0</code></strong> to disable message expiration 
checking.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><co
 de>topicPrefetch</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>n/a</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Sets the prefetch for topic consumers that are using 
the default value.</p></td></tr></tbody></table></div><p><span 
style="line-height: 1.4285715;">The following are examples of different 
policies that can be customized on a per destination 
basis:</span></p><ul><li><a shape="rect" href="dispatch-policies.html">Dispatch 
Policies</a></li></ul><p>&#160;</p></div>
+<div class="wiki-content maincontent"><p>We support a number of different 
policies which can be attached to individual destinations (queues, topics) or 
to wildcards of queue/topic hierarchies. This makes it easy to configure how 
different regions of the JMS destination space are handled.</p><p>The 
properties you can set on a Destination are as follows:</p><div 
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" 
rowspan="1" class="confluenceTh"><p>Common Property</p></th><th colspan="1" 
rowspan="1" class="confluenceTh"><p>Default Value</p></th><th colspan="1" 
rowspan="1" class="confluenceTh"><p>Description</p></th></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>advisoryForConsumed</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Send an advisory message when a 
message is consumed by a client.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="c
 onfluenceTd"><p><code>advisoryForDelivery</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Send an advisory message when a message is 
sent to a client.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>advisoryForFastProducers</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Send an advisory message if a 
producer is deemed fast.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>advisoryForSlowConsumers</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Send an advisory message if a 
consumer is deemed slow.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>advisoryWhenFull</code></p></td><td colspan="1" 
rowspan="1" class="conf
 luenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Send an advisory message when a limit (memory, store, 
temp disk) is full.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>enableAudit</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td colspan="1" 
rowspan="1" 
class="confluenceTd"><p>When&#160;<strong><code>true</code></strong> the broker 
will track duplicate messages. Duplicates can happen for non-persistent 
messages during failover.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>gcInactiveDestinations</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Garbage collect inactive 
destinations.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>inactiveTimoutBeforeGC</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd">
 <p><code>5000</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The timeout (in ms) after which a destination is 
considered inactive.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>includeBodyForAdvisory</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Includes the body of the 
original message that triggered the advisory as part of 
the&#160;<strong><code>dataStructure</code></strong> field in the advisory 
message (where applicable). Normally the message body is 
cleared.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>maxBrowsePageSize</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>400</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>The maximum number of messages to page in 
from the store at one time for a browser.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="conflue
 nceTd"><p><code>maxDestinations</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>-1</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>(v5.12) If&#160;<strong><code>0</code></strong> or 
greater, sets the maximum number of destinations that can be created. This 
parameter is intended to limit the number of hierarchical destinations that can 
be created under a wildcard destination.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>maxPageSize</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>200</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>The maximum number of messages 
to page in from the store at one time. Increase this value to improve 
performance for queue destination's that contain grouped messages that are 
consumed by multiple concurrent consumers.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>memoryLimit</code></p></td><td 
colspan="1" rowspan
 ="1" class="confluenceTd"><p><code>n/a</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>The memory limit (in bytes) of the 
destination's cursor.</p><p>This memory limit is subordinate to the system 
level memory limit, as specified by the&#160;<a shape="rect" 
href="producer-flow-control.html"><code>&lt;systemUsage&gt;/&lt;memoryUsage&gt;</code></a>
 <span class="confluence-link">attribute</span>. There is no default for this 
value; it simply acts as a child to the overall broker memory until the broker 
memory is exhausted.</p><p><strong>Note</strong>: when this limit is specified 
the destination's&#160;<strong><code>cursorMemoryHighWaterMark</code></strong> 
will be applied against it and not 
the&#160;<strong><code>&lt;systemUsage&gt;/&gt;&lt;memoryUsage&gt;</code></strong>
 memory limit.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>minimumMessageSize</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>1024</code></p><
 /td><td colspan="1" rowspan="1" class="confluenceTd"><p>For non-serialized 
messages (embedded broker) - the assumed size of the message used for memory 
usage calculation. Serialized messages use the serialized size as the basis for 
the memory calculation.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>prioritizedMessages</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Persist message priority 
information.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>producerFlowControl</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>If 
<strong><code>true</code></strong> the broker will throttle (flow-control) the 
producer. Throttling is achieved either by withholding the producer's ACK or by 
raising a&#160;<strong><code>javax.jms.ResourceAllocationExc
 eption</code></strong> (that's propagated back to the client) when local 
resources e.g., memory and/or storage, have been 
exhausted.</p><p>If&#160;<strong><code>false</code></strong> excess messages 
will be written to the message store to prevent memory exhaustion. However, 
when the message store reaches capacity the producer will be throttled until 
resources are freed.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>slowConsumerStrategy</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Sets the strategy for handling 
slow consumers. See <a shape="rect" class="external-link" 
href="https://github.com/apache/activemq/blob/master/activemq-broker/src/main/java/org/apache/activemq/broker/region/policy/AbortSlowConsumerStrategy.java";
 rel="nofollow">AbortSlowConsumerStrategy.</a></p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>storeUsageHighWat
 erMark</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>100</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The percentage (%) threshold of 
the&#160;<strong><code>&lt;systemUsage&gt;/&lt;storeUsage&gt;</code></strong> 
store limit which when exceeded causes a send to block.</p></td></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>useCache</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>If&#160;<strong><code>true</code></strong> 
persistent messages are cached for fast retrieval from 
store.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><span><code>usePrefetchExtension</code><br 
clear="none"></span></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>true</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The prefetch extension is used when a&#160;message is 
delivered but not ACK
 'ed, such that the broker can dispatch&#160;another message, e.g., 
<code>prefetch == 0</code>, the idea being that there will always be prefetch 
number of messages pending. It also allows a transaction batch to exceed the 
prefetch&#160;value.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><code><span style="color: rgb(0,0,0);">sendFailIfNoSpace 
</span></code></td><td colspan="1" rowspan="1" class="confluenceTd"><code><span 
style="color: rgb(0,0,0);">false</span></code></td><td colspan="1" rowspan="1" 
class="confluenceTd"><span style="color: rgb(0,0,0);">(v5.16.0) If true, will 
cause a send to fail with a javax.jms.ResourceAllocationException when the 
destination has reached is resource limits (memory or 
storage)</span></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><code><span style="color: 
rgb(0,0,0);">sendFailIfNoSpaceAfterTimeout</span></code></td><td colspan="1" 
rowspan="1" class="confluenceTd"><code>0</code></td><td colspan="1" rowspan="1" 
clas
 s="confluenceTd"><span style="color: rgb(0,0,0);">(v5.16.0) if &gt; 0, will 
cause a send to fail with a javax.jms.ResourceAllocationException when the 
destination resource limits (memory or storage) remain exhausted for the 
configured duration in 
milliseconds</span></td></tr></tbody></table></div><p>Additional properties for 
a Queue</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Queue Only Property</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Default Value</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" 
rowspan="1" 
class="confluenceTd"><p><code>allConsumersExclusiveByDefault</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p>When&#160;<strong><code>true</code></strong> all 
consumers will be exclusive. See <a shape="rect" href="nms/activemq-exclus
 ive-consumers.html">ActiveMQ Exclusive Consumers</a></p></td></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>cursorMemoryHighWaterMark</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>70</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>The percentage (%) threshold 
applied either to 
the&#160;<strong><code>&lt;systemUsage&gt;/&lt;memoryUsage&gt;</code></strong> 
or the destination's&#160;<strong><code>memoryLimit</code></strong> (when 
defined) which when exceeded will cause the destination's cursor to either 
block or write to disk.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>consumersBeforeDispatchStarts</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>0</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>When the first consumer 
connects, wait for specified number of consumers before message dispatching 
starts.</p></td></tr><tr><td colspan="1" rowspan="1" c
 lass="confluenceTd"><p><code>expireMessagesPeriod</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>30000</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>The period (in ms) of checks 
for message expiry on queued messages, value of 0 
disables.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>lazyDispatch</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Only page in from store the number of 
messages that can be dispatched at time.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><pre>maxExpirePageSize</pre></td><td 
colspan="1" rowspan="1" class="confluenceTd"><pre>400</pre></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>The maximum number of messages to page in 
when periodically expiring messages.</p><p>Messages are paged in according to 
this setting if the number of messages in memory pending dis
 patch is less than this value, and there are messages in the store to page in. 
Messages are expired during this paging step as they are brought into memory 
from the store.</p><p>Once the paging process is completed, messages are 
expired from the list of those that are in memory and pending dispatch, then 
from the list of those that are in memory but not yet targeted at a 
subscription.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>optimizedDispatch</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Don't use a separate thread for dispatching 
from a Queue.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>persistJMSRedelivered</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>(v 5.10) If true, before a 
persistent message is dispatched by the br
 oker for the first time, the message is rewritten to reflect the possible 
delivery.</p><p>This ensures the 
message&#160;<strong><code>JMSRedelivered</code></strong> header is a reliable 
indication of possible duplicate delivery.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>queuePrefetch</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>n/a</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Sets the prefetch for consumers 
that are using the default value.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>strictOrderDispatch</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p>If&#160;<strong><code>true</code></strong> queue will 
not round robin consumers, but it'll use a single one until its prefetch buffer 
is full.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>timeBefore
 DispatchStarts</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>0</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>When the first consumer connects, wait for specified 
time (in ms) before message dispatching starts.</p></td></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>useConsumerPriority</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Use the priority of a consumer 
when dispatching messages from a 
Queue.</p></td></tr></tbody></table></div><p>Additional properties for a 
Topic</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th 
colspan="1" rowspan="1" class="confluenceTh"><p>Topic Only Property</p></th><th 
colspan="1" rowspan="1" class="confluenceTh"><p>Default Value</p></th><th 
colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>
 <code>advisoryForDiscardingMessages</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Send an advisory when a message is discarded from a non 
durable subscription.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>cursorMemoryHighWaterMark</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>70</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>The percentage (%) threshold 
applied to 
the&#160;<strong><code>&lt;systemUsage&gt;/&lt;memoryUsage&gt;</code></strong> 
which when exceeded will cause the destination's cursor to either block or 
write to disk.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><span style="color: 
rgb(0,0,0);"><code>alwaysRetroactive</code><br clear="none"></span></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td 
colspan="1" rowspan="1" class="confl
 uenceTd"><p>Makes all subscribers retroactive negating the need to modify the 
clients to enable this feature.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>durableTopicPrefetch</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>n/a</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Sets the prefetch for durable 
topic consumers that are using the default value.</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p><span style="color: 
rgb(0,0,0);"><code>expireMessagesPeriod</code><br 
clear="none"></span></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>30000</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The interval (in ms) between message expiration checks 
on inactive durable subscribers.</p><p><strong>Note</strong>: set to 
<strong><code>0</code></strong> to disable message expiration 
checking.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><co
 de>topicPrefetch</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>n/a</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Sets the prefetch for topic consumers that are using 
the default value.</p></td></tr></tbody></table></div><p><span 
style="line-height: 1.4285715;">The following are examples of different 
policies that can be customized on a per destination 
basis:</span></p><ul><li><a shape="rect" href="dispatch-policies.html">Dispatch 
Policies</a></li></ul><pre>&#160;</pre><p>An example from the demos&#160;<a 
shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=activemq.git;a=blob;f=assembly/src/release/examples/conf/activemq-demo.xml;hb=HEAD";>https://git-wip-us.apache.org/repos/asf?p=activemq.git;a=blob;f=assembly/src/release/examples/conf/activemq-demo.xml;hb=HEAD</a>:&#160;</p><p><code
 class="xml plain">&lt;</code><code class="xml keyword">beans</code> <code 
class="xml color1">xmlns</code><code class="xml pl
 ain">=</code><code class="xml string">"<a shape="rect" class="external-link" 
href="http://www.springframework.org/schema/beans"; 
rel="nofollow">http://www.springframework.org/schema/beans</a>"</code></p><div 
class="line number2 index1 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code class="xml 
color1">xmlns:amq</code><code class="xml plain">=</code><code class="xml 
string">"<a shape="rect" class="external-link" 
href="http://activemq.apache.org/schema/core";>http://activemq.apache.org/schema/core</a>"</code></div><div
 class="line number3 index2 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code class="xml 
color1">xmlns:xsi</code><code class="xml plain">=</code><code class="xml 
string">"<a shape="rect" class="external-link" 
href="http://www.w3.org/2001/XMLSchema-instance"; 
rel="nofollow">http://www.w3.org/2001/XMLSchema-instance</a>"</code></div><div 
class="line number4 index3 alt1"><code class="xml spaces">&#160;&#1
 60;&#160;&#160;&#160;&#160;&#160;</code><code class="xml 
plain">xsi:schemaLocation="<a shape="rect" class="external-link" 
href="http://www.springframework.org/schema/beans"; 
rel="nofollow">http://www.springframework.org/schema/beans</a> <a shape="rect" 
class="external-link" 
href="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"; 
rel="nofollow">http://www.springframework.org/schema/beans/spring-beans-2.0.xsd</a></code></div><div
 class="line number5 index4 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain"><a shape="rect" class="external-link" 
href="http://activemq.apache.org/schema/core";>http://activemq.apache.org/schema/core</a>
 <a shape="rect" class="external-link" 
href="http://activemq.apache.org/schema/core/activemq-core.xsd";>http://activemq.apache.org/schema/core/activemq-core.xsd</a>"&gt;</cod
 e></div><div class="line number6 index5 alt1">&#160;</div><div class="line 
number7 index6 alt2"><code class="xml spaces">&#160;&#160;</code><code 
class="xml plain">&lt;</code><code class="xml keyword">bean</code> <code 
class="xml color1">class</code><code class="xml plain">=</code><code class="xml 
string">"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</code><code
 class="xml plain">/&gt;</code></div><div class="line number8 index7 
alt1">&#160;</div><div class="line number9 index8 alt2"><code class="xml 
spaces">&#160;&#160;</code><code class="xml plain">&lt;</code><code class="xml 
keyword">broker</code> <code class="xml color1">persistent</code><code 
class="xml plain">=</code><code class="xml string">"false"</code> <code 
class="xml color1">brokerName</code><code class="xml plain">=</code><code 
class="xml string">"${brokername}"</code> <code class="xml 
color1">xmlns</code><code class="xml plain">=</code><code class="xml 
string">"<a shape="rect" class="external
 -link" 
href="http://activemq.apache.org/schema/core";>http://activemq.apache.org/schema/core</a>"</code><code
 class="xml plain">&gt;</code></div><div class="line number10 index9 
alt1"><code class="xml spaces">&#160;&#160;&#160;&#160;</code><code class="xml 
comments">&lt;!--&#160; lets define the dispatch policy --&gt;</code></div><div 
class="line number11 index10 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;</code><code class="xml plain">&lt;</code><code 
class="xml keyword">destinationPolicy</code><code class="xml 
plain">&gt;</code></div><div class="line number12 index11 alt1"><code 
class="xml spaces">&#160;&#160;&#160;&#160;&#160;&#160;</code><code class="xml 
plain">&lt;</code><code class="xml keyword">policyMap</code><code class="xml 
plain">&gt;</code></div><div class="line number13 index12 alt2"><code 
class="xml spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code 
class="xml plain">&lt;</code><code class="xml 
keyword">policyEntries</code><code class="xml 
 plain">&gt;</code></div><div class="line number14 index13 alt1"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml keyword">policyEntry</code> 
<code class="xml plain">topic="FOO.&gt;"&gt;</code></div><div class="line 
number15 index14 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">dispatchPolicy</code><code class="xml plain">&gt;</code></div><div 
class="line number16 index15 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">roundRobinDispatchPolicy</code> <code class="xml 
plain">/&gt;</code></div><div class="line number17 index16 alt2"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><c
 ode class="xml plain">&lt;/</code><code class="xml 
keyword">dispatchPolicy</code><code class="xml plain">&gt;</code></div><div 
class="line number18 index17 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">subscriptionRecoveryPolicy</code><code class="xml 
plain">&gt;</code></div><div class="line number19 index18 alt2"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">lastImageSubscriptionRecoveryPolicy</code> <code class="xml 
plain">/&gt;</code></div><div class="line number20 index19 alt1"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;/</code><code class="xml 
keyword">subscriptionRecoveryPolicy</code><code class="xml 
plain">&gt;</code></div><div class="li
 ne number21 index20 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;/</code><code class="xml 
keyword">policyEntry</code><code class="xml plain">&gt;</code></div><div 
class="line number22 index21 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code>&#160;</div><div
 class="line number23 index22 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml keyword">policyEntry</code> 
<code class="xml plain">topic="ORDERS.&gt;"&gt;</code></div><div class="line 
number24 index23 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">dispatchPolicy</code><code class="xml plain">&gt;</code></div><div 
class="line number25 index24 alt2"><code class="xml spaces">&#160;&#16
 
0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">strictOrderDispatchPolicy</code> <code class="xml 
plain">/&gt;</code></div><div class="line number26 index25 alt1"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;/</code><code class="xml 
keyword">dispatchPolicy</code><code class="xml plain">&gt;</code></div><div 
class="line number27 index26 alt2">&#160;</div><div class="line number28 
index27 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml comments">&lt;!--&#160; 1 minute's worth --&gt;</code></div><div 
class="line number29 index28 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">subscriptionRecoveryPolicy</code><
 code class="xml plain">&gt;</code></div><div class="line number30 index29 
alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">timedSubscriptionRecoveryPolicy</code> <code class="xml 
color1">recoverDuration</code><code class="xml plain">=</code><code class="xml 
string">"60000"</code> <code class="xml plain">/&gt;</code></div><div 
class="line number31 index30 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;/</code><code class="xml 
keyword">subscriptionRecoveryPolicy</code><code class="xml 
plain">&gt;</code></div><div class="line number32 index31 alt1"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;/</code><code class="xml 
keyword">policyEntry</code><code class="xml plain">&gt;</code></div><div cl
 ass="line number33 index32 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;</code>&#160;</div><div class="line number34 
index33 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml keyword">policyEntry</code> 
<code class="xml plain">topic="PRICES.&gt;"&gt;</code></div><div class="line 
number35 index34 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml comments">&lt;!-- lets force old messages to be discarded for slow 
consumers --&gt;</code></div><div class="line number36 index35 alt1"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">pendingMessageLimitStrategy</code><code class="xml 
plain">&gt;</code></div><div class="line number37 index36 alt2"><code 
class="xml spaces">&#160;&#160;&#160;&#16
 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code 
class="xml plain">&lt;</code><code class="xml 
keyword">constantPendingMessageLimitStrategy</code> <code class="xml 
color1">limit</code><code class="xml plain">=</code><code class="xml 
string">"10"</code><code class="xml plain">/&gt;</code></div><div class="line 
number38 index37 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;/</code><code class="xml 
keyword">pendingMessageLimitStrategy</code><code class="xml 
plain">&gt;</code></div><div class="line number39 index38 
alt2">&#160;</div><div class="line number40 index39 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml comments">&lt;!--&#160; 10 seconds worth --&gt;</code></div><div 
class="line number41 index40 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 0;&#160;&#160;</code><code class="xml plain">&lt;</code><code class="xml 
keyword">subscriptionRecoveryPolicy</code><code class="xml 
plain">&gt;</code></div><div class="line number42 index41 alt1"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml 
keyword">timedSubscriptionRecoveryPolicy</code> <code class="xml 
color1">recoverDuration</code><code class="xml plain">=</code><code class="xml 
string">"10000"</code> <code class="xml plain">/&gt;</code></div><div 
class="line number43 index42 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;/</code><code class="xml 
keyword">subscriptionRecoveryPolicy</code><code class="xml 
plain">&gt;</code></div><div class="line number44 index43 alt1"><code 
class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code>
 &#160;</div><div class="line number45 index44 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;/</code><code class="xml 
keyword">policyEntry</code><code class="xml plain">&gt;</code></div><div 
class="line number46 index45 alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml keyword">policyEntry</code> 
<code class="xml color1">tempTopic</code><code class="xml plain">=</code><code 
class="xml string">"true"</code> <code class="xml 
color1">advisoryForConsumed</code><code class="xml plain">=</code><code 
class="xml string">"true"</code> <code class="xml plain">/&gt;</code></div><div 
class="line number47 index46 alt2"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code
 class="xml plain">&lt;</code><code class="xml keyword">policyEntry</code> 
<code class="xml color1">tempQue
 ue</code><code class="xml plain">=</code><code class="xml 
string">"true"</code> <code class="xml color1">advisoryForConsumed</code><code 
class="xml plain">=</code><code class="xml string">"true"</code> <code 
class="xml plain">/&gt;</code></div><div class="line number48 index47 
alt1"><code class="xml 
spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code class="xml 
plain">&lt;/</code><code class="xml keyword">policyEntries</code><code 
class="xml plain">&gt;</code></div><div class="line number49 index48 
alt2"><code class="xml spaces">&#160;&#160;&#160;&#160;&#160;&#160;</code><code 
class="xml plain">&lt;/</code><code class="xml keyword">policyMap</code><code 
class="xml plain">&gt;</code></div><div class="line number50 index49 
alt1"><code class="xml spaces">&#160;&#160;&#160;&#160;</code><code class="xml 
plain">&lt;/</code><code class="xml keyword">destinationPolicy</code><code 
class="xml plain">&gt;</code></div><div class="line number51 index50 
alt2"><code class="xml spa
 ces">&#160;&#160;</code><code class="xml plain">&lt;/</code><code class="xml 
keyword">broker</code><code class="xml plain">&gt;</code></div><div class="line 
number52 index51 alt1"><code class="xml plain">&lt;/</code><code class="xml 
keyword">beans</code><code class="xml plain">&gt;</code></div></div>
         </td>
         <td valign="top">
           <div class="navigation">

Modified: websites/production/activemq/content/virtual-destinations.html
==============================================================================
--- websites/production/activemq/content/virtual-destinations.html (original)
+++ websites/production/activemq/content/virtual-destinations.html Wed Oct 25 
16:24:29 2017
@@ -71,46 +71,7 @@
   <tbody>
         <tr>
         <td valign="top" width="100%">
-<div class="wiki-content maincontent"><p><em>Virtual Destinations</em> allow 
us to create logical destinations that clients can use to produce and consume 
from but which map onto one or more <em>physical destinations</em>. It allows 
us to provide more flexible loosely coupled messaging configurations.</p><h2 
id="VirtualDestinations-VirtualTopics">Virtual Topics</h2><p>The idea behind 
<em>publish subscribe</em> is a great one. Allow producers to be decoupled from 
consumers so that they do not even know how many consumers are interested in 
the messages they publish. The JMS specification defines support for durable 
topics however they have limitations as we will describe...</p><h3 
id="VirtualDestinations-ThelimitationsofJMSdurabletopics">The limitations of 
JMS durable topics</h3><p>A JMS durable subscriber MessageConsumer is created 
with a unique JMS clientID and durable subscriber name. To be JMS compliant 
only one JMS connection can be active at any point in time for one JMS clientI
 D, and only one consumer can be active for a clientID and subscriber name. 
i.e., only <strong>one</strong> thread can be actively consuming from a given 
logical topic subscriber. This means we cannot implement</p><ul><li>load 
balancing of messages.</li><li>fast failover of the subscriber if that one 
process running that one consumer thread dies.</li></ul><p>Now <em>queue</em> 
semantics in JMS offer the ability to load balance work across a number of 
consumers in a reliable way - allowing many threads, processes and machines to 
be used to process messages. Then we have sophisticated sticky load balancing 
techniques like <a shape="rect" href="message-groups.html">Message Groups</a> 
to load balance and parallelise work while maintaining ordering.</p><p>Another 
added benefit of having physical queues for each logical topic subscriber is we 
can them monitor the queue depths via <a shape="rect" href="jmx.html">JMX</a> 
to monitor system performance together with being able to browse these 
 physical queues.</p><h3 
id="VirtualDestinations-VirtualTopicstotherescue">Virtual Topics to the 
rescue</h3><p>The idea behind virtual topics is that producers send to a topic 
in the usual JMS way. Consumers can continue to use the Topic semantics in the 
JMS specification. However if the topic is virtual, consumer can consume from a 
physical queue for a logical topic subscription, allowing many consumers to be 
running on many machines &amp; threads to load balance the load.</p><p>E.g., 
let's say we have a topic called <strong>VirtualTopic.Orders</strong>. (Where 
the prefix VirtualTopic. indicates its a virtual topic). And we logically want 
to send orders to systems A and B. Now with regular durable topics we'd create 
a JMS consumer for clientID_A and "A" along with clientID_B and "B".</p><p>With 
virtual topics we can just go right ahead and consume to queue 
<strong>Consumer.A.VirtualTopic.Orders</strong> to be a consumer for system A 
or consume to <strong>Consumer.B.VirtualTopic.Orde
 rs</strong> to be a consumer for system B.</p><p>We can now have a pool of 
consumers for each system which then compete for messages for systems A or B 
such that all the messages for system A are processed exactly once and 
similarly for system B.</p><h3 
id="VirtualDestinations-Customizingtheout-of-the-boxdefaults">Customizing the 
out-of-the-box defaults</h3><p>The out-of-the-box defaults are described above. 
Namely that the only virtual topics available must be within the 
<strong>VirtualTopic.&gt;</strong> namespace and that the consumer queues are 
named <strong>Consumer.*.VirtualTopic.&gt;</strong>.</p><p>You can configure 
this to use whatever naming convention you wish. The following <a shape="rect" 
class="external-link" 
href="https://svn.apache.org/repos/asf/incubator/activemq/trunk/activemq-unit-tests/src/test/resources/org/apache/activemq/broker/virtual/global-virtual-topics.xml";>example</a>
 shows how to make all topics virtual topics. The example below is using the 
name <stron
 g>&gt;</strong> to indicate 'match all topics'. You could use this wildcard to 
apply different virtual topic policies in different hierarchies.</p><parameter 
ac:name="">xml</parameter><plain-text-body>&lt;destinationInterceptors&gt;
-  &lt;virtualDestinationInterceptor&gt;
-       &lt;virtualDestinations&gt;
-         &lt;virtualTopic name="&gt;" prefix="VirtualTopicConsumers.*." 
selectorAware="false"/&gt;
-       &lt;/virtualDestinations&gt;
-  &lt;/virtualDestinationInterceptor&gt;
-&lt;/destinationInterceptors&gt;</plain-text-body><p>Note that making a topic 
virtual does add a small CPU overhead when sending messages to the topic but it 
is fairly small.</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh">Option</th><th colspan="1" rowspan="1" 
class="confluenceTh">Default</th><th colspan="1" rowspan="1" 
class="confluenceTh">Description</th></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">selectorAware</td><td colspan="1" rowspan="1" 
class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">only messages that match one of the existing subscribers 
are actually dispatched. Using this option prevents the build up of unmatched 
messages when selectors are used by exclusive consumers</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd">local</td><td colspan="1" 
rowspan="1" class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">when true, d
 on't fan out messages that were received over a network</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd">concurrentSend</td><td colspan="1" 
rowspan="1" class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">when true, use an executor to fanout such that sends occur 
in parallel. This allows the journal to batch writes which will reduce disk io 
(5.12)</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">transactedSend</td><td colspan="1" rowspan="1" 
class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">when true, use a transaction for fanout sends such that 
there is a single disk sync. A local broker transaction will be created if 
there is no client transaction 
(5.13)</td></tr></tbody></table></div><p>&#160;</p><h2 
id="VirtualDestinations-CompositeDestinations">Composite 
Destinations</h2><p>Composite Destinations allow for one-to-many relationships 
on individual destinations; the main use case is for <em>composit
 e queues</em>. For example when a message is sent to queue A you may want to 
forward it also to queues B and C and topic D. Composite destinations are then 
a mapping from a virtual destination to a collection of other physical 
destinations. In this case the mapping is broker side and the client is unaware 
of the mapping between the destinations. This is different from client side <a 
shape="rect" href="composite-destinations.html">Composite Destinations</a> 
where the client uses a URL notation to specify the actual physical 
destinations that a message must be sent to.</p><p>The following <a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/incubator/activemq/trunk/activemq-unit-tests/src/test/resources/org/apache/activemq/broker/virtual/composite-queue.xml";>example</a>
 shows how to set up a <strong>&lt;compositeQueue/&gt;</strong> element in the 
XML configuration so that when a message is sent to <code>MY.QUEUE</code> then 
it is really forwarded to the physical
  queue <code>FOO</code> and the topic <code>BAR</code>.</p><parameter 
ac:name="">xml</parameter><plain-text-body>&lt;destinationInterceptors&gt;
-  &lt;virtualDestinationInterceptor&gt;
-       &lt;virtualDestinations&gt;
-         &lt;compositeQueue name="MY.QUEUE"&gt;
-               &lt;forwardTo&gt;
-                 &lt;queue physicalName="FOO" /&gt;
-                 &lt;topic physicalName="BAR" /&gt;
-               &lt;/forwardTo&gt;
-         &lt;/compositeQueue&gt;
-       &lt;/virtualDestinations&gt;
-  &lt;/virtualDestinationInterceptor&gt;
-&lt;/destinationInterceptors&gt;</plain-text-body><p>By default, subscribers 
cannot consume messages directly from a composite queue or topic - it is a 
logical construct only. Given the configuration above, subscribers can only 
consume messages from <code>FOO</code> and <code>BAR</code>; but not 
<code>MY.QUEUE</code>.</p><p>This behaviour can be altered to implement use 
cases such as watching a queue by sending the same messages to a notification 
topic (wire tapping), by setting the optionally set <code>forwardOnly</code> 
attribute to false.</p><parameter 
ac:name="">xml</parameter><plain-text-body>&lt;compositeQueue 
name="IncomingOrders" forwardOnly="false"&gt;
-    &lt;forwardTo&gt;
-        &lt;topic physicalName="Notifications" /&gt;
-    &lt;/forwardTo&gt;
-&lt;/compositeQueue&gt;</plain-text-body><p>Messages sent to 
<code>IncomingOrders</code> will all be copied and forwarded to 
<code>Notifications</code>, before being placed on the physical 
<code>IncomingOrders</code> queue for consumption by subscribers.</p><p>Where 
the <code>forwardOnly</code> attribute is not defined or is set to 
<code>true</code>, there is no logical difference between a 
<code>compositeQueue</code> and a <code>compositeTopic</code> - they can be 
used interchangeably. It is only when a composite destination is made physical 
through the use of <code>forwardOnly</code> that the choice of 
<code>compositeTopic</code>/<code>compositeQueue</code> has an impact on 
behavior.</p><h3 id="VirtualDestinations-Usingfiltereddestinations">Using 
filtered destinations</h3><p>From Apache ActiveMQ <strong>4.2</strong> onwards 
you can now use selectors to define virtual destinations.</p><p>You may wish to 
create a virtual destination which forwards messages to multiple destinations b
 ut applying a selector first to decide if the message really does have to go 
to a particular destination.</p><p>The following example shows how a message 
sent to the virtual destination <strong>MY.QUEUE</strong> will be forwarded to 
<strong>FOO</strong> and <strong>BAR</strong> if the selectors 
match</p><parameter 
ac:name="">xml</parameter><plain-text-body>&lt;destinationInterceptors&gt;
-  &lt;virtualDestinationInterceptor&gt;
-       &lt;virtualDestinations&gt;
-         &lt;compositeQueue name="MY.QUEUE"&gt;
-               &lt;forwardTo&gt;
-                 &lt;filteredDestination selector="odd = 'yes'" 
queue="FOO"/&gt;
-                 &lt;filteredDestination selector="i = 5" topic="BAR"/&gt;
-               &lt;/forwardTo&gt;
-         &lt;/compositeQueue&gt;
-       &lt;/virtualDestinations&gt;
-  &lt;/virtualDestinationInterceptor&gt;
-&lt;/destinationInterceptors&gt;</plain-text-body><h2 
id="VirtualDestinations-AvoidingDuplicateMessageinaNetworkofBrokers">Avoiding 
Duplicate Message in a Network of Brokers</h2><p>You have to make sure that the 
messages sent to the <strong>Consumer.*.VirtualTopic.&gt;</strong> destination 
are not forwarded when you're using both queue-based and non-queue based 
subscribers to the virtual topic (that is, if you have normal topic subscribers 
to the virtual topic). If you use Virtual Topics in a network of brokers, it is 
likely you will get duplicate messages if you use the default network 
configuration. This is because a network node will not only forward message 
sent to the virtual topic, but also the associated physical queues. To fix 
this, you should disable forwarding messages on the associated physical 
queues.</p><p>Here is an example of how to do that:</p><parameter 
ac:name="">xml</parameter><plain-text-body>    &lt;networkConnectors&gt;
-      &lt;networkConnector uri="static://(tcp://localhost:61617)"&gt;
-       &lt;excludedDestinations&gt;
-         &lt;queue physicalName="Consumer.*.VirtualTopic.&gt;"/&gt;
-       &lt;/excludedDestinations&gt;
-      &lt;/networkConnector&gt;
-    &lt;/networkConnectors&gt;
-</plain-text-body></div>
+<div class="wiki-content maincontent"><p><em>Virtual Destinations</em> allow 
us to create logical destinations that clients can use to produce and consume 
from but which map onto one or more <em>physical destinations</em>. It allows 
us to provide more flexible loosely coupled messaging configurations.</p><h2 
id="VirtualDestinations-VirtualTopics">Virtual Topics</h2><p>The idea behind 
<em>publish subscribe</em> is a great one. Allow producers to be decoupled from 
consumers so that they do not even know how many consumers are interested in 
the messages they publish. The JMS specification defines support for durable 
topics however they have limitations as we will describe...</p><h3 
id="VirtualDestinations-ThelimitationsofJMSdurabletopics">The limitations of 
JMS durable topics</h3><p>A JMS durable subscriber MessageConsumer is created 
with a unique JMS clientID and durable subscriber name. To be JMS compliant 
only one JMS connection can be active at any point in time for one JMS clientI
 D, and only one consumer can be active for a clientID and subscriber name. 
i.e., only <strong>one</strong> thread can be actively consuming from a given 
logical topic subscriber. This means we cannot implement</p><ul><li>load 
balancing of messages.</li><li>fast failover of the subscriber if that one 
process running that one consumer thread dies.</li></ul><p>Now <em>queue</em> 
semantics in JMS offer the ability to load balance work across a number of 
consumers in a reliable way - allowing many threads, processes and machines to 
be used to process messages. Then we have sophisticated sticky load balancing 
techniques like <a shape="rect" href="message-groups.html">Message Groups</a> 
to load balance and parallelise work while maintaining ordering.</p><p>Another 
added benefit of having physical queues for each logical topic subscriber is we 
can them monitor the queue depths via <a shape="rect" href="jmx.html">JMX</a> 
to monitor system performance together with being able to browse these 
 physical queues.</p><h3 
id="VirtualDestinations-VirtualTopicstotherescue">Virtual Topics to the 
rescue</h3><p>The idea behind virtual topics is that producers send to a topic 
in the usual JMS way. Consumers can continue to use the Topic semantics in the 
JMS specification. However if the topic is virtual, consumer can consume from a 
physical queue for a logical topic subscription, allowing many consumers to be 
running on many machines &amp; threads to load balance the load.</p><p>E.g., 
let's say we have a topic called <strong>VirtualTopic.Orders</strong>. (Where 
the prefix VirtualTopic. indicates its a virtual topic). And we logically want 
to send orders to systems A and B. Now with regular durable topics we'd create 
a JMS consumer for clientID_A and "A" along with clientID_B and "B".</p><p>With 
virtual topics we can just go right ahead and consume to queue 
<strong>Consumer.A.VirtualTopic.Orders</strong> to be a consumer for system A 
or consume to <strong>Consumer.B.VirtualTopic.Orde
 rs</strong> to be a consumer for system B.</p><p>We can now have a pool of 
consumers for each system which then compete for messages for systems A or B 
such that all the messages for system A are processed exactly once and 
similarly for system B.</p><h3 
id="VirtualDestinations-Customizingtheout-of-the-boxdefaults">Customizing the 
out-of-the-box defaults</h3><p>The out-of-the-box defaults are described above. 
Namely that the only virtual topics available must be within the 
<strong>VirtualTopic.&gt;</strong> namespace and that the consumer queues are 
named <strong>Consumer.*.VirtualTopic.&gt;</strong>.</p><p>You can configure 
this to use whatever naming convention you wish. The following <a shape="rect" 
class="external-link" 
href="https://svn.apache.org/repos/asf/incubator/activemq/trunk/activemq-unit-tests/src/test/resources/org/apache/activemq/broker/virtual/global-virtual-topics.xml";>example</a>
 shows how to make all topics virtual topics. The example below is using the 
name <stron
 g>&gt;</strong> to indicate 'match all topics'. You could use this wildcard to 
apply different virtual topic policies in different hierarchies.</p><pre><span 
style="color: rgb(0,0,0);">&lt;destinationInterceptors&gt; 
</span></pre><pre><span style="color: rgb(0,0,0);"> 
&lt;virtualDestinationInterceptor&gt; </span></pre><pre><span style="color: 
rgb(0,0,0);"> &lt;virtualDestinations&gt; </span></pre><pre><span style="color: 
rgb(0,0,0);"> &lt;virtualTopic name="&gt;" prefix="VirtualTopicConsumers.*." 
selectorAware="false"/&gt; </span>   </pre><pre>   
&lt;/virtualDestinations&gt;</pre><pre><span style="color: rgb(0,0,0);"> 
&lt;/virtualDestinationInterceptor&gt; </span></pre><pre><span style="color: 
rgb(0,0,0);">&lt;/destinationInterceptors&gt;</span></pre><p>&#160;</p><p>Note 
that making a topic virtual does add a small CPU overhead when sending messages 
to the topic but it is fairly small.</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" c
 lass="confluenceTh">Option</th><th colspan="1" rowspan="1" 
class="confluenceTh">Default</th><th colspan="1" rowspan="1" 
class="confluenceTh">Description</th></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">selectorAware</td><td colspan="1" rowspan="1" 
class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">only messages that match one of the existing subscribers 
are actually dispatched. Using this option prevents the build up of unmatched 
messages when selectors are used by exclusive consumers</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd">local</td><td colspan="1" 
rowspan="1" class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">when true, don't fan out messages that were received over 
a network</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">concurrentSend</td><td colspan="1" rowspan="1" 
class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">when true, use an executor t
 o fanout such that sends occur in parallel. This allows the journal to batch 
writes which will reduce disk io (5.12)</td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd">transactedSend</td><td colspan="1" rowspan="1" 
class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">when true, use a transaction for fanout sends such that 
there is a single disk sync. A local broker transaction will be created if 
there is no client transaction (5.13)</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><span>dropOnResourceLimit</span></td><td colspan="1" 
rowspan="1" class="confluenceTd">false</td><td colspan="1" rowspan="1" 
class="confluenceTd">when true, ignore any ResourceAllocationException thrown 
during fanout (see: sendFailIfNoSpace policy entry) 
(5.16)</td></tr></tbody></table></div><p>&#160;</p><h2 
id="VirtualDestinations-CompositeDestinations">Composite 
Destinations</h2><p>Composite Destinations allow for one-to-many relationships 
on individual d
 estinations; the main use case is for <em>composite queues</em>. For example 
when a message is sent to queue A you may want to forward it also to queues B 
and C and topic D. Composite destinations are then a mapping from a virtual 
destination to a collection of other physical destinations. In this case the 
mapping is broker side and the client is unaware of the mapping between the 
destinations. This is different from client side <a shape="rect" 
href="composite-destinations.html">Composite Destinations</a> where the client 
uses a URL notation to specify the actual physical destinations that a message 
must be sent to.</p><p>The following <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/incubator/activemq/trunk/activemq-unit-tests/src/test/resources/org/apache/activemq/broker/virtual/composite-queue.xml";>example</a>
 shows how to set up a <strong>&lt;compositeQueue/&gt;</strong> element in the 
XML configuration so that when a message is sent to <code>MY.QUEUE<
 /code> then it is really forwarded to the physical queue <code>FOO</code> and 
the topic <code>BAR</code>.</p><pre><span style="color: 
rgb(0,0,0);">&lt;destinationInterceptors&gt;</span></pre><pre><span 
style="color: rgb(0,0,0);"> &lt;virtualDestinationInterceptor&gt; 
</span></pre><pre><span style="color: rgb(0,0,0);"> &lt;virtualDestinations&gt; 
</span></pre><pre><span style="color: rgb(0,0,0);"> &lt;compositeQueue 
name="MY.QUEUE"&gt;</span></pre><pre><span style="color: rgb(0,0,0);"> 
&lt;forwardTo&gt;</span></pre><pre><span style="color: rgb(0,0,0);"> &lt;queue 
physicalName="FOO" /&gt; </span></pre><pre><span style="color: rgb(0,0,0);"> 
&lt;topic physicalName="BAR" /&gt;</span></pre><pre><span style="color: 
rgb(0,0,0);"> &lt;/forwardTo&gt;</span></pre><pre><span style="color: 
rgb(0,0,0);"> &lt;/compositeQueue&gt;</span></pre><pre><span style="color: 
rgb(0,0,0);"> &lt;/virtualDestinations&gt;</span></pre><pre><span style="color: 
rgb(0,0,0);"> &lt;/virtualDestinationInterceptor&gt;</
 span></pre><pre><span style="color: 
rgb(0,0,0);">&lt;/destinationInterceptors&gt;</span></pre><p>&#160;</p><p>By 
default, subscribers cannot consume messages directly from a composite queue or 
topic - it is a logical construct only. Given the configuration above, 
subscribers can only consume messages from <code>FOO</code> and 
<code>BAR</code>; but not <code>MY.QUEUE</code>.</p><p>This behaviour can be 
altered to implement use cases such as watching a queue by sending the same 
messages to a notification topic (wire tapping), by setting the optionally set 
<code>forwardOnly</code> attribute to false.</p><pre>&lt;compositeQueue 
name="IncomingOrders" forwardOnly="false"&gt; </pre><pre>   
&lt;forwardTo&gt;</pre><pre>    &lt;topic physicalName="Notifications" 
/&gt;</pre><pre>   &lt;/forwardTo&gt;</pre><pre> 
&lt;/compositeQueue&gt;</pre><p>&#160;</p><p>Messages sent to 
<code>IncomingOrders</code> will all be copied and forwarded to 
<code>Notifications</code>, before being placed on the phys
 ical <code>IncomingOrders</code> queue for consumption by 
subscribers.</p><p>Where the <code>forwardOnly</code> attribute is not defined 
or is set to <code>true</code>, there is no logical difference between a 
<code>compositeQueue</code> and a <code>compositeTopic</code> - they can be 
used interchangeably. It is only when a composite destination is made physical 
through the use of <code>forwardOnly</code> that the choice of 
<code>compositeTopic</code>/<code>compositeQueue</code> has an impact on 
behavior.</p><h3 id="VirtualDestinations-Usingfiltereddestinations">Using 
filtered destinations</h3><p>From Apache ActiveMQ <strong>4.2</strong> onwards 
you can now use selectors to define virtual destinations.</p><p>You may wish to 
create a virtual destination which forwards messages to multiple destinations 
but applying a selector first to decide if the message really does have to go 
to a particular destination.</p><p>The following example shows how a message 
sent to the virtual destinatio
 n <strong>MY.QUEUE</strong> will be forwarded to <strong>FOO</strong> and 
<strong>BAR</strong> if the selectors 
match</p><pre>&lt;destinationInterceptors&gt; 
&lt;virtualDestinationInterceptor&gt; &lt;virtualDestinations&gt; </pre><pre>   
&lt;compositeQueue name="MY.QUEUE"&gt;</pre><pre>    
&lt;forwardTo&gt;</pre><pre>     &lt;filteredDestination selector="odd = 'yes'" 
queue="FOO"/&gt;</pre><pre>     &lt;filteredDestination selector="i = 5" 
topic="BAR"/&gt;</pre><pre>    &lt;/forwardTo&gt;</pre><pre>  
&lt;/compositeQueue&gt;</pre><pre>&lt;/virtualDestinations&gt; 
&lt;/virtualDestinationInterceptor&gt; 
&lt;/destinationInterceptors&gt;</pre><p>&#160;</p><h2 
id="VirtualDestinations-AvoidingDuplicateMessageinaNetworkofBrokers">Avoiding 
Duplicate Message in a Network of Brokers</h2><p>You have to make sure that the 
messages sent to the <strong>Consumer.*.VirtualTopic.&gt;</strong> destination 
are not forwarded when you're using both queue-based and non-queue based 
subscribers to the virtu
 al topic (that is, if you have normal topic subscribers to the virtual topic). 
If you use Virtual Topics in a network of brokers, it is likely you will get 
duplicate messages if you use the default network configuration. This is 
because a network node will not only forward message sent to the virtual topic, 
but also the associated physical queues. To fix this, you should disable 
forwarding messages on the associated physical queues.</p><p>Here is an example 
of how to do that:</p><pre><span style="color: 
rgb(0,0,0);">&lt;networkConnectors&gt; &lt;networkConnector uri="static://(<a 
shape="rect" href="tcp://localhost:61617" 
rel="nofollow">tcp://localhost:61617</a>)"&gt;</span></pre><pre><span 
style="color: rgb(0,0,0);"> &lt;excludedDestinations&gt; 
</span></pre><pre><span style="color: rgb(0,0,0);"> &lt;queue 
physicalName="Consumer.*.VirtualTopic.&gt;"/&gt; </span></pre><pre><span 
style="color: rgb(0,0,0);"> &lt;/excludedDestinations&gt; 
</span></pre><pre><span style="color: rgb(0,0,0)
 ;">&lt;/networkConnector&gt; 
&lt;/networkConnectors&gt;</span></pre><p>&#160;</p></div>
         </td>
         <td valign="top">
           <div class="navigation">


Reply via email to