Author: buildbot Date: Thu Sep 25 14:20:52 2014 New Revision: 923536 Log: Production update by buildbot for activemq
Modified: websites/production/activemq/content/cache/main.pageCache websites/production/activemq/content/mqtt.html websites/production/activemq/content/subscription-recovery-policy.html Modified: websites/production/activemq/content/cache/main.pageCache ============================================================================== Binary files - no diff available. Modified: websites/production/activemq/content/mqtt.html ============================================================================== --- websites/production/activemq/content/mqtt.html (original) +++ websites/production/activemq/content/mqtt.html Thu Sep 25 14:20:52 2014 @@ -35,6 +35,7 @@ <link href='http://activemq.apache.org/styles/highlighter/styles/shCore.css' rel='stylesheet' type='text/css' /> <link href='http://activemq.apache.org/styles/highlighter/styles/shThemeEclipse.css' rel='stylesheet' type='text/css' /> <script src='http://activemq.apache.org/styles/highlighter/scripts/shCore.js' type='text/javascript'></script> + <script src='http://activemq.apache.org/styles/highlighter/scripts/shBrushJava.js' type='text/javascript'></script> <script src='http://activemq.apache.org/styles/highlighter/scripts/shBrushXml.js' type='text/javascript'></script> <script type="text/javascript"> @@ -93,9 +94,12 @@ <script class="theme: Default; brush: xml; gutter: false" type="syntaxhighlighter"><![CDATA[ <transportConnector name="mqtt+nio" uri="mqtt+nio+ssl://localhost:1883"/> ]]></script> </div></div><ul><li>For more details on using SSL with ActiveMQ see the following article (<a shape="rect" class="external-link" href="http://activemq.apache.org/how-do-i-use-ssl.html">How do I use SSL</a>).</li></ul><h3 id="MQTT-WorkingwithDestinationswithMQTT">Working with Destinations with MQTT</h3><p>MQTT supports hierarchies and wildcards, though the delimiters and characters are different: - Here's the mapping:</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>function</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>ActiveMQ</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>MQTT</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>separator</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>.</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>/</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>element</p></t d><td colspan="1" rowspan="1" class="confluenceTd"><p><code>*</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>+<br clear="none"></code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>sub tree</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>#<br clear="none"></code></p></td></tr></tbody></table></div><p>These values are automatically transposed between clients using JMS/NMS/Stomp and clients using MQTTT. For example - a client subscribing to "foo/#/bar" would receive messages published on a JMS Topic of foo.blah.bar.</p><h3 id="MQTT-Messagetransformations">Message transformations</h3><p>MQTT messages are transformed into an JMS ByteMessage. Conversely, the body of any JMS Message is converted to a byte buffer to be the payload of an MQTT message.</p><h3 id="MQTT-KeepAlive">Keep Alive</h3><p>When a client connects, it will send a keep-alive dur ation, usually defaulting to 10s. ActiveMQ will honor the keep-alive duration by setting up an Inactivity Monitor that allows a grace period of 1.5 * duration. After that grace period duration elapses a connection could be closed if there is no activity. A broker receiving a PINGREQ and sending PINGRESP is considered activity to keep the connection opened.</p><p>If a client sends a keep-alive value of 0, ActiveMQ will not set up an <a shape="rect" class="external-link" href="http://activemq.apache.org/activemq-inactivitymonitor.html">Inactivity Monitor</a> and connections will not be auto-shutdown due to inactivity. This however can lead to potentially leaky connections, so a default keep alive can be set on the server side (by an admin, for example) to not allow inactive connections to hang. This default keep alive would only be used if specified and if the client requests a keep-alive value of 0. The unit for the keep-alive value is milliseconds.</p><p>To enable a default, server- side MQTT keep alive:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> -<script class="theme: Default; brush: xml; gutter: false" type="syntaxhighlighter"><![CDATA[<transportConnector name="mqtt" uri="mqtt://localhost:1883?transport.defaultKeepAlive=60000"/> -]]></script> -</div></div></div> +<script class="theme: Default; brush: xml; gutter: false" type="syntaxhighlighter"><![CDATA[<transportConnector name="mqtt" uri="mqtt://localhost:1883?transport.defaultKeepAlive=60000"/>]]></script> +</div></div><h3 id="MQTT-MessagePrefetch">Message Prefetch</h3><p>When MQTT client connects, it locally create JMS-like consumer to the broker. By default this consumer is created with prefetch size of 1 (message prefetching is explained <a shape="rect" href="what-is-the-prefetch-limit-for.html">here</a> in more details). Usually, increasing message prefetch size can boost the performance as messages are dispatched to consumers in batches instead of waiting for the individual acknowledges. To increase prefetch size, you can use <em>activeMQSubscriptionPrefetch</em> transport option, like</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +<script class="theme: Default; brush: java; gutter: false" type="syntaxhighlighter"><![CDATA[<transportConnector name="mqtt" uri="mqtt://localhost:1883?transport.activeMQSubscriptionPrefetch=32766"/>]]></script> +</div></div><h3 id="MQTT-SubscriptionStrategy">Subscription Strategy</h3><p>ActiveMQ is a JMS broker in its core, so there needs to be some mapping between MQTT subscriptions and JMS semantics. Subscriptions with QoS=0 (At Most Once) are directly mapped to plain JMS non-persistent topics. For reliable messaging, QoS=1 and QoS=2, by default subscriptions are transformed to JMS durable topic subscribers. This behaviour is desired in most scenarios. For some use cases, it is useful to map these subscriptions to <a shape="rect" href="virtual-destinations.html">virtual topics</a>. Virtual topics provide a better scalability and are generally better solution if you want to use you MQTT subscribers over network of brokers. To change subscription strategy to use virtual topic, use the following settings:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +<script class="theme: Default; brush: java; gutter: false" type="syntaxhighlighter"><![CDATA[<transportConnector name="mqtt" uri="mqtt://localhost:1883?transport.subscriptionStrategy=mqtt-virtual-topic-subscriptions"/>]]></script> +</div></div><h3 id="MQTT-RetainedMessages">Retained Messages</h3><p>If a message has been published with the <em>retain</em> flag set, then the message will be 'remembered' by the topic so that if a new subscription arrives, the last retained message is sent to the subscription. Underneath, the broker uses <a shape="rect" href="subscription-recovery-policy.html">retained message subscription recovery policy</a> to retain messages with <em>ActiveMQ.Retain</em> property set. During the message conversion, MQTT messages with retain flag become JMS message with the <em>ActiveMQ.Retain </em>property set and retained by the broker.</p></div> </td> <td valign="top"> <div class="navigation"> Modified: websites/production/activemq/content/subscription-recovery-policy.html ============================================================================== --- websites/production/activemq/content/subscription-recovery-policy.html (original) +++ websites/production/activemq/content/subscription-recovery-policy.html Thu Sep 25 14:20:52 2014 @@ -72,29 +72,7 @@ <tbody> <tr> <td valign="top" width="100%"> -<div class="wiki-content maincontent"><p>The subscription recovery policy allows you to go back in time when you subscribe to a topic.</p> - -<p>For example imagine you are processing a price feed; you're using a federated network and either a network glitch occurs or someone kills the broker you're talking to. If you reconnect to another broker in the cluster you may have lost messages.</p> - -<p>So we support a timed or fixed size recovery buffer so that if you reconnect to another broker within some time period (depending on volume & RAM this could be 30 seconds to 5 minutes), then any messages you missed during the downtime are redelivered before new messages are delivered to you.</p> - -<p>For more information see <a shape="rect" href="retroactive-consumer.html">Retroactive Consumer</a></p> - -<h3 id="SubscriptionRecoveryPolicy-Lastimagecaching">Last image caching</h3> - -<p>Its often common in financial market data type worlds to want to know the latest price of say IBM stock along with get all the future updates to the price. Historically you often had a request-reply snapshot quote service for the latest price, then you subscribe to a topic for updates. The issue is the client then has 2 APIs / middlewares to deal with - often quite different things - plus you have an ordering issue (race condition) - the update could beat the last price request so you can get out of order (going back in time to an old price, which could be very old).</p> - -<p>One of our <em>subscription recovery policy</em> implementations is called <strong>Last Image Subscription Policy</strong> which will ensure that when you subscribe to a topic (say PRICES.NASDAQ.IBM), you will receive the last image (the last message that was sent on that topic) plus any updates which occur in the future, with ordering to ensure that the last image is always first before any new messages arrive.</p> - -<p>A common problem in market data type situations is that you may have a cache of last image prices, then a feed of new price changes; if you request the last price from the cache and subscribe to new prices; depending on how you do it you can either, miss an update or receive a newer update before the old last image arrives (so either get out of order messages).</p> - - -<p>Note that you can configure the subscription recovery policy, and most other policies on different destinations or wildcards. So you may use last image policy for prices on topics only and use a buffered fixed size policy for other notifications on different topics etc.</p> - -<h3 id="SubscriptionRecoveryPolicy-SummaryofAvailableRecoveryPolicies">Summary of Available Recovery Policies</h3> -<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Policy Name </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Sample Configuration </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Description </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> FixedSizedSubscriptionRecoveryPolicy </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <fixedSizedSubscriptionRecoveryPolicy maximumSize="1024"/> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Keep a fixed amount of memory in RAM for message history which is evicted in time order. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> FixedCountSubscriptionRecoveryPolicy </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <fixedCountSubscriptionRecoveryPolicy maximumSize="100"/> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Keep a fixed count of last messages. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> LastImageSubscriptionRecoveryPolicy </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <lastImageSubscriptionRecoveryPolicy/> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Keep only the last message. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> NoSubscriptionRecoveryPolicy </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <noSubscriptionRecoveryPolicy/> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Disables message recovery. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> QueryBasedSubscriptionRecoveryPolicy </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <queryBasedSubscriptionRecoveryPolicy query="JMSType = 'car' AND color = 'blue'"/> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Perform a user specific query mechanism to load any message they may have missed. Details on message selectors are available here: </p> -<a shape="rect" class="external-link" href="http://java.sun.com/j2ee/1.4/docs/api/javax/jms/Message.html" rel="nofollow">http://java.sun.com/j2ee/1.4/docs/api/javax/jms/Message.html</a> -<p></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> TimedSubscriptionRecoveryPolicy </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <timedSubscriptionRecoveryPolicy recoverDuration="60000" /> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Keep a timed buffer of messages around in memory and use that to recover new subscriptions. Recovery time is in milliseconds. </p></td></tr></tbody></table></div></div> +<div class="wiki-content maincontent"><p>The subscription recovery policy allows you to go back in time when you subscribe to a topic.</p><p>For example imagine you are processing a price feed; you're using a federated network and either a network glitch occurs or someone kills the broker you're talking to. If you reconnect to another broker in the cluster you may have lost messages.</p><p>So we support a timed or fixed size recovery buffer so that if you reconnect to another broker within some time period (depending on volume & RAM this could be 30 seconds to 5 minutes), then any messages you missed during the downtime are redelivered before new messages are delivered to you.</p><p>For more information see <a shape="rect" href="retroactive-consumer.html">Retroactive Consumer</a></p><h3 id="SubscriptionRecoveryPolicy-Lastimagecaching">Last image caching</h3><p>Its often common in financial market data type worlds to want to know the latest price of say IBM stock along with get a ll the future updates to the price. Historically you often had a request-reply snapshot quote service for the latest price, then you subscribe to a topic for updates. The issue is the client then has 2 APIs / middlewares to deal with - often quite different things - plus you have an ordering issue (race condition) - the update could beat the last price request so you can get out of order (going back in time to an old price, which could be very old).</p><p>One of our <em>subscription recovery policy</em> implementations is called <strong>Last Image Subscription Policy</strong> which will ensure that when you subscribe to a topic (say PRICES.NASDAQ.IBM), you will receive the last image (the last message that was sent on that topic) plus any updates which occur in the future, with ordering to ensure that the last image is always first before any new messages arrive.</p><p>A common problem in market data type situations is that you may have a cache of last image prices, then a feed of n ew price changes; if you request the last price from the cache and subscribe to new prices; depending on how you do it you can either, miss an update or receive a newer update before the old last image arrives (so either get out of order messages).</p><p>Note that you can configure the subscription recovery policy, and most other policies on different destinations or wildcards. So you may use last image policy for prices on topics only and use a buffered fixed size policy for other notifications on different topics etc.</p><h3 id="SubscriptionRecoveryPolicy-SummaryofAvailableRecoveryPolicies">Summary of Available Recovery Policies</h3><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Policy Name</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Sample Configuration</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>Fi xedSizedSubscriptionRecoveryPolicy</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><fixedSizedSubscriptionRecoveryPolicy maximumSize="1024"/></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Keep a fixed amount of memory in RAM for message history which is evicted in time order.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>FixedCountSubscriptionRecoveryPolicy</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><fixedCountSubscriptionRecoveryPolicy maximumSize="100"/></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Keep a fixed count of last messages.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>LastImageSubscriptionRecoveryPolicy</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><lastImageSubscriptionRecoveryPolicy/></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Keep only the last message.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceT d"><p>NoSubscriptionRecoveryPolicy</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><noSubscriptionRecoveryPolicy/></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Disables message recovery.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>QueryBasedSubscriptionRecoveryPolicy</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><queryBasedSubscriptionRecoveryPolicy query="JMSType = 'car' AND color = 'blue'"/></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Perform a user specific query mechanism to load any message they may have missed. Details on message selectors are available here:</p><a shape="rect" class="external-link" href="http://java.sun.com/j2ee/1.4/docs/api/javax/jms/Message.html" rel="nofollow">http://java.sun.com/j2ee/1.4/docs/api/javax/jms/Message.html</a><p> </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>TimedSubscriptionRecoveryPolicy</p></td><td colspan="1" rowspan= "1" class="confluenceTd"><p><timedSubscriptionRecoveryPolicy recoverDuration="60000" /></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Keep a timed buffer of messages around in memory and use that to recover new subscriptions. Recovery time is in milliseconds.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">RetainedMessageSubscriptionRecoveryPolicy</td><td colspan="1" rowspan="1" class="confluenceTd"><r<span>etainedMessageSubscriptionRecoveryPolicy/></span></td><td colspan="1" rowspan="1" class="confluenceTd">Keep the last message with ActiveMQ.Retain property set to true</td></tr></tbody></table></div></div> </td> <td valign="top"> <div class="navigation">