blob: ecad87f2d9640d3ad4f15010153b5fa45bb362c9 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
<link href="http://activemq.apache.org/styles/site.css" rel="stylesheet" type="text/css"/>
<link href="http://activemq.apache.org/styles/type-settings.css" rel="stylesheet" type="text/css"/>
<script src="http://activemq.apache.org/styles/prototype.js" type="text/javascript"></script>
<script src="http://activemq.apache.org/styles/rico.js" type="text/javascript"></script>
<script src="http://activemq.apache.org/styles/site.js" type="text/javascript"></script>
<style type="text/css">
.maincontent { overflow:hidden; }
</style>
<!--[if IE]>
<style type="text/css">
.maincontent { width:100%; }
</style>
<![endif]-->
<title>
Apache ActiveMQ &#8482; -- Code Overview
</title>
</head>
<body>
<div class="white_box">
<div class="header">
<div class="header_l">
<div class="header_r">
</div>
</div>
</div>
<div class="content">
<div class="content_l">
<div class="content_r">
<div>
<!-- Banner -->
<div id="asf_logo">
<div id="activemq_logo">
<a shape="rect" style="float:left; width:280px;display:block;text-indent:-5000px;text-decoration:none;line-height:60px; margin-top:10px; margin-left:100px;" href="http://activemq.apache.org" title="The most popular and powerful open source Message Broker">ActiveMQ</a>
<a shape="rect" style="float:right; width:210px;display:block;text-indent:-5000px;text-decoration:none;line-height:60px; margin-top:15px; margin-right:10px;" href="http://www.apache.org" title="The Apache Software Foundation">ASF</a>
</div>
</div>
<div class="top_red_bar">
<div id="site-breadcrumbs">
<a href="developers.html">Developers</a>&nbsp;&gt;&nbsp;<a href="code-overview.html">Code Overview</a>
</div>
<div id="site-quicklinks">
<p><a shape="rect" href="download.html">Download</a> | <a shape="rect" class="external-link" href="http://activemq.apache.org/maven/apidocs/index.html">JavaDocs</a> <a shape="rect" href="javadocs.html">More...</a> | <a shape="rect" href="source.html">Source</a> | <a shape="rect" href="discussion-forums.html">Forums</a> | <a shape="rect" href="support.html">Support</a></p>
</div>
</div>
<table border="0">
<tbody>
<tr>
<td valign="top" width="100%">
<div class="wiki-content maincontent"><h1 id="CodeOverview-Architecture">Architecture</h1>
<p>The following section walks through the main parts of Apache ActiveMQ and links to the code to help you understand the layout</p>
<p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://activemq.apache.org/images/BrokerDiagram.png" data-image-src="http://activemq.apache.org/images/BrokerDiagram.png"></span></p>
<h2 id="CodeOverview-JMSClient">JMS Client</h2>
<p>The <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/package-summary.html">org.apache.activemq</a> package defines the core JMS client.</p>
<h2 id="CodeOverview-Transport">Transport</h2>
<p>The JMS client and the message broker use the <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/transport/Transport.html">Transport</a> abstraction for sending around command objects (like a distributed <em>Command Pattern</em>). A TransportChannel typically deals with some kind of networking mechanism (TCP sockets using BIO, using NIO, UDP / multicast, SSL over sockets, JXTA, EmberIO etc). See the <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/transport/package-summary.html">org.apache.activemq.transport</a> package for more details</p>
<p>So the TransportChannel is basically concerned with sending and receiving <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/command/Command.html">Command</a> objects (each instance represents some kind of <em>command</em>). Packet is defined in the <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/command/package-summary.html">org.apache.activemq.command</a> package which defines all the JMS Message implementations classes (which are Commands) along with a number of other kinds of packets, like subsciptions, message acknowledgements, transactions and so forth.</p>
<h2 id="CodeOverview-WireFormat">WireFormat</h2>
<p>There are various possible ways of encoding messages onto a stream. We may wish to adapt to various different encoding mechanisms - such as to provide simpler wire formats for talking to C / JavaScript or to make a C# friendly encoding.</p>
<p>So all the Transport&#160; implementations take a pluggable WireFormat implementation class - which is a <em>Strategy Pattern</em> for deciding how to write the Command to a DataIn / DataOut stream or Datagram.</p>
<p>So if you wish to provide your own binary, <em>on the wire</em> protocol then we just need a WireFormat implementation of your protocol, then we can use this with any transport (TCP BIO, NIO, JXTA etc).</p>
<p>We use <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/openwire/OpenWireFormat.html">OpenWireFormat</a> by default which is the most efficient &amp; easiest format to use from Java code - so if both ends of the wire are Java then its highly recommended. Though other WireFormats are most welcome.</p>
<h2 id="CodeOverview-DefaultWireFormat">Default Wire Format</h2>
<p>The default wire format writes a byte which indicates the kind of Command which is being sent (see the <a shape="rect" class="external-link" href="http://activemq.apache.org/maven/5.5.0/activemq-core/apidocs/org/apache/activemq/command/CommandTypes.html">CommandTypes</a> interface which defines all the int constants for each type of command.</p>
<p>The core JMS Message types each have a unique byte ID for</p>
<ul><li>Message</li><li>ObjectMessage</li><li>TextMessage</li><li>MapMessage</li><li>BytesMessage</li><li>StreamMessage</li></ul>
<p>Then in addition there are various other <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/command/package-summary.html">types of command</a> such as</p>
<ul><li><a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/command/ConnectionInfo.html">ConnectionInfo </a> for when a new connection is established with a message broker</li><li><a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/command/ConsumerInfo.html">ConsumerInfo</a> when a new consumer is created on a connection</li><li><a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/command/MessageAck.html">MessageAck</a> to acknowledge a message ID</li><li><a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/command/TransactionInfo.html">TransactionInfo</a> to denote a transaction</li></ul>
<p>There are a few others; the <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/command/package-summary.html">org.apache.activemq.command</a> package describes them in their gory detail.</p>
<p>Basically the DefaultWireFormat has a default encoding of each of these commands. So after the first byte which indicates the type of packet is written, there is a specific wire format per packet type.</p>
<p>For new wire formats it may be that you only need to support a small subset of these types. e.g. you might just have a simple publish message, consume message &amp; message ack.</p>
<h1 id="CodeOverview-MessageBroker">Message Broker</h1>
<p>The APIs for the message broker (server side of the JMS client) are defined in the <a shape="rect" class="external-link" href="http://incubator.apache.org/activemq/maven/activemq-core/apidocs/org/apache/activemq/broker/package-summary.html">org.apache.activemq.broker</a>. There are various other packages which define different parts, from the message stores to the message routing and so forth. </p>
<p>To see an overview of these packages try the <a shape="rect" href="javadocs.html">JavaDocs</a></p>
<hr>
<p></p><p>
</p><h1>ActiveMQ System Overview</h1>
<h2>Introduction</h2>
<p>ActiveMQ is the system responsible for creating and managing network connections used for communication between clients and the broker. This document hopes to outline the inner workings of this system with in order to make it easier to understand for future developers. It will give a high-level overview of the system and outline the major players. We will also cover a few other interesting classes that may be useful to others working on the system. Most of this document is written with the server side code in mind. This is because the client-side communication systems are architecturally simple and understanding the server will make understanding clients trivial by comparison.</p>
<p>We assume the reader has basic understanding of JMS. Refer to the official Java docs for more information.</p>
<h2>Overview: The Big Players</h2>
<p>The core classes involved in the ActiveMQ communication system are Transports. These include the <code>Transport</code>, <code>TransportServer</code>, and <code>TransportFactory</code> hierarchies. <code>Transport</code>s and <code>TransportServer</code>s are wrappers around sockets and server sockets respectively. <code>TransportFactory</code>s (as you may have guessed) are factories that create <code>Transport</code>s and <code>TransportServers</code>. <code>Transport</code>s are connected to <code>Broker</code>s and transmit <code>Command</code>s, which represent all major actions to be taken by ActiveMQ (more on this later). The following example illustrates how these pieces fit together.</p>
<p>The primary class needed to create a JMS "provider" application is the <code>Broker</code> class. The default ActiveMQ binary will use a <code>BrokerService</code> class to wrap around <code>Broker</code>s. When the application is started, it instantiates a <code>BrokerService</code> and instructs it to bind to a specific (local) address, say "tcp://localhost:61616". The <code>Broker</code> will use the scheme in the given address and find the proper <code>TransportFactory</code>, <code>TcpTransportFactory</code> in this example. This factory will then be used to create a <code>TcpTransportServer</code> that will be bound to "localhost:61616". Once the <code>TransportServer</code> is started, it will continually pole its socket for incoming connections. Successfully connected incoming sockets will be wrapped in a <code>TcpTransport</code> instance and passed back (indirectly) to the <code>Broker</code>. The <code>Broker</code> will then start polling the new <code>Transport</code> for incoming <code>Command</code>s to process.</p>
<p>The final pieces missing from the above example are the <code>TransportConnection</code> and <code>TransportConnector</code> classes. These classes are used to connect <code>Broker</code>s to <code>Transport</code>s and <code>TransportServer</code>s respectively.</p>
<h2>Class Details</h2>
<p>This section will explain some of the more interesting details of the mentioned classes separately.
</p><h3>Transports, TransportServers, and TransportFactories</h3>
<p>The basic principles of how these classes operate are very simple: <code>Transport</code>s and <code>TransportServer</code>s are wrappers around sockets and server sockets used to hide implementation, and <code>TransportFactory</code>s are factory classes for the mentioned classes. The only caveats are how <code>TransportFactory</code>s are chosen and configured based on URIs they are supplied.</p>
<p>The <code>TransportFactory</code> class is abstract and incapable of creating <code>Transport</code> or <code>TransportServer</code> classes directly. It, nevertheless, is the class used to create <code>Transport</code>s and <code>TransportServer</code>s. <code>TransportFactory</code> delegates its responsibilities to its subclasses based on the choice of subclass provided by the <code>FactoryFinder</code> class, which uses the URI's scheme to find a matching factory classes based on text files stored under the META-INF directory.</p>
<p>Configuration of the created <code>Transport</code>s is done entirely to reflection. <code>Transport</code>s are configured through calls to <code>compositeConfigure</code>, which are made by the factory at the time of the <code>Transport</code>'s creation. <code>compositeConfigure</code> uses the <code>IntrospectionSupport</code> class to call setters for parameters passed in through the URI. For example, creating a <code>Transport</code> using the URI "ssl://localhost:61616/?needClientAuth=true" would result in the creation of an <code>SslTransport</code> object whose <code>setNeedClientAuth</code> method (if it exists) is called with the value of <code>true</code> immediately after its creation. <code>TransportServer</code>s operate in a similar fashion. The only difference is that the call to <code>IntrospectionSupport</code> is made from the <code>doBind</code> method of the <code>TransportFactory</code>.</p>
<h3>Commands</h3>
<p><code>Command</code>s are the main means for communication within <code>Broker</code>s. Each <code>Command</code> represents an action to be taken. <code>Command</code> subclasses include <code>ConnectionInfo</code>, <code>KeepAliveInfo</code>, and <code>Message</code>, which result in processing of new connections, maintenance of old connections, and processing of user messages respectively. These classes are de-serialized from <code>Transport</code>s using Marshalers. Whenever new data is found in a socket, the first byte is read to determine what type of <code>Command</code> being received. The proper Marshaller is then selected to de-serialize the <code>Command</code> (e.g. to de-serialize a <code>ConnectionInfo</code>, the <code>ConnectionInfoMarshaller</code> is used).</p>
<h3>TransportConnections and TransportConnectors</h3>
<p>Every <code>TransportServer</code> is connected to a <code>Broker</code> using a <code>TransportConnector</code>. The server's accept listener (which is called when a new <code>Transport</code> is constructed) is set to call the given <code>TransportConnector</code>'s <code>createConnection</code> method with the new <code>Transport</code>. When called, <code>createConnection</code> creates a new <code>TransportConnection</code> that links the given <code>Transport</code> and the supporting <code>Broker</code> together; the <code>Transport</code>'s transport listener is set to the <code>TransportConnection</code>'s <code>onCommand</code> method, which is then called whenever a new <code>Command</code> is received.</p>
<p><code>Command</code>s and <code>AbstractConnection</code> (the superclass of <code>TransportConnection</code>) form a visitor pattern. <code>onCommand</code> will call <code>AbstractConnection</code>'s service method which will make a series of calls in line with the visitor patter and eventually, the proper <code>Command</code> subclass to be passed to the corresponding method of the <code>Broker</code> for processing.</p>
<h3>BrokerFilters and BrokerPlugins</h3>
<p>While not used directly by the communication system, <code>BrokerFilter</code>s and <code>BrokerPlugin</code>s provide an effective and easy to use way of modifying Broker behavior. <code>BrokerFilter</code>s allow for one to modify a few <code>Broker</code> methods without touching the rest (as the name suggests). The <code>BrokerFilter</code> passes on all of its responsibilities to a <code>Broker</code> it receives in its constructor. Subclassing <code>BrokerFilter</code> allows us to perform additional actions before passing the work down to the underlying <code>Broker</code>.</p>
<p>The power of the <code>BrokerFilter</code> class comes from the fact that multiple filters can be cascaded to create different functional combinations. As an example, the <code>JaasAuthenticationBroker</code> is a subclass of <code>BrokerFilter</code> that modifies the methods used for adding and removing connections to allow for JAAS authentication. <code>AuthorizationBroker</code> is another subclass of <code>BrokerFilter</code>. This class modifies the destination regulation methods to enforce access levels. With this architecture, one can create a <code>JaasAuthenticationBroker</code> and have it use an <code>AuthorizationBroker</code> as its underlying broker (which would use another broker itself, etc.).</p>
<p><code>BrokerPlugin</code>s are simple classes that will wrap their corresponding <code>Brokers</code> around the one they are given. i.e. "installing" an <code>AuthorizationPlugin</code> on an existing <code>Broker</code> will create an <code>AuthorizationBroker</code> that uses the original <code>Broker</code> internally. The main reason for the existence of <code>BrokerPlugin</code>s is to allow for one to configure the <code>Broker</code> used by the <code>BrokerService</code> class (either through code or XML configuration and spring).</p>
<p></p></div>
</td>
<td valign="top">
<div class="navigation">
<div class="navigation_top">
<div class="navigation_bottom">
<h3 id="Navigation-Overviewhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=35985"><a shape="rect" href="overview.html">Overview</a></h3><ul class="alternate"><li><a shape="rect" href="index.html">Index</a></li><li><a shape="rect" href="news.html">News</a></li><li><a shape="rect" href="new-features.html">New Features</a></li><li><a shape="rect" href="getting-started.html">Getting Started</a></li><li><a shape="rect" href="faq.html">FAQ</a></li><li><a shape="rect" href="articles.html">Articles</a></li><li><a shape="rect" href="books.html">Books</a></li><li><a shape="rect" href="download.html">Download</a></li><li><a shape="rect" class="external-link" href="http://www.apache.org/licenses/">License</a></li></ul><h3 id="Navigation-Search">Search</h3><div>
<form enctype="application/x-www-form-urlencoded" method="get" action="http://www.google.com/search" style="font-size: 10px;">
<input type="hidden" name="ie" value="UTF-8">
<input type="hidden" name="oe" value="UTF-8">
<input maxlength="255" type="text" name="q" size="15" value="value"><br clear="none">
<input type="submit" name="btnG" value="Search">
<input type="hidden" name="domains" value="activemq.apache.org">
<input type="hidden" name="sitesearch" value="activemq.apache.org">
</form>
</div>
<h3 id="Navigation-SubProjects">Sub Projects</h3><ul class="alternate"><li><a shape="rect" class="external-link" href="http://activemq.apache.org/artemis/">Artemis</a></li><li><a shape="rect" class="external-link" href="http://activemq.apache.org/apollo" title="ActiveMQ Apollo">Apollo</a></li><li><a shape="rect" class="external-link" href="http://activemq.apache.org/cms/">CMS</a></li><li><a shape="rect" class="external-link" href="http://activemq.apache.org/nms/" title="NMS is the .Net Messaging API">NMS</a></li></ul><h3 id="Navigation-Communityhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=36130"><a shape="rect" href="community.html">Community</a></h3><ul class="alternate"><li><a shape="rect" href="support.html">Support</a></li><li><a shape="rect" href="contributing.html">Contributing</a></li><li><a shape="rect" href="discussion-forums.html">Discussion Forums</a></li><li><a shape="rect" href="mailing-lists.html">Mailing Lists</a></li><li><a shape="rect" href="irc.html">IRC</a></li><li><a shape="rect" class="external-link" href="http://javabot.evanchooly.com/logs/%23apache-activemq/today" rel="nofollow">IRC Log</a></li><li><a shape="rect" href="security-advisories.html">Security Advisories</a></li><li><a shape="rect" href="site.html">Site</a></li><li><a shape="rect" class="external-link" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a shape="rect" href="projects-using-activemq.html">Projects Using ActiveMQ</a></li><li><a shape="rect" href="users.html">Users</a></li><li><a shape="rect" href="team.html">Team</a></li><li><a shape="rect" href="thanks.html">Thanks</a></li></ul><h3 id="Navigation-Featureshttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=35883"><a shape="rect" href="features.html">Features</a></h3><ul class="alternate"><li><a shape="rect" href="advisory-message.html">Advisory Message</a></li><li><a shape="rect" href="clustering.html">Clustering</a></li><li><a shape="rect" href="cross-language-clients.html">Cross Language Clients</a></li><li><a shape="rect" href="enterprise-integration-patterns.html">Enterprise Integration Patterns</a></li><li><a shape="rect" href="jmx.html">JMX</a></li><li><a shape="rect" href="jms-to-jms-bridge.html">JMS to JMS Bridge</a></li><li><a shape="rect" href="masterslave.html">MasterSlave</a></li><li><a shape="rect" href="message-groups.html">Message Groups</a></li><li><a shape="rect" href="networks-of-brokers.html">Networks of Brokers</a></li><li><a shape="rect" href="performance.html">Performance</a></li><li><a shape="rect" href="persistence.html">Persistence</a></li><li><a shape="rect" href="security.html">Security</a></li><li><a shape="rect" href="virtual-destinations.html">Virtual Destinations</a></li><li><a shape="rect" href="visualisation.html">Visualisation</a></li><li><a shape="rect" href="features.html">More ...</a></li></ul><h3 id="Navigation-Connectivityhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=36167"><a shape="rect" href="connectivity.html">Connectivity</a></h3><ul class="alternate"><li><a shape="rect" href="ajax.html">Ajax</a></li><li><a shape="rect" href="amqp.html">AMQP</a></li><li><a shape="rect" href="axis-and-cxf-support.html">Axis and CXF Support</a></li><li><a shape="rect" href="c-integration.html">C Integration</a></li><li><a shape="rect" href="activemq-c-clients.html">C++</a></li><li><a shape="rect" class="external-link" href="http://activemq.apache.org/nms/">C# and .Net Integration</a></li><li><a shape="rect" class="external-link" href="http://activemq.apache.org/cms/">CMS</a></li><li><a shape="rect" href="j2ee.html">J2EE</a></li><li><a shape="rect" href="jboss-integration.html">JBoss Integration</a></li><li><a shape="rect" class="external-link" href="http://docs.codehaus.org/display/JETTY/Integrating+with+ActiveMQ" rel="nofollow">Jetty</a></li><li><a shape="rect" href="jndi-support.html">JNDI Support</a></li><li><a shape="rect" class="external-link" href="http://activemq.apache.org/nms/" title="NMS is the .Net Messaging API">NMS</a></li><li><a shape="rect" href="rest.html">REST</a></li><li><a shape="rect" href="rss-and-atom.html">RSS and Atom</a></li><li><a shape="rect" href="spring-support.html">Spring Support</a></li><li><a shape="rect" href="stomp.html">Stomp</a></li><li><a shape="rect" href="tomcat.html">Tomcat</a></li><li><a shape="rect" href="unix-service.html">Unix Service</a></li><li><a shape="rect" href="weblogic-integration.html">WebLogic Integration</a></li><li><a shape="rect" href="xmpp.html">XMPP</a></li><li><a shape="rect" href="connectivity.html">More ...</a></li></ul><h3 id="Navigation-UsingActiveMQ5https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=71176"><a shape="rect" href="using-activemq-5.html">Using ActiveMQ 5</a></h3><ul class="alternate"><li><a shape="rect" href="version-5-getting-started.html">Getting Started</a></li><li><a shape="rect" href="version-5-initial-configuration.html">Initial Configuration</a></li><li><a shape="rect" href="version-5-run-broker.html">Running a Broker</a></li><li><a shape="rect" href="how-do-i-embed-a-broker-inside-a-connection.html">Embedded Brokers</a></li><li><a shape="rect" href="activemq-command-line-tools-reference.html">Command Line Tools</a></li><li><a shape="rect" href="configuring-version-5-transports.html">Configuring Transports</a></li><li><a shape="rect" href="version-5-examples.html">Examples</a></li><li><a shape="rect" href="version-5-web-samples.html">Web Samples</a></li><li><a shape="rect" href="how-can-i-monitor-activemq.html">Monitoring the Broker</a></li><li><a shape="rect" href="version-5-xml-configuration.html">Xml Configuration</a></li><li><a shape="rect" href="xml-reference.html">Xml Reference</a></li><li><a shape="rect" href="using-activemq-5.html">More ...</a></li></ul><h3 id="Navigation-Toolshttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=35912"><a shape="rect" href="tools.html">Tools</a></h3><ul class="alternate"><li><a shape="rect" href="web-console.html">Web Console</a></li><li><a shape="rect" href="activemq-performance-module-users-manual.html">Maven2 Performance Plugin</a></li></ul><h3 id="Navigation-Supporthttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=35919"><a shape="rect" href="support.html">Support</a></h3><ul class="alternate"><li><a shape="rect" class="external-link" href="http://issues.apache.org/jira/browse/AMQ">Issues</a></li><li><a shape="rect" class="external-link" href="http://issues.apache.org/activemq/browse/AMQ?report=com.atlassian.jira.plugin.system.project:roadmap-panel">Roadmap</a></li><li><a shape="rect" class="external-link" href="http://issues.apache.org/activemq/browse/AMQ?report=com.atlassian.jira.plugin.system.project:changelog-panel">Change log</a></li></ul><h3 id="Navigation-Developershttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=35903"><a shape="rect" href="developers.html">Developers</a></h3><ul class="alternate"><li><a shape="rect" href="source.html">Source</a></li><li><a shape="rect" href="building.html">Building</a></li><li><a shape="rect" href="developer-guide.html">Developer Guide</a></li><li><a shape="rect" href="becoming-a-committer.html">Becoming a committer</a></li><li><a shape="rect" href="code-overview.html">Code Overview</a></li><li><a shape="rect" href="wire-protocol.html">Wire Protocol</a></li><li><a shape="rect" href="release-guide.html">Release Guide</a></li></ul><h3 id="Navigation-Tests">Tests</h3><ul class="alternate"><li><a shape="rect" href="activemq-performance-module-users-manual.html">Maven2 Performance Plugin</a></li><li><a shape="rect" href="benchmark-tests.html">Benchmark Tests</a></li><li><a shape="rect" href="jmeter-system-tests.html">JMeter System Tests</a></li><li><a shape="rect" href="jmeter-performance-tests.html">JMeter Performance Tests</a></li><li><a shape="rect" href="integration-tests.html">Integration Tests</a></li></ul><h3 id="Navigation-ProjectReports">Project Reports</h3><ul class="alternate"><li><a shape="rect" href="junit-reports.html">JUnit Reports</a></li><li><a shape="rect" href="source-xref.html">Source XRef</a></li><li><a shape="rect" href="test-source-xref.html">Test Source XRef</a></li><li><a shape="rect" href="xml-reference.html">Xml Reference</a></li></ul>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
<div class="bottom_red_bar"></div>
</div>
</div>
</div>
</div>
<div class="black_box">
<div class="footer">
<div class="footer_l">
<div class="footer_r">
<div>
<a href="http://activemq.apache.org/privacy-policy.html">Privacy Policy</a> -
(<a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=35934">edit this page</a>)
</div>
</div>
</div>
</div>
</div>
</div>
<div class="design_attribution">
&copy; 2004-2011 The Apache Software Foundation.
<br/>
Apache ActiveMQ, ActiveMQ, Apache, the Apache feather logo, and the Apache ActiveMQ project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.
<br/>
<a href="http://hiramchirino.com">Graphic Design By Hiram</a>
</div>
<!-- delay the loading of large javascript files to the end so that they don't interfere with the loading of page content -->
<span style="display: none">
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-1347593-1");
pageTracker._initData();
pageTracker._trackPageview();
</script>
</span>
</body>
</html>