blob: cfd278507707ef0e773ee35307a815adbca5c357 [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Ring Queues ยท ActiveMQ Artemis Documentation</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="">
<meta name="generator" content="GitBook 3.1.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="retroactive-addresses.html" />
<link rel="prev" href="last-value-queues.html" />
</head>
<body>
<div class="book">
<div class="book-summary">
<div id="book-search-input" role="search">
<input type="text" placeholder="Type to search" />
</div>
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="1.1" data-path="./">
<a href="./">
Introduction
</a>
</li>
<li class="chapter " data-level="1.2" data-path="notice.html">
<a href="notice.html">
Legal Notice
</a>
</li>
<li class="chapter " data-level="1.3" data-path="preface.html">
<a href="preface.html">
Preface
</a>
</li>
<li class="chapter " data-level="1.4" data-path="project-info.html">
<a href="project-info.html">
Project Info
</a>
</li>
<li class="chapter " data-level="1.5" data-path="versions.html">
<a href="versions.html">
Versions
</a>
</li>
<li class="chapter " data-level="1.6" data-path="messaging-concepts.html">
<a href="messaging-concepts.html">
Messaging Concepts
</a>
</li>
<li class="chapter " data-level="1.7" data-path="architecture.html">
<a href="architecture.html">
Architecture
</a>
</li>
<li class="chapter " data-level="1.8" data-path="using-server.html">
<a href="using-server.html">
Using the Server
</a>
</li>
<li class="chapter " data-level="1.9" data-path="upgrading.html">
<a href="upgrading.html">
Upgrading
</a>
</li>
<li class="chapter " data-level="1.10" data-path="address-model.html">
<a href="address-model.html">
Address Model
</a>
</li>
<li class="chapter " data-level="1.11" data-path="protocols-interoperability.html">
<a href="protocols-interoperability.html">
Protocols and Interoperability
</a>
</li>
<li class="chapter " data-level="1.12" data-path="amqp.html">
<a href="amqp.html">
AMQP
</a>
</li>
<li class="chapter " data-level="1.13" data-path="mqtt.html">
<a href="mqtt.html">
MQTT
</a>
</li>
<li class="chapter " data-level="1.14" data-path="stomp.html">
<a href="stomp.html">
STOMP
</a>
</li>
<li class="chapter " data-level="1.15" data-path="openwire.html">
<a href="openwire.html">
OpenWire
</a>
</li>
<li class="chapter " data-level="1.16" data-path="core.html">
<a href="core.html">
Core
</a>
</li>
<li class="chapter " data-level="1.17" data-path="jms-core-mapping.html">
<a href="jms-core-mapping.html">
Mapping JMS Concepts to the Core API
</a>
</li>
<li class="chapter " data-level="1.18" data-path="using-jms.html">
<a href="using-jms.html">
Using JMS
</a>
</li>
<li class="chapter " data-level="1.19" data-path="client-classpath.html">
<a href="client-classpath.html">
The Client Classpath
</a>
</li>
<li class="chapter " data-level="1.20" data-path="examples.html">
<a href="examples.html">
Examples
</a>
</li>
<li class="chapter " data-level="1.21" data-path="wildcard-routing.html">
<a href="wildcard-routing.html">
Routing Messages With Wild Cards
</a>
</li>
<li class="chapter " data-level="1.22" data-path="wildcard-syntax.html">
<a href="wildcard-syntax.html">
Wildcard Syntax
</a>
</li>
<li class="chapter " data-level="1.23" data-path="filter-expressions.html">
<a href="filter-expressions.html">
Filter Expressions
</a>
</li>
<li class="chapter " data-level="1.24" data-path="persistence.html">
<a href="persistence.html">
Persistence
</a>
</li>
<li class="chapter " data-level="1.25" data-path="configuring-transports.html">
<a href="configuring-transports.html">
Configuring Transports
</a>
</li>
<li class="chapter " data-level="1.26" data-path="config-reload.html">
<a href="config-reload.html">
Configuration Reload
</a>
</li>
<li class="chapter " data-level="1.27" data-path="connection-ttl.html">
<a href="connection-ttl.html">
Detecting Dead Connections
</a>
</li>
<li class="chapter " data-level="1.28" data-path="slow-consumers.html">
<a href="slow-consumers.html">
Detecting Slow Consumers
</a>
</li>
<li class="chapter " data-level="1.29" data-path="network-isolation.html">
<a href="network-isolation.html">
Avoiding Network Isolation
</a>
</li>
<li class="chapter " data-level="1.30" data-path="critical-analysis.html">
<a href="critical-analysis.html">
Detecting Broker Issues (Critical Analysis)
</a>
</li>
<li class="chapter " data-level="1.31" data-path="transaction-config.html">
<a href="transaction-config.html">
Resource Manager Configuration
</a>
</li>
<li class="chapter " data-level="1.32" data-path="flow-control.html">
<a href="flow-control.html">
Flow Control
</a>
</li>
<li class="chapter " data-level="1.33" data-path="send-guarantees.html">
<a href="send-guarantees.html">
Guarantees of sends and commits
</a>
</li>
<li class="chapter " data-level="1.34" data-path="undelivered-messages.html">
<a href="undelivered-messages.html">
Message Redelivery and Undelivered Messages
</a>
</li>
<li class="chapter " data-level="1.35" data-path="message-expiry.html">
<a href="message-expiry.html">
Message Expiry
</a>
</li>
<li class="chapter " data-level="1.36" data-path="large-messages.html">
<a href="large-messages.html">
Large Messages
</a>
</li>
<li class="chapter " data-level="1.37" data-path="paging.html">
<a href="paging.html">
Paging
</a>
</li>
<li class="chapter " data-level="1.38" data-path="scheduled-messages.html">
<a href="scheduled-messages.html">
Scheduled Messages
</a>
</li>
<li class="chapter " data-level="1.39" data-path="last-value-queues.html">
<a href="last-value-queues.html">
Last-Value Queues
</a>
</li>
<li class="chapter active" data-level="1.40" data-path="ring-queues.html">
<a href="ring-queues.html">
Ring Queues
</a>
</li>
<li class="chapter " data-level="1.41" data-path="retroactive-addresses.html">
<a href="retroactive-addresses.html">
Retroactive Addresses
</a>
</li>
<li class="chapter " data-level="1.42" data-path="exclusive-queues.html">
<a href="exclusive-queues.html">
Exclusive Queues
</a>
</li>
<li class="chapter " data-level="1.43" data-path="message-grouping.html">
<a href="message-grouping.html">
Message Grouping
</a>
</li>
<li class="chapter " data-level="1.44" data-path="consumer-priority.html">
<a href="consumer-priority.html">
Consumer Priority
</a>
</li>
<li class="chapter " data-level="1.45" data-path="pre-acknowledge.html">
<a href="pre-acknowledge.html">
Extra Acknowledge Modes
</a>
</li>
<li class="chapter " data-level="1.46" data-path="management.html">
<a href="management.html">
Management
</a>
</li>
<li class="chapter " data-level="1.47" data-path="management-console.html">
<a href="management-console.html">
Management Console
</a>
</li>
<li class="chapter " data-level="1.48" data-path="metrics.html">
<a href="metrics.html">
Metrics
</a>
</li>
<li class="chapter " data-level="1.49" data-path="security.html">
<a href="security.html">
Security
</a>
</li>
<li class="chapter " data-level="1.50" data-path="masking-passwords.html">
<a href="masking-passwords.html">
Masking Passwords
</a>
</li>
<li class="chapter " data-level="1.51" data-path="broker-plugins.html">
<a href="broker-plugins.html">
Broker Plugins
</a>
</li>
<li class="chapter " data-level="1.52" data-path="resource-limits.html">
<a href="resource-limits.html">
Resource Limits
</a>
</li>
<li class="chapter " data-level="1.53" data-path="jms-bridge.html">
<a href="jms-bridge.html">
The JMS Bridge
</a>
</li>
<li class="chapter " data-level="1.54" data-path="client-reconnection.html">
<a href="client-reconnection.html">
Client Reconnection and Session Reattachment
</a>
</li>
<li class="chapter " data-level="1.55" data-path="diverts.html">
<a href="diverts.html">
Diverting and Splitting Message Flows
</a>
</li>
<li class="chapter " data-level="1.56" data-path="core-bridges.html">
<a href="core-bridges.html">
Core Bridges
</a>
</li>
<li class="chapter " data-level="1.57" data-path="transformers.html">
<a href="transformers.html">
Transformers
</a>
</li>
<li class="chapter " data-level="1.58" data-path="duplicate-detection.html">
<a href="duplicate-detection.html">
Duplicate Message Detection
</a>
</li>
<li class="chapter " data-level="1.59" data-path="clusters.html">
<a href="clusters.html">
Clusters
</a>
</li>
<li class="chapter " data-level="1.60" data-path="federation.html">
<a href="federation.html">
Federation
</a>
<ul class="articles">
<li class="chapter " data-level="1.60.1" data-path="federation-address.html">
<a href="federation-address.html">
Address Federation
</a>
</li>
<li class="chapter " data-level="1.60.2" data-path="federation-queue.html">
<a href="federation-queue.html">
Queue Federation
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="1.61" data-path="ha.html">
<a href="ha.html">
High Availability and Failover
</a>
</li>
<li class="chapter " data-level="1.62" data-path="graceful-shutdown.html">
<a href="graceful-shutdown.html">
Graceful Server Shutdown
</a>
</li>
<li class="chapter " data-level="1.63" data-path="libaio.html">
<a href="libaio.html">
Libaio Native Libraries
</a>
</li>
<li class="chapter " data-level="1.64" data-path="thread-pooling.html">
<a href="thread-pooling.html">
Thread management
</a>
</li>
<li class="chapter " data-level="1.65" data-path="web-server.html">
<a href="web-server.html">
Embedded Web Server
</a>
</li>
<li class="chapter " data-level="1.66" data-path="logging.html">
<a href="logging.html">
Logging
</a>
</li>
<li class="chapter " data-level="1.67" data-path="rest.html">
<a href="rest.html">
REST Interface
</a>
</li>
<li class="chapter " data-level="1.68" data-path="embedding-activemq.html">
<a href="embedding-activemq.html">
Embedding the Broker
</a>
</li>
<li class="chapter " data-level="1.69" data-path="karaf.html">
<a href="karaf.html">
Apache Karaf
</a>
</li>
<li class="chapter " data-level="1.70" data-path="tomcat.html">
<a href="tomcat.html">
Apache Tomcat
</a>
</li>
<li class="chapter " data-level="1.71" data-path="spring-integration.html">
<a href="spring-integration.html">
Spring Integration
</a>
</li>
<li class="chapter " data-level="1.72" data-path="cdi-integration.html">
<a href="cdi-integration.html">
CDI Integration
</a>
</li>
<li class="chapter " data-level="1.73" data-path="intercepting-operations.html">
<a href="intercepting-operations.html">
Intercepting Operations
</a>
</li>
<li class="chapter " data-level="1.74" data-path="data-tools.html">
<a href="data-tools.html">
Data Tools
</a>
</li>
<li class="chapter " data-level="1.75" data-path="maven-plugin.html">
<a href="maven-plugin.html">
Maven Plugin
</a>
</li>
<li class="chapter " data-level="1.76" data-path="unit-testing.html">
<a href="unit-testing.html">
Unit Testing
</a>
</li>
<li class="chapter " data-level="1.77" data-path="perf-tuning.html">
<a href="perf-tuning.html">
Troubleshooting and Performance Tuning
</a>
</li>
<li class="chapter " data-level="1.78" data-path="configuration-index.html">
<a href="configuration-index.html">
Configuration Reference
</a>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="." >Ring Queues</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<div id="book-search-results">
<div class="search-noresults">
<section class="normal markdown-section">
<h1 id="ring-queue">Ring Queue</h1>
<p>Queues operate with first-in, first-out (FIFO) semantics which means that
messages, in general, are added to the &quot;tail&quot; of the queue and removed from the
&quot;head.&quot; A &quot;ring&quot; queue is a special type of queue with a <em>fixed</em> size. The
fixed size is maintained by removing the message at the head of the queue when
the number of messages on the queue reaches the configured size.</p>
<p>For example, consider a queue configured with a ring size of 3 and a producer
which sends the messages <code>A</code>, <code>B</code>, <code>C</code>, &amp; <code>D</code> in that order. Once <code>C</code> is sent
the number of messages in the queue will be 3 which is the same as the
configured ring size. We can visualize the queue growth like this...</p>
<p>After <code>A</code> is sent:</p>
<pre><code> |---|
head/tail -&gt; | A |
|---|
</code></pre><p>After <code>B</code> is sent:</p>
<pre><code> |---|
head -&gt; | A |
|---|
tail -&gt; | B |
|---|
</code></pre><p>After <code>C</code> is sent:</p>
<pre><code> |---|
head -&gt; | A |
|---|
| B |
|---|
tail -&gt; | C |
|---|
</code></pre><p>When <code>D</code> is sent it will be added to the tail of the queue and the message at
the head of the queue (i.e. <code>A</code>) will be removed so the queue will look like
this:</p>
<pre><code> |---|
head -&gt; | B |
|---|
| C |
|---|
tail -&gt; | D |
|---|
</code></pre><p>This example covers the most basic use case with messages being added to the
tail of the queue. However, there are a few other important use cases
involving:</p>
<ul>
<li>Messages in delivery &amp; rollbacks</li>
<li>Scheduled messages</li>
<li>Paging</li>
</ul>
<p>However, before we get to those use cases let&apos;s look at the basic configuration
of a ring queue.</p>
<h2 id="configuration">Configuration</h2>
<p>There are 2 parameters related to ring queue configuration.</p>
<p>The <code>ring-size</code> parameter can be set directly on the <code>queue</code> element. The
default value comes from the <code>default-ring-size</code> <code>address-setting</code> (see below).</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">addresses</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">address</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;myRing&quot;</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">anycast</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">queue</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;myRing&quot;</span> <span class="hljs-attr">ring-size</span>=<span class="hljs-string">&quot;3&quot;</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">anycast</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">address</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">addresses</span>&gt;</span>
</code></pre>
<p>The <code>default-ring-size</code> is an <code>address-setting</code> which applies to queues on
matching addresses which don&apos;t have an explicit <code>ring-size</code> set. This is
especially useful for auto-created queues. The default value is <code>-1</code> (i.e.
no limit).</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">address-settings</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">address-setting</span> <span class="hljs-attr">match</span>=<span class="hljs-string">&quot;ring.#&quot;</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">default-ring-size</span>&gt;</span>3<span class="hljs-tag">&lt;/<span class="hljs-name">default-ring-size</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">address-setting</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">address-settings</span>&gt;</span>
</code></pre>
<p>The <code>ring-size</code> may be updated at runtime. If the new <code>ring-size</code> is set
<em>lower</em> than the previous <code>ring-size</code> the broker will not immediately delete
enough messages from the head of the queue to enforce the new size. New
messages sent to the queue will force the deletion of old messages (i.e. the
queue won&apos;t grow any larger), but the queue will not reach its new size until
it does so <em>naturally</em> through the normal consumption of messages by
clients.</p>
<h2 id="messages-in-delivery--rollbacks">Messages in Delivery &amp; Rollbacks</h2>
<p>When messages are &quot;in delivery&quot; they are in an in-between state where they are
not technically on the queue but they are also not yet acknowledged. The
broker is at the consumer&#x2019;s mercy to either acknowledge such messages or not.
In the context of a ring queue, messages which are in-delivery cannot be
removed from the queue.</p>
<p>This presents a few dilemmas.</p>
<p>Due to the nature of messages in delivery a client can actually send more
messages to a ring queue than it would otherwise permit. This can make it
appear that the ring-size is not being enforced properly. Consider this
simple scenario:</p>
<ul>
<li>Queue <code>foo</code> with <code>ring-size=&quot;3&quot;</code></li>
<li>1 Consumer on queue <code>foo</code></li>
<li>Message <code>A</code> sent to <code>foo</code> &amp; dispatched to consumer</li>
<li><code>messageCount</code>=1, <code>deliveringCount</code>=1</li>
<li>Message <code>B</code> sent to <code>foo</code> &amp; dispatched to consumer</li>
<li><code>messageCount</code>=2, <code>deliveringCount</code>=2</li>
<li>Message <code>C</code> sent to <code>foo</code> &amp; dispatched to consumer</li>
<li><code>messageCount</code>=3, <code>deliveringCount</code>=3</li>
<li>Message <code>D</code> sent to <code>foo</code> &amp; dispatched to consumer</li>
<li><code>messageCount</code>=4, <code>deliveringCount</code>=4</li>
</ul>
<p>The <code>messageCount</code> for <code>foo</code> is now 4, one <em>greater</em> than the <code>ring-size</code>
of 3! However, the broker has no choice but to allow this because it cannot
remove messages from the queue which are in delivery.</p>
<p>Now consider that the consumer is closed without actually acknowledging any
of these 4 messages. These 4 in-delivery, unacknowledged messages will be
cancelled back to the broker and added to the <em>head</em> of the queue in the
reverse order from which they were consumed. This, of course, will put the
queue over its configured <code>ring-size</code>. Therefore, since a ring queue
prefers messages at the tail of the queue over messages at the head it will
keep <code>B</code>, <code>C</code>, &amp; <code>D</code> and delete <code>A</code> (since <code>A</code> was the last message added
to the head of the queue).</p>
<p>Transaction or core session rollbacks are treated the same way.</p>
<p>If you wish to avoid these kinds of situations and you&apos;re using the core
client directly or the core JMS client you can minimize messages in delivery
by reducing the size of <code>consumerWindowSize</code> (1024 * 1024 bytes by default).</p>
<h2 id="scheduled-messages">Scheduled Messages</h2>
<p>When a scheduled message is sent to a queue it isn&apos;t immediately added to the
tail of the queue like normal messages. It is held in an intermediate buffer
and scheduled for delivery onto the <em>head</em> of the queue according to the
details of the message. However, scheduled messages are nevertheless reflected
in the message count of the queue. As with messages which are in delivery this
can make it appear that the ring queue&apos;s size is not being enforced. Consider
this simple scenario:</p>
<ul>
<li>Queue <code>foo</code> with <code>ring-size=&quot;3&quot;</code></li>
<li>At 12:00 message <code>A</code> sent to <code>foo</code> scheduled for 12:05</li>
<li><code>messageCount</code>=1, <code>scheduledCount</code>=1</li>
<li>At 12:01 message <code>B</code> sent to <code>foo</code></li>
<li><code>messageCount</code>=2, <code>scheduledCount</code>=1</li>
<li>At 12:02 message <code>C</code> sent to <code>foo</code></li>
<li><code>messageCount</code>=3, <code>scheduledCount</code>=1</li>
<li>At 12:03 message <code>D</code> sent to <code>foo</code></li>
<li><code>messageCount</code>=4, <code>scheduledCount</code>=1</li>
</ul>
<p>The <code>messageCount</code> for <code>foo</code> is now 4, one <em>greater</em> than the <code>ring-size</code> of 3!
However, the scheduled message is not technically on the queue yet (i.e. it is
on the broker and scheduled to be put on the queue). When the scheduled
delivery time for 12:05 comes the message will put on the head of the queue,
but since the ring queue&apos;s size has already been reach the scheduled message
<code>A</code> will be removed.</p>
<h2 id="paging">Paging</h2>
<p>Similar to scheduled messages and messages in delivery, paged messages don&apos;t
count against a ring queue&apos;s size because messages are actually paged at the
<em>address</em> level, not the queue level. A paged message is not technically on a
queue although it is reflected in a queue&apos;s <code>messageCount</code>.</p>
<p>It is recommended that paging is not used for addresses with ring queues. In
other words, ensure that the entire address will be able to fit into memory or
use the <code>DROP</code>, <code>BLOCK</code> or <code>FAIL</code> <code>address-full-policy</code>.</p>
</section>
</div>
<div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
</div>
</div>
</div>
<a href="last-value-queues.html" class="navigation navigation-prev " aria-label="Previous page: Last-Value Queues">
<i class="fa fa-angle-left"></i>
</a>
<a href="retroactive-addresses.html" class="navigation navigation-next " aria-label="Next page: Retroactive Addresses">
<i class="fa fa-angle-right"></i>
</a>
</div>
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"Ring Queues","level":"1.40","depth":1,"next":{"title":"Retroactive Addresses","level":"1.41","depth":1,"path":"retroactive-addresses.md","ref":"retroactive-addresses.md","articles":[]},"previous":{"title":"Last-Value Queues","level":"1.39","depth":1,"path":"last-value-queues.md","ref":"last-value-queues.md","articles":[]},"dir":"ltr"},"config":{"plugins":[],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"github":"apache/activemq-artemis","theme":"default","githubHost":"https://github.com/","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"ActiveMQ Artemis Documentation","links":{"home":"http://activemq.apache.org/artemis","issues":"https://issues.apache.org/jira/browse/ARTEMIS","contribute":"http://activemq.apache.org/contributing.html"},"gitbook":"3.x.x","description":"ActiveMQ Artemis User Guide and Reference Documentation"},"file":{"path":"ring-queues.md","mtime":"2020-04-27T19:30:24.000Z","type":"markdown"},"gitbook":{"version":"3.1.1","time":"2020-04-29T20:47:49.444Z"},"basePath":".","book":{"language":""}});
});
</script>
</div>
<script src="gitbook/gitbook.js"></script>
<script src="gitbook/theme.js"></script>
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
</body>
</html>