summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2014-03-08 22:23:31 +0000
committerKeith Wall <kwall@apache.org>2014-03-08 22:23:31 +0000
commit196ba0a21d004044fc03829e61797774a345393a (patch)
tree0c0462e19127b76f7fe580e2509104f246cd86b5
parenta65175f3f958e10a39cfee4c2bc071aaada7d2e8 (diff)
downloadqpid-python-196ba0a21d004044fc03829e61797774a345393a.tar.gz
QPID-5374: Create book for Qpid JMS Client when used with AMQP 0-8/0-9/0-9-10.26
Merged from trunk with commands: svn merge -c 1554333 https://svn.apache.org/repos/asf/qpid/trunk svn merge -c 1554404 https://svn.apache.org/repos/asf/qpid/trunk svn merge -c 1554547 https://svn.apache.org/repos/asf/qpid/trunk svn merge -c 1556193 https://svn.apache.org/repos/asf/qpid/trunk svn merge -c 1556310 https://svn.apache.org/repos/asf/qpid/trunk svn merge -c 1559483 https://svn.apache.org/repos/asf/qpid/trunk svn merge -c 1563355 https://svn.apache.org/repos/asf/qpid/trunk svn merge -c 1575617 https://svn.apache.org/repos/asf/qpid/trunk git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/0.26@1575624 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/doc/book/Makefile2
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Appendix-Exceptions.xml173
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Appendix-Maven.xml69
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Binding-URL.xml243
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Book.xml48
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Connection-URL.xml324
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Document-Scope-And-Intended-Audience.xml64
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Examples.xml297
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Getting-And-Dependencies.xml68
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Introduction.xml49
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-JMS-Extensions.xml33
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-JNDI-Properties-Format.xml86
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Logging.xml73
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-System-Properties.xml623
-rw-r--r--qpid/doc/book/src/jms-client-0-8/JMS-Client-Understanding.xml526
-rw-r--r--qpid/doc/book/src/jms-client-0-8/Makefile20
-rw-r--r--qpid/doc/book/src/jms-client-0-8/commonEntities.xml47
-rw-r--r--qpid/doc/book/src/jms-client-0-8/images/JndiOverview.pngbin0 -> 67726 bytes
-rw-r--r--qpid/doc/book/src/jms-client-0-8/images/JndiOverview.svg23
-rw-r--r--qpid/doc/book/src/jms-client-0-8/images/QpidJmsOverview.pngbin0 -> 52377 bytes
-rw-r--r--qpid/doc/book/src/jms-client-0-8/images/QpidJmsOverview.svg23
21 files changed, 2790 insertions, 1 deletions
diff --git a/qpid/doc/book/Makefile b/qpid/doc/book/Makefile
index 3ba8354602..a8a5c45476 100644
--- a/qpid/doc/book/Makefile
+++ b/qpid/doc/book/Makefile
@@ -17,7 +17,7 @@
# under the License.
#
-DIRS = src/java-broker src/java-perftests src/cpp-broker src/programming
+DIRS = src/java-broker src/java-perftests src/cpp-broker src/programming src/jms-client-0-8
.PHONY: all $(DIRS)
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Appendix-Exceptions.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Appendix-Exceptions.xml
new file mode 100644
index 0000000000..eb021f3132
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Appendix-Exceptions.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<appendix id="JMS-Client-0-8-Appendix-Exceptions">
+ <title>Exceptions</title>
+
+ <para>The methods of Qpid JMS Client throw <ulink url="&oracleJeeDocUrl;javax/jms/JMSException.html"
+ >JMSExceptions</ulink> in response to error conditions. Typically the exception's message
+ (#getMessage()) summarises the error condition, with contextual information being provided by
+ the messages of linked exception(s). To understand the problem, it is important to read the messages
+ associated with <emphasis>all</emphasis> the linked exceptions.</para>
+
+ <para>The following table describes some of the more common exceptions linked to JMSException
+ thrown by JMS methods whilst using the client:</para>
+
+ <table pgwide="1">
+ <title>Exceptions linked to JMSExceptions thrown by JMS methods</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Linked Exception</entry>
+ <entry>Message</entry>
+ <entry>Explanation/Common Causes</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>AMQUnresolvedAddressException</entry>
+ <entry><emphasis>message varies</emphasis></entry>
+ <entry><para>Indicates that the hostname included in the Connection URL's <link
+ linkend="JMS-Client-0-8-Connection-URL-ConnectionOptions-Brokerlist"
+ >brokerlist</link>, could not be resolved, . This could mean that the hostname is
+ mispelt, or there is name resolution problem.</para></entry>
+ </row>
+ <row>
+ <entry>AMQConnectionFailure</entry>
+ <entry>Connection refused</entry>
+ <entry><para>Indicates that the host included in the Connection URL's <link
+ linkend="JMS-Client-0-8-Connection-URL-ConnectionOptions-Brokerlist"
+ >brokerlist</link>, actively refused the connection. This could mean that the
+ hostname and/or port number is incorrect, or the Broker may not be
+ running.</para></entry>
+ </row>
+ <row>
+ <entry>AMQConnectionFailure</entry>
+ <entry>connect timed out</entry>
+ <entry><para>Indicates that the host included in the Connection URL's <link
+ linkend="JMS-Client-0-8-Connection-URL-ConnectionOptions-Brokerlist"
+ >brokerlist</link>, could not be contacted within the <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-ConnectTimeout"
+ >connecttimeout</link>. This could mean that the host is shutdown, or a networking
+ routing problem means the host is unreachable.</para></entry>
+ </row>
+ <row>
+ <entry>AMQConnectionFailure</entry>
+ <entry>General SSL Problem; PKIX path building failed; unable to find valid certification
+ path to requested target</entry>
+ <entry><para>Indicates that the CA that signed the Broker's certificate is not trusted by
+ the JVM of the client. If the Broker is using a private-CA (or a self signed
+ certificate) check that the client has been properly configured with a truststore. See
+ <xref linkend="JMS-Client-0-8-Client-Understanding-Connection-SSL"/></para></entry>
+ </row>
+ <row>
+ <entry>AMQTimeoutException</entry>
+ <entry>Server did not respond in a timely fashion; Request Timeout</entry>
+ <entry><para>Indicates that the broker did not respond to a request sent by the client in
+ a reasonable length of time. The timeout is governed by <link
+ linkend="JMS-Client-0-8-System-Properties-SyncOpTimeout"
+ ><literal>qpid.sync_op_timeout</literal></link>.</para><para>This can be a symptom
+ of a heavily loaded broker that cannot respond or the Broker may have failed in
+ unexpected manner. Check the broker and the host on which it runs and performance of
+ its storage.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>The following table describes some of the more common exceptions linked to JMSException sent
+ to <ulink url="&oracleJeeDocUrl;javax/jmx/ExceptionListener.html">ExceptionListener</ulink>
+ instances.</para>
+
+ <table pgwide="1">
+ <title>Exceptions linked to JMSExceptions received by ExceptionListeners</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Linked Exception</entry>
+ <entry>Message</entry>
+ <entry>Explanation/Common Causes</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row id="JMS-Client-0-8-Appendix-Exceptions-AMQNoRouteException">
+ <entry>AMQNoRouteException</entry>
+ <entry>No Route for message [Exchange: <emphasis>exchange name</emphasis>, Routing key:
+ <emphasis>routing key</emphasis>] [error code 312: no route]</entry>
+ <entry><para>Indicate that the named exchange is unable to route a message to at least one
+ queue.</para>
+ <para>This will occur if a queue has been improperly bound to an exchange. Use the
+ Broker's management interface to check the bindings. See <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageProducer-MandatoryMessage"
+ /></para></entry>
+ </row>
+ <row id="JMS-Client-0-8-Appendix-Exceptions-AMQNoConsumersException">
+ <entry>AMQNoConsumersException</entry>
+ <entry>Immediate delivery is not possible. [error code 313: no consumers]</entry>
+ <entry><para>Immediate delivery was requested by the MessageProducer, but as there are no
+ consumers on any target queue, the message has been returned to the publisher. See
+ <xref linkend="JMS-Client-0-8-Client-Understanding-MessageProducer-ImmediateMessage"
+ />
+ </para></entry>
+ </row>
+ <row>
+ <entry>AMQDisconnectedException</entry>
+ <entry>Server closed connection and reconnection not permitted</entry>
+ <entry><para>Indicates that the connection was closed by the Broker, and as <link
+ linkend="JMS-Client-0-8-Client-Understanding-Connection-Failover">failover
+ options</link> are not included in the Connection URL, the client has been unable to
+ reestablish connection.</para>
+ <para>The Connection is now closed and any attempt to use either Connection object, or
+ any objects created from the Connection will receive an <ulink
+ url="&oracleJeeDocUrl;javax/jms/IllegalStateException.html"
+ >IllegalStateException</ulink>.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-Appendix-Exceptions-AMQDisconnectedException">
+ <entry>AMQDisconnectedException</entry>
+ <entry>Server closed connection and no failover was successful</entry>
+ <entry><para>Indicates that the connection was closed by the Broker. The client has tried
+ failover according to the rules of the <link
+ linkend="JMS-Client-0-8-Client-Understanding-Connection-Failover">failover
+ options</link>within the Connection URL, but these attempts were all
+ unsuccessful.</para>
+ <para>The Connection is now closed and any attempt to use either Connection object, or
+ any objects created from the Connection will receive an <ulink
+ url="&oracleJeeDocUrl;javax/jms/IllegalStateException.html"
+ >IllegalStateException</ulink>.</para></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </table>
+
+ <!--
+ :
+ AMQDisconnectedException: Server closed connection
+ -->
+
+</appendix>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Appendix-Maven.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Appendix-Maven.xml
new file mode 100644
index 0000000000..9042854f56
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Appendix-Maven.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<appendix id="JMS-Client-0-8-Appendix-Maven">
+ <title>Minimal Maven POM</title>
+ <para> The following is a minimal Maven POM required to use the Qpid Client. It is suitable for
+ use with the <link linkend="JMS-Client-0-8-Examples">examples</link> included in this
+ book.</para>
+
+ <example>
+ <title>Minimal Maven POM </title>
+ <programlisting>
+ <![CDATA[
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>test</groupId>
+ <artifactId>test</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <dependencies>
+ <dependency>
+ <groupId>]]>&qpidClientGroupId;<![CDATA[</groupId>
+ <artifactId>]]>&qpidClientArtefactId;<![CDATA[</artifactId>
+ <version>]]>&qpidVersion;<![CDATA[</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>1.6.4</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jms_1.1_spec</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+ </dependencies>
+</project>
+ ]]>
+ </programlisting>
+ </example>
+ <para>Note: We use the SLF4J Binding for Log4J12 here, but any SLF4J Binding could be used
+ instead. Similarly, Geronimo JMS Spec is used, but any dependency that provides the JMS 1.1
+ specification could be subsituted.</para>
+</appendix>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Binding-URL.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Binding-URL.xml
new file mode 100644
index 0000000000..2f6bafbb76
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Binding-URL.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-Binding-URL">
+ <title>Binding URL</title>
+
+ <para> The <emphasis>Binding URL</emphasis> syntax is the only addressing syntax supported by the
+ Qpid JMS client for AMQP 0-8, 0-9 and 0-9-1. It allows to specify the bindings that define the
+ relationship between a queue and an exchange, queue and exchange creation arguments and client
+ behaviour. </para>
+
+ <para> The format for a <emphasis>Binding URL</emphasis> is provided below <screen><![CDATA[
+<Exchange Class>://<Exchange Name>/[<Destination>]/[<Queue>][?<option>='<value>'[&<option>='<value>']]
+ ]]></screen> where <itemizedlist>
+ <listitem>
+ <para><emphasis>Exchange Class</emphasis>, specifies the type of the exchange, for example,
+ <emphasis>direct</emphasis>,<emphasis>topic</emphasis>,<emphasis>fanout</emphasis>, etc.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Exchange Name</emphasis>, specifies the name of the exchange, for example,
+ <emphasis>amq.direct</emphasis>,<emphasis>amq.topic</emphasis>, etc. </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Destination</emphasis>, is an optional part of <emphasis>Binding
+ URL</emphasis>. It can be used to specify a routing key with the non direct exchanges if
+ an option <emphasis>routingkey</emphasis> is not specified. If both
+ <emphasis>Destination</emphasis> and option <emphasis>routingkey</emphasis> are
+ specified, then option <emphasis>routingkey</emphasis> has precedence. </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Queue</emphasis>, is an optional part of <emphasis>Binding URL</emphasis> to
+ specify a queue name for JMS queue destination. It is ignored in JMS topic destinations.
+ Queue names may consist of any mixture of digits, letters, and underscores </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Options</emphasis>, key-value pairs separated by '=' character specifying
+ queue and exchange creation arguments, routing key, client behaviour, etc. </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <important>
+ <title>Binding URL option quoting</title>
+ <para>Take care with the quoting surrounding option values. Each option value
+ <emphasis>must</emphasis> be surrounded with single quotes ('). </para>
+ </important>
+
+ <para> The following <emphasis>Binding URL</emphasis> options are currently defined: <table
+ pgwide="1">
+ <title>Binding URL options </title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Option</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><para>durable</para></entry>
+ <entry><para>boolean </para></entry>
+ <entry><para>Queue durability flag. If it is set to <emphasis>true</emphasis>, a durable
+ queue is requested to create. The durable queue should be stored on the Broker and
+ remained there after Broker restarts until it is explicitly deleted. This option has
+ no meaning for JMS topic destinations, as by nature a topic destination only exists
+ when a subscriber is connected. If durability is required for topic destinations,
+ the durable subscription should be created.</para></entry>
+ </row>
+ <row>
+ <entry><para>exclusive</para></entry>
+ <entry><para>boolean </para></entry>
+ <entry><para>Queue exclusivity flag. The client cannot use a queue that was declared as
+ exclusive by another still-open connection.</para></entry>
+ </row>
+ <row>
+ <entry><para>autodelete</para></entry>
+ <entry><para>boolean </para></entry>
+ <entry><para>Queue auto-deletion flag. If it is set to <emphasis>true</emphasis> on
+ queue creation, the queue is deleted if there are no remaining
+ subscribers.</para></entry>
+ </row>
+ <row>
+ <entry><para>exchangeautodelete</para></entry>
+ <entry><para>boolean </para></entry>
+ <entry><para>Exchange auto-deletion flag.</para></entry>
+ </row>
+ <row>
+ <entry><para>exchangedurable</para></entry>
+ <entry><para>boolean </para></entry>
+ <entry><para>Exchange durability flag. If it is set to <emphasis>true</emphasis> when
+ creating a new exchange, the exchange will be marked as durable. Durable exchanges
+ should remain active after Broker restarts. Non-durable exchanges are deleted on
+ following Broker restart.</para></entry>
+ </row>
+ <row>
+ <entry><para>routingkey</para></entry>
+ <entry><para>string </para></entry>
+ <entry>
+ <para> Defines the value of the binding key to bind a queue to the exchange. It is
+ always required to specify for JMS topic destinations. If routing key option is not
+ set in <emphasis>Binding URL</emphasis> and direct exchange class is specified, the
+ queue name is used as a routing key. <emphasis>MessagePublisher</emphasis> uses
+ routing key to publish messages onto exchange. </para>
+ </entry>
+ </row>
+ <row>
+ <entry><para>browse</para></entry>
+ <entry><para>boolean </para></entry>
+ <entry><para>If set to <emphasis>true</emphasis> on a destination for a message
+ consumer, such consumer can only read messages on the queue but cannot consume them.
+ The consumer behaves like a queue browser in this case.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-Binding-URL-Options-RejectBehaviour">
+ <entry><para>rejectbehaviour</para></entry>
+ <entry><para>string </para></entry>
+ <entry><para>Defines the reject behaviour for the re-delivered messages. If set to
+ 'SERVER' the client delegates the requeue/DLQ decision to the server. If this option
+ is not specified, the messages won't be moved to the DLQ (or dropped) when delivery
+ count exceeds the maximum. </para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </para>
+
+ <section id="JMS-Client-0-8-Binding-URL-Examples">
+ <title>Binding URL Examples</title>
+
+ <section id="JMS-Client-0-8-Binding-URL-JMS-Queues" role="h4">
+ <title>Binding URLs for declaring of JMS Queues</title>
+ <para>The Qpid client Binding URLs for JMS queue destinations can be declared using direct
+ exchange (Mostly it is a pre-defined exchange with a name "amq.direct". Also, custom direct
+ exchanges can be used.): <screen><![CDATA[
+direct://amq.direct//<Queue Name>
+ ]]></screen>
+ </para>
+ <para>The Binding URLs for destinations created with calls to
+ <emphasis>Session.createQueue(String)</emphasis> can be expressed as <screen><![CDATA[
+direct://amq.direct//<Queue Name>?durable='true'
+ ]]></screen> The durability flag is set to <emphasis>true</emphasis> in such destinations. </para>
+ <example>
+ <title>Binding URL examples for JMS queues</title>
+ <screen><![CDATA[
+direct://amq.direct//myNonDurableQueue
+direct://amq.direct//myDurableQueue?durable='true'
+direct://amq.direct//myAnotherQueue?durable='true'&routingkey='myqueue'
+direct://amq.direct//myQueue?durable='true'&routingkey='myqueue'&rejectbehaviour='server'
+direct://custom.direct//yetAnotherQueue
+ ]]></screen>
+ </example>
+ </section>
+
+ <section id="JMS-Client-0-8-Binding-URL-JMS-Topics" role="h4">
+ <title>Binding URLs for declaring of JMS Topics</title>
+ <para>The Binding URLs for JMS queue destinations can be declared using topic exchange (A
+ pre-defined exchange having name "amq.topic" is used mainly. However, custom topic exchanges
+ can be used as well): <screen><![CDATA[
+topic://amq.topic//<Queue name>?routingkey='<Topic Name>'&exclusive='true'&autodelete='true'
+ ]]></screen>
+ </para>
+ <para>The Binding URLs for a topic destination created with calls to
+ <emphasis>Session.createTopic("hello")</emphasis> is provided below: <example>
+ <title>Binding URL examples for JMS topics</title>
+ <screen><![CDATA[
+topic://amq.topic/hello/tmp_127_0_0_1_36973_1?routingkey='hello'&exclusive='true'&autodelete='true'
+ ]]></screen>
+ </example>
+ </para>
+ </section>
+
+ <section id="JMS-Client-0-8-Binding-URL-Topics-Wildcards" role="h4">
+ <title>Wildcard characters in routing keys for topic destinations</title>
+ <para> AMQP exchanges of class <emphasis>topic</emphasis> can route messages to the queues
+ using special matches containing wildcard characters (a "#" matches one or more words, a "*"
+ matches a single word). The routing keys words are separated with a "." delimiter to
+ distinguish words for matching. Thus, if a consumer application specifies a routing key in
+ the destination like "usa.#", it should receive all the messages matching to that routing
+ key. For example, "usa.boston", "usa.new-york", etc. </para>
+ <para> The examples of the <emphasis>Binding URLs</emphasis> having routing keys with
+ wildcards characters are provided below: <screen><![CDATA[
+topic://amq.topic?routingkey='stocks.#'
+topic://amq.topic?routingkey='stocks.*.ibm'
+topic://amq.topic?routingkey='stocks.nyse.ibm'
+ ]]></screen>
+ </para>
+ </section>
+
+ <section id="JMS-Client-0-8-Binding-URL-Extra-Examples" role="h4">
+ <title>More Examples</title>
+ <table>
+ <title>Binding URL examples</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Binding URL</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><para>fanout://amq.fanout//myQueue</para></entry>
+ <entry><para>Binding URL binding queue "myQueue" to predefined "amq.fanout" exchange
+ of class "fanout"</para></entry>
+ </row>
+ <row>
+ <entry><para>topic://custom.topic//anotherQueue?routingkey='aq'</para></entry>
+ <entry><para>Binding URL binding queue "anotherQueue" to the exchange with name
+ "custom.topic" of class "topic" using binding key "aq".</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ </section>
+
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Book.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Book.xml
new file mode 100644
index 0000000000..956981ecdc
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Book.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!--
+
+ 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.
+
+-->
+
+<book xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Qpid JMS Client for AMQP protocols 0-8, 0-9 and 0-9-1</title>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Introduction.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Document-Scope-And-Intended-Audience.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Getting-And-Dependencies.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Examples.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Understanding.xml"/>
+ <!-- TODO:
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-JMS-Extensions.xml"/>
+ -->
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-JNDI-Properties-Format.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Connection-URL.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Binding-URL.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-System-Properties.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Logging.xml"/>
+
+ <!-- TODO:
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Interoperability.xml"/>
+ -->
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Appendix-Exceptions.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="JMS-Client-Appendix-Maven.xml"/>
+
+
+
+</book>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Connection-URL.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Connection-URL.xml
new file mode 100644
index 0000000000..09ad985368
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Connection-URL.xml
@@ -0,0 +1,324 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-Connection-URL">
+ <title>Connection URLs</title>
+ <para> In JNDI properties, a Connection URL specifies options for a connection. The format for a
+ Connection URL is: </para>
+
+ <programlisting><![CDATA[amqp://[<user>:<pass>@][<clientid>]<virtualhost>[?<option>='<value>'[&<option>=&'<value>']]]]></programlisting>
+ <para> For instance, the following Connection URL specifies a user name, a password, a client
+ ID, a virtual host ("test"), a broker list with a single broker: a TCP host with the host
+ name <quote>localhost</quote> using port 5672: </para>
+
+ <programlisting><![CDATA[amqp://username:password@clientid/test?brokerlist='tcp://localhost:5672']]></programlisting>
+
+ <important>
+ <title>Connection option quoting</title>
+ <para>Take care with the quoting surrounding option values. Each option value
+ <emphasis>must</emphasis> be surrounded with single quotes ('). </para>
+ </important>
+
+ <para>The Connection URL supports the following options:</para>
+ <table pgwide="1" id="JMS-Client-0-8-Connection-URL-Options">
+ <title>Connection URL Options</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry> Option </entry>
+ <entry> Type </entry>
+ <entry> Description </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row id="JMS-Client-0-8-Connection-URL-ConnectionOptions-Brokerlist">
+ <entry> brokerlist </entry>
+ <entry> see below </entry>
+ <entry> List of one or more broker addresses. </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-ConnectionOptions-Maxprefetch">
+ <entry> maxprefetch </entry>
+ <entry> integer </entry>
+ <entry>
+ <para> The maximum number of pre-fetched messages per Session. If not
+ specified, default value of 500 is used. </para>
+ <para> Note: You can also set the default per-session prefetch value on a
+ client-wide basis by configuring the client using <link
+ linkend="JMS-Client-0-8-System-Properties">Java system
+ properties.</link>
+ </para>
+ </entry>
+ </row>
+ <!-- 0-10 only
+ <row>
+ <entry> sync_publish </entry>
+ <entry> {'persistent' | 'all'} </entry>
+ <entry> A sync command is sent after every persistent message to guarantee that
+ it has been received; if the value is 'persistent', this is done only for
+ persistent messages. </entry>
+ </row>
+ -->
+ <!-- 0-10 only
+ <row>
+ <entry> sync_ack </entry>
+ <entry> Boolean </entry>
+ <entry> A sync command is sent after every acknowledgement to guarantee that it
+ has been received. </entry>
+ </row>
+ -->
+ <row id="JMS-Client-0-8-Connection-URL-ConnectionOptions-UseLegacyMap">
+ <entry> use_legacy_map_msg_format </entry>
+ <entry> Boolean </entry>
+ <entry> If you are using JMS Map messages and deploying a new client with any
+ JMS client older than 0.8 release, you must set this to true to ensure the
+ older clients can understand the map message encoding. </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-ConnectionOptions-Failover">
+ <entry> failover </entry>
+ <entry> {'singlebroker' | 'roundrobin'
+ ,<!-- Cpp/0-10 only | 'failover_exchange' --> | 'nofailover' |
+ '&lt;class&gt;'} </entry>
+ <entry>
+ <para> This option controls failover behaviour. The method
+ <literal>singlebroker</literal> uses only the first broker in the
+ list, <literal>roundrobin</literal> will try each broker given in the
+ broker list until a connection is established,
+ <!--<literal>failover_exchange</literal> connects to the initial broker
+ given in the broker URL and will receive membership updates via the
+ failover exchange. --><literal>nofailover</literal>
+ disables all retry and failover logic. Any other value is interpreted as
+ a classname which must implement the
+ <literal>org.apache.qpid.jms.failover.FailoverMethod</literal>
+ interface. </para>
+ <para> The broker list options <literal>retries</literal> and
+ <literal>connectdelay</literal> (described below) determine the
+ number of times a connection to a broker will be retried and the
+ length of time to wait between successive connection attempts before
+ moving on to the next broker in the list. The failover option
+ <literal>cyclecount</literal> controls the number of times to loop
+ through the list of available brokers before finally giving up. </para>
+ <para> Defaults to <literal>roundrobin</literal> if the brokerlist contains
+ multiple brokers, or <literal>singlebroker</literal> otherwise. </para>
+ </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-ConnectionOptions-CloseWhenNoRoute">
+ <entry> closeWhenNoRoute </entry>
+ <entry> boolean </entry>
+ <entry>
+ <para>See <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageProducer-CloseWhenNoRoute"
+ />.</para>
+ </entry>
+ </row>
+ <row>
+ <entry> ssl </entry>
+ <entry> boolean </entry>
+ <entry>
+ <para> If <literal>ssl='true'</literal>, use SSL for all broker connections.
+ Overrides any per-broker settings in the brokerlist (see below) entries.
+ If not specified, the brokerlist entry for each given broker is used to
+ determine whether SSL is used. </para>
+ <para> Introduced in version 0.22. </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para> Broker lists are specified using a URL in this format: </para>
+
+ <programlisting><![CDATA[brokerlist=<transport>://<host>[:<;port>](?<param>='<value>')(&<param>='<value>')*]]></programlisting>
+ <para> For instance, this is a typical broker list: </para>
+
+ <programlisting><![CDATA[brokerlist='tcp://localhost:5672']]></programlisting>
+
+ <para> A broker list can contain more than one broker address; if so, the connection is made to
+ the first broker in the list that is available.
+ <!--In general, it is better to use the failover
+ exchange when using multiple brokers, since it allows applications to fail over if a broker
+ goes down.--></para>
+
+ <example>
+ <title>Broker Lists</title>
+ <para>A broker list can specify properties to be used when connecting to the broker. This
+ broker list specifies options for configuring heartbeating</para>
+ <programlisting><![CDATA[amqp://guest:guest@test/test?brokerlist='tcp://ip1:5672?heartbeat='5'']]></programlisting>
+
+ <para>This broker list specifies some SSL options</para>
+
+ <programlisting><![CDATA[amqp://guest:guest@test/test?brokerlist='tcp://ip1:5672?ssl='true'&ssl_cert_alias='cert1'']]></programlisting>
+
+ <para> This broker list specifies two brokers using the connectdelay and retries broker
+ options. It also illustrates the failover connection URL property. </para>
+
+ <programlisting><![CDATA[amqp://guest:guest@/test?failover='roundrobin?cyclecount='2''
+ &brokerlist='tcp://ip1:5672?retries='5'&connectdelay='2000';tcp://ip2:5672?retries='5'&connectdelay='2000''
+ ]]></programlisting>
+ </example>
+
+ <important>
+ <title>Broker option quoting</title>
+ <para>Take care with the quoting surrounding broker option values. Each broker option value
+ <emphasis>must</emphasis> be surrounded with their own single quotes ('). This is in
+ addition to the quotes surround the connection option value.</para>
+ </important>
+
+ <para>The following broker list options are supported.</para>
+
+ <table pgwide="1">
+ <title>Broker List Options</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry> Option </entry>
+ <entry> Type </entry>
+ <entry> Description </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-Heartbeat">
+ <entry> heartbeat </entry>
+ <entry> Long </entry>
+ <entry> Frequency of heartbeat messages (in seconds). A value of 0 disables
+ heartbeating. <para>For compatibility with old client configuration, option
+ <varname>idle_timeout</varname> (in milliseconds) is also
+ supported.</para>
+ </entry>
+ </row>
+ <!-- 0-10 only
+ <row>
+ <entry> sasl_mechs </entry>
+ <entry> - </entry>
+ <entry> For secure applications, we suggest CRAM-MD5, DIGEST-MD5, or GSSAPI. The
+ ANONYMOUS method is not secure. The PLAIN method is secure only when used
+ together with SSL. For Kerberos, sasl_mechs must be set to GSSAPI,
+ sasl_protocol must be set to the principal for the qpidd broker, e.g.
+ qpidd/, and sasl_server must be set to the host for the SASL server, e.g.
+ sasl.com. SASL External is supported using SSL certification, e.g.
+ <literal>ssl='true'&amp;sasl_mechs='EXTERNAL'</literal>
+ </entry>
+ </row>
+ <row>
+ <entry> sasl_encryption </entry>
+ <entry> Boolean </entry>
+ <entry> If <literal>sasl_encryption='true'</literal>, the JMS client attempts to
+ negotiate a security layer with the broker using GSSAPI to encrypt the
+ connection. Note that for this to happen, GSSAPI must be selected as the
+ sasl_mech. </entry>
+ </row>
+ <row>
+ <entry> sasl_protocol </entry>
+ <entry> - </entry>
+ <entry> Used only for Kerberos. <literal>sasl_protocol</literal> must be set to
+ the principal for the qpidd broker, e.g. <literal>qpidd/</literal>
+ </entry>
+ </row>
+ <row>
+ <entry> sasl_server </entry>
+ <entry> - </entry>
+ <entry> For Kerberos, sasl_mechs must be set to GSSAPI, sasl_server must be set
+ to the host for the SASL server, e.g. <literal>sasl.com</literal>. </entry>
+ </row>
+ -->
+ <row>
+ <entry> ssl </entry>
+ <entry> Boolean </entry>
+ <entry>
+ <para>If <literal>ssl='true'</literal>, the JMS client will encrypt the
+ connection to this broker using SSL.</para>
+ <para>This can also be set/overridden for all brokers using the Connection
+ URL option <literal>ssl</literal>.</para>
+ </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-TrustStore">
+ <entry> trust_store </entry>
+ <entry> String </entry>
+ <entry> Path to trust store. Used when using SSL and the Broker's certificate is
+ signed by a private-CA (or a self-signed certificate),</entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-TrustStorePassword">
+ <entry> trust_store_password </entry>
+ <entry> String </entry>
+ <entry> Trust store password. Password used to open the trust store. </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-KeyStore">
+ <entry> key_store </entry>
+ <entry> String </entry>
+ <entry> Path to key store . Used when using SSL and the client must authenticate
+ using client-auth. If the store contains more than one certificate,
+ <literal>ssl_cert_alias</literal> must be used to identify the
+ certificate that the client must present to the Broker.</entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-KeyStorePassword">
+ <entry> key_store_password </entry>
+ <entry> String </entry>
+ <entry> Key store password. Password used to open the key store. </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-SslCertAlias">
+ <entry> ssl_cert_alias </entry>
+ <entry> String </entry>
+ <entry> If multiple certificates are present in the keystore, the alias will be
+ used to extract the correct certificate. </entry>
+ </row>
+ <row>
+ <entry> ssl_verify_hostname </entry>
+ <entry> Boolean </entry>
+ <entry> When using SSL you can enable hostname verification by using
+ <literal>ssl_verify_hostname='true'</literal> in the broker URL.
+ </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-Retries">
+ <entry> retries </entry>
+ <entry> Integer </entry>
+ <entry> The number of times to retry connection to each broker in the broker
+ list. Defaults to 1. </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-ConnectDelay">
+ <entry> connectdelay </entry>
+ <entry> integer </entry>
+ <entry> Length of time (in milliseconds) to wait before attempting to reconnect.
+ Defaults to 0. </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-ConnectTimeout">
+ <entry> connecttimeout </entry>
+ <entry> integer </entry>
+ <entry> Length of time (in milliseconds) to wait for the socket connection to
+ succeed. A value of 0 represents an infinite timeout, i.e. the connection
+ attempt will block until established or an error occurs. Defaults to 30000.
+ </entry>
+ </row>
+ <row id="JMS-Client-0-8-Connection-URL-BrokerOptions-TcpNoDelay">
+ <entry> tcp_nodelay </entry>
+ <entry> Boolean </entry>
+ <entry> If <literal>tcp_nodelay='true'</literal>, TCP packet batching is
+ disabled. Defaults to true since Qpid 0.14. </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Document-Scope-And-Intended-Audience.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Document-Scope-And-Intended-Audience.xml
new file mode 100644
index 0000000000..234a2862cb
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Document-Scope-And-Intended-Audience.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-Document-Scope-And-Intended-Audience">
+ <title>Document Scope And Intended Audience</title>
+
+ <para> The intended audience of this document is Java developers who are familiar with the JMS
+ specification. Readers are not required to know all the details of AMQP protocols. However, some
+ knowledge of AMQP basic concepts would be advantageous for reading of this document. </para>
+
+ <para> This document only covers the usage of 0-8, 0-9 and 0-9-1 AMQP protocols with Qpid JMS
+ client. The specifications for these protocols are available from the <ulink
+ url="&amqpSrc;">AMQP web site</ulink>. </para>
+
+ <para> The document covers some specific implementation details of JMS connections, sessions,
+ consumers and producers in <xref linkend="JMS-Client-0-8-Client-Understanding"/>. It also
+ demonstrates how to write a simple point to point and simple publish/subscribe application using
+ Qpid JMS Client in <xref linkend="JMS-Client-0-8-Examples"/>. </para>
+
+ <para>The Qpid JMS Client supports various configuration options which can be set via JVM system
+ properties, connection URLs and JNDI configuration file. The setting of system properties is
+ described in <xref linkend="JMS-Client-0-8-System-Properties"/>. The details of supported
+ options within the connection URLs are given in <xref linkend="JMS-Client-0-8-Connection-URL"/>.
+ The details of Qpid JMS client JNDI properties format is provided in <xref
+ linkend="JMS-Client-0-8-JNDI-Properties-Format"/>. The Qpid destination URL format is covered
+ in <xref linkend="JMS-Client-0-8-Binding-URL"/>. </para>
+
+ <para>The Qpid JMS Client can be used for writing of JMS vendor neutral messaging applications.
+ However, in some cases it might be required to use specific AMQP features. Thus, the Qpid client
+ provides the extended operation set to invoke those features. </para>
+
+ <para>
+ <xref linkend="JMS-Client-0-8-Logging"/> provides the details about turning on client logging
+ which can help in debugging of various issues while developing the messaging applications. </para>
+
+ <para>The details about Qpid JMS Client Exceptions are provided in <xref
+ linkend="JMS-Client-0-8-Appendix-Exceptions"/></para>
+
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Examples.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Examples.xml
new file mode 100644
index 0000000000..87abbb8bfb
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Examples.xml
@@ -0,0 +1,297 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-Examples">
+ <title>Examples</title>
+
+ <para>The following programs shows how to send and receive messages using the Qpid JMS client.
+ The first program illustrates a <emphasis>point to point</emphasis> example, the second, a
+ pubish/subscribe example. </para>
+ <para>Both examples show the use JNDI to obtain connection factory and destination objects which
+ the application needs. In this way the configuration is kept separate from the application
+ code itself.</para>
+ <para>The example code will be straightforward for anyone familiar with Java JMS. Readers in
+ need of an introduction are directed towards <ulink url="&oracleJmsTutorial;">Oracle's JMS
+ tutorial</ulink>.</para>
+ <section id="JMS-Client-0-8-Examples-PTP">
+ <title>Point to point example</title>
+ <para>In this example, we illustrate point to point messaging. We create a JNDI context
+ using a properties file, use the context to lookup a connection factory, create and
+ start a connection, create a session, and lookup a destination (a queue) from the JNDI
+ context. Then we create a producer and a consumer, send a message with the producer and
+ receive it with the consumer.</para>
+
+ <example id="JMS-Client-0-8-Examples-PTP-Java">
+ <title>JMS Example - Point to Point Messaging</title>
+ <programlisting language="java">
+import javax.jms.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.Properties;
+
+public class Hello {
+
+ public Hello() {
+ }
+
+ public static void main(String[] args) throws Exception {
+ Hello hello = new Hello();
+ hello.runTest();
+ }
+
+ private void runTest() throws Exception {
+ Properties properties = new Properties();
+ properties.load(this.getClass().getResourceAsStream("helloworld.properties")); <co id="ptp-java-properties" linkends="callout-ptp-properties"/>
+ Context context = new InitialContext(properties); <co id="ptp-java-context" linkends="callout-ptp-context"/>
+
+ ConnectionFactory connectionFactory
+ = (ConnectionFactory) context.lookup("qpidConnectionFactory"); <co id="ptp-java-connection-factory" linkends="callout-ptp-connection-factory"/>
+ Connection connection = connectionFactory.createConnection(); <co id="ptp-java-connection" linkends="callout-ptp-connection"/>
+ connection.start(); <co id="ptp-java-start" linkends="callout-ptp-start"/>
+
+ Session session = connection.createSession(true, Session.SESSION_TRANSACTED); <co id="ptp-java-session" linkends="callout-ptp-session"/>
+ Queue queue = (Queue) context.lookup("myqueue"); <co id="ptp-java-destination" linkends="callout-ptp-destination"/>
+
+ MessageConsumer messageConsumer = session.createConsumer(queue); <co id="ptp-java-consumer" linkends="callout-ptp-consumer"/>
+ MessageProducer messageProducer = session.createProducer(queue); <co id="ptp-java-producer" linkends="callout-ptp-producer"/>
+
+ TextMessage message = session.createTextMessage("Hello world!"); <co id="ptp-java-send" linkends="callout-ptp-send"/>
+ messageProducer.send(message);
+ session.commit();
+
+ message = (TextMessage)messageConsumer.receive(); <co id="ptp-java-receive" linkends="callout-ptp-receive"/>
+ session.commit();
+ System.out.println(message.getText());
+
+ connection.close(); <co id="ptp-java-close" linkends="callout-ptp-close"/>
+ context.close(); <co id="ptp-java-jndi-close" linkends="callout-ptp-jndi-close"/>
+ }
+}
+ </programlisting>
+ </example>
+
+ <calloutlist>
+ <callout id="callout-ptp-properties" arearefs="ptp-java-properties">
+ <para>Loads the JNDI properties file, which specifies the connection factory, queues
+ and topics. See <xref linkend="JMS-Client-0-8-JNDI-Properties-Format"/> for
+ details.</para>
+ </callout>
+ <callout id="callout-ptp-context" arearefs="ptp-java-context">
+ <para>Creates the JNDI initial context.</para>
+ </callout>
+ <callout id="callout-ptp-connection-factory" arearefs="ptp-java-connection-factory">
+ <para>Looks up a JMS connection factory for Qpid.</para>
+ </callout>
+ <callout id="callout-ptp-connection" arearefs="ptp-java-connection">
+ <para>Creates a JMS connection. Creating the JMS connections establishes the
+ connection to the Broker.</para>
+ </callout>
+ <callout id="callout-ptp-start" arearefs="ptp-java-start">
+ <para>Starts the connection, required for the consumption of messages.</para>
+ </callout>
+ <callout id="callout-ptp-session" arearefs="ptp-java-session">
+ <para>Creates a transactional session.</para>
+ </callout>
+ <callout id="callout-ptp-destination" arearefs="ptp-java-destination">
+ <para>Looks up a destination for the queue with JNDI name <emphasis>myqueue</emphasis>.</para>
+ </callout>
+ <callout id="callout-ptp-consumer" arearefs="ptp-java-consumer">
+ <para>Creates a consumer that reads messages from the queue<footnote>
+ <para>Creating consumer will automatically create the queue on the Broker
+ and bind it to an exchange. Specifically, in this case as the
+ <literal>queue.</literal> form is used in the JNDI properties the
+ effect will be to create a queue called <literal>queue1</literal> on the
+ Broker, and create a binding between the <literal>amq.direct</literal>
+ exchange and this queue using the queue's name. This process is
+ described in detail in <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageConsumer-ConsumerSideEffect"
+ /></para>
+ </footnote>.</para>
+ </callout>
+ <callout id="callout-ptp-producer" arearefs="ptp-java-producer">
+ <para>Creates a producer that sends messages to the queue.</para>
+ </callout>
+ <callout id="callout-ptp-send" arearefs="ptp-java-send">
+ <para>Creates a new message of type <emphasis>javax.jms.TextMessage</emphasis>, publishes the message and commits the
+ session.</para>
+ </callout>
+ <callout id="callout-ptp-receive" arearefs="ptp-java-receive">
+ <para>Reads the next available message (awaiting indefinitely if necessary) and
+ commits the session.</para>
+ </callout>
+ <callout id="callout-ptp-close" arearefs="ptp-java-close">
+ <para>Closes the Connection. All sessions owned by the Connection along with their
+ MessageConsumers and MessageProducers are automatically closed. The connection
+ to the Broker is closed as this point.</para>
+ </callout>
+ <callout id="callout-ptp-jndi-close" arearefs="ptp-java-jndi-close">
+ <para>Closes the JNDI context.</para>
+ </callout>
+ </calloutlist>
+
+ <para>The contents of the <literal>helloworld.properties</literal> file are shown
+ below.</para>
+
+ <example id="JMS-Client-0-8-Examples-PTP-PropertiesFile">
+ <title>JMS Example - Point to Point Messaging - JNDI Properties</title>
+ <programlisting language="properties">
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+connectionfactory.qpidConnectionFactory = amqp://guest:guest@clientid/?brokerlist='tcp://localhost:5672' <co id="ptp-properties-connectionfactory" linkends="callout-ptp-properties-connectionfactory"/>
+queue.myqueue = queue1 <co id="ptp-properties-destination" linkends="callout-ptp-properties-destination"/>
+ </programlisting>
+ </example>
+
+ <calloutlist>
+ <callout id="callout-ptp-properties-connectionfactory"
+ arearefs="ptp-properties-connectionfactory">
+ <para>Defines a connection factory from which Connections can be created. The syntax
+ of a ConnectionURL is given in <xref
+ linkend="JMS-Client-0-8-Connection-URL"/>.</para>
+ </callout>
+ <callout id="callout-ptp-properties-destination" arearefs="ptp-properties-destination">
+ <para>Defines a queue for which MessageProducers and/or MessageConsumers send and
+ receive messages. The format of these entries is described in <xref
+ linkend="JMS-Client-0-8-JNDI-Properties-Format-Queue"/>.</para>
+ </callout>
+ </calloutlist>
+ </section>
+ <section id="JMS-Client-0-8-Examples-PubSub">
+ <title>Publish/subscribe example</title>
+ <para>In this second example, we illustrate publish/subscribe messaging. Again, we create a
+ JNDI context using a properties file, use the context to lookup a connection factory,
+ create and start a connection, create a session, and lookup a destination (a topic) from
+ the JNDI context. Then we create a producer and two durable subscribers , send a message
+ with the producer. Both subscribers receive the same message.</para>
+
+ <example id="JMS-Client-0-8-Examples-PubSub-Java">
+ <title>JMS Example - Publish/subscribe Messaging</title>
+ <programlisting language="java">
+import javax.jms.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+import java.util.Properties;
+
+public class StocksExample {
+
+ public StocksExample() {
+ }
+
+ public static void main(String[] args) throws Exception {
+ StocksExample stocks = new StocksExample();
+ stocks.runTest();
+ }
+
+ private void runTest() throws Exception {
+ Properties properties = new Properties();
+ properties.load(this.getClass().getResourceAsStream("stocks.properties"));
+ Context context = new InitialContext(properties);
+
+ ConnectionFactory connectionFactory
+ = (ConnectionFactory) context.lookup("qpidConnectionFactory");
+ Connection connection = connectionFactory.createConnection();
+ connection.start();
+
+ Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+ Topic priceTopic = (Topic) context.lookup("myprices"); <co id="pubsub-java-destination" linkends="callout-pubsub-destination"/>
+
+ MessageConsumer subscriber1 = session.createDurableSubscriber(priceTopic, "sub1"); <co id="pubsub-java-subscribers" linkends="callout-pubsub-subscribers"/>
+ MessageConsumer subscriber2 = session.createDurableSubscriber(priceTopic, "sub2" /*, "price > 150", false*/ );
+ MessageProducer messageProducer = session.createProducer(priceTopic);
+
+ Message message = session.createMessage();
+ message.setStringProperty("instrument", "IBM");
+ message.setIntProperty("price", 100);
+ messageProducer.send(message);
+ session.commit();
+
+ message = subscriber1.receive(1000);
+ session.commit();
+ System.out.println("Subscriber 1 received : " + message);
+
+ message = subscriber2.receive(1000);
+ session.commit();
+ System.out.println("Subscriber 2 received : " + message);
+
+ session.unsubscribe("sub1"); <co id="pubsub-java-unsubscribe" linkends="callout-pubsub-unsubscribe"/>
+ session.unsubscribe("sub2");
+ connection.close();
+ context.close();
+ }
+}
+ </programlisting>
+ </example>
+
+ <calloutlist>
+ <callout id="callout-pubsub-destination" arearefs="pubsub-java-destination">
+ <para>Looks up a destination for the topic with JNDI name myprices.</para>
+ </callout>
+ <callout id="callout-pubsub-subscribers" arearefs="pubsub-java-subscribers">
+ <para>Creates two durable subscribers, <literal>sub1</literal> and
+ <literal>sub2</literal>. Durable subscriptions retain messages for the
+ client even when the client is disconnected, until the subscription is
+ unsubscribed. Subscription 2 has a (commented out) message selector argument so
+ you can conveniently experiement with the effect of those. <footnote>
+ <para>Each durable subscription is implemented as a queue on the Broker. See
+ <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageConsumer-TopicSubscriptions"
+ /> for details.</para>
+ </footnote></para>
+ </callout>
+ <callout id="callout-pubsub-unsubscribe" arearefs="pubsub-java-unsubscribe">
+ <para>Unsubscribes the two durable subscribers, permanently removing the knowledge
+ of the subscriptions from the system. An application would normally
+ <emphasis>NOT</emphasis> do this. The typical use-case for durable
+ subsciption is one where the subscription exists over an extended period of
+ time.</para>
+ </callout>
+ </calloutlist>
+
+ <para>The contents of the <literal>stocks.properties</literal> file are shown below.</para>
+
+ <example id="JMS-Client-0-8-Examples-PubSub-PropertiesFile">
+ <title>JMS Example - Publish/subscribe Messaging - JNDI Properties</title>
+ <programlisting>
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+connectionfactory.qpidConnectionFactory = amqp://guest:guest@clientid/?brokerlist='tcp://localhost:5672'
+topic.myprices = prices <co id="pubsub-properties-destination" linkends="callout-pubsub-properties-destination"/>
+ </programlisting>
+ </example>
+
+ <calloutlist>
+ <callout id="callout-pubsub-properties-destination"
+ arearefs="pubsub-properties-destination">
+ <para>Defines a topic for which MessageProducers and/or MessageConsumers send and
+ receive messages. The format of this entry is described in <xref
+ linkend="JMS-Client-0-8-JNDI-Properties-Format-Topic"/>.</para>
+ </callout>
+ </calloutlist>
+ </section>
+
+
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Getting-And-Dependencies.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Getting-And-Dependencies.xml
new file mode 100644
index 0000000000..bae5278c1c
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Getting-And-Dependencies.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-JMS-Getting-And-Dependencies">
+ <title>Getting the Client And Dependencies</title>
+ <section id="JMS-Client-0-8-JMS-Getting-And-Dependencies-Getting">
+ <title>Getting the Client</title>
+ <para>The Qpid JMS client is available as a bundle or from &qpidMavenRepoDesc;.</para>
+ <para>The bundle (a .tar.gz) includes the Qpid JMS client itself (formed by two JAR: qpid-client
+ and qpid-common) together with slf4j-api, and geronimo-jms_1.1_spec. There is also a qpid-all
+ JAR artifact that, for convenience, includes a manifest classpath that references the other
+ JARs. The bundle is available from <ulink url="&qpidDownloadUrl;"
+ >&qpidDownloadUrlDesc;</ulink>.</para>
+ <para>The Qpid JMS client is also available from &qpidMavenRepoDesc;. Add the following
+ dependency:</para>
+ <screen><![CDATA[
+ <dependency>
+ <groupId>]]>&qpidClientGroupId;<![CDATA[</groupId>
+ <artifactId>]]>&qpidClientArtefactId;<![CDATA[</artifactId>
+ <version>]]>&qpidVersion;<![CDATA[</version>
+ </dependency>
+ ]]></screen>
+ <para><xref linkend="JMS-Client-0-8-Appendix-Maven"/> illustrates a minimal Maven POM required to use the Qpid Client.</para>
+ </section>
+ <section id="JMS-Client-0-8-JMS-Getting-And-Dependencies-Dependencies">
+ <title>Dependencies</title>
+ <para>The Qpid JMS client has minimal set of external dependencies. </para>
+ <para> It requires: <itemizedlist>
+ <listitem>
+ <para>JDK 1.6 or higher. (An up to date JDK 1.7 is recommended)</para>
+ </listitem>
+ <listitem>
+ <para>JMS 1.1 specification (such as geronimo-jms_1.1_spec JAR)</para>
+ </listitem>
+ <listitem>
+ <para><ulink url="http://www.slf4j.org">Apache SLF4J</ulink> (slf4j-api-x.y.z JAR)</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>The use of SLF4J means that application authors are free to plug in any logging framework
+ for which an SLF4J binding exists. </para>
+ </section>
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Introduction.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Introduction.xml
new file mode 100644
index 0000000000..3707e8981b
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Introduction.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<!-- TODO add dependencies + getting the client -->
+
+<chapter id="JMS-Client-0-8-Introduction">
+ <title>Introduction</title>
+ <para>Qpid JMS client is an implementation of <ulink url="&oracleJmsSpec;">JMS specification
+ 1.1</ulink>. It utilises an <ulink url="&amqpSrc;">AMQP</ulink> transport layer for the performing of messaging operations.
+ The client is intended to be used for the writing of JMS compatible messaging applications. Such
+ applications can send and receive messages via any AMQP-compatible brokers like RabbitMQ, Qpid
+ Java Broker which support the AMQP protocols 0-8, 0-9, or 0-9-1.</para>
+ <para>The Qpid JMS client hides the details of AMQP transport implementation behind the JMS API.
+ Thus, the developers need only to be familiar with JMS API in order to use the client. However,
+ the knowledge of the basic concepts of AMQP protocols can help developers in writing reliable
+ and high-performant messaging application. </para>
+ <important>
+ <title>Using the Qpid JMS client with 0-10</title>
+ <para>This book documents the behaviour of the Qpid JMS client when used with the AMQP
+ protocols <emphasis>0-8, 0-9, and 0-9-1</emphasis> only. For behaviour when using the client
+ with AMQP 0-10 protocol, please refer to <ulink url="&qpidProgrammingBook;">Programming in Apache Qpid</ulink>.</para>
+ </important>
+
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-JMS-Extensions.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-JMS-Extensions.xml
new file mode 100644
index 0000000000..bdc7832c88
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-JMS-Extensions.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-JMS-Extensions">
+ <title>JMS Extensions</title>
+
+ <para>TODO</para>
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-JNDI-Properties-Format.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-JNDI-Properties-Format.xml
new file mode 100644
index 0000000000..fb7d96fd68
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-JNDI-Properties-Format.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-JNDI-Properties-Format">
+ <title>JNDI Properties Format</title>
+
+ <para>The Qpid JMS Client comes with own JNDI context factory
+ <literal>org.apache.qpid.jndi.PropertiesFileInitialContextFactory</literal> which utilises a
+ Java properties file for declaring the JMS administered objects: connection factories, queues,
+ topics and destinations. It uses the following syntax:</para>
+ <para>
+ <screen><![CDATA[
+connectionfactory.<jndi name>=<connection url>
+queue.<jndi name>=<queue name>
+topic.<jndi name>=<topic name>
+destination.<jndi name>=<binding url>
+]]></screen></para>
+ <para>An arbitrary number of connection factories, queues, topics, queues or destinations or can
+ be declared in the JNDI properties file. Each JNDI name must be unique.</para>
+ <para>The application looks up the objects via an InitialContext. This lookup and an example JNDI
+ properties file is provided in <xref linkend="JMS-Client-0-8-Examples"/></para>
+ <para>We now consider each JMS administered object type in turn.</para>
+
+ <section id="JMS-Client-0-8-JNDI-Properties-Format-ConnectionFactory">
+ <title>ConnectionFactory</title>
+ <para><literal>connectionfactory.</literal><emphasis>name</emphasis> declares a <ulink
+ url="&oracleJeeDocUrl;javax/jms/ConnectionFactory.html">ConnectionFactory</ulink> with the
+ given JNDI name. The value must be a legal Connection URL.</para>
+ <para>See <xref linkend="JMS-Client-0-8-Connection-URL"/> for format of the URL and its
+ permitted options.</para>
+ </section>
+ <section id="JMS-Client-0-8-JNDI-Properties-Format-Queue">
+ <title>Queue</title>
+ <para><literal>queue.</literal><emphasis>name</emphasis> declares a <ulink
+ url="&oracleJeeDocUrl;javax/jms/Queue.html">Queue</ulink> with the given JNDI name. The
+ value is simple queue name. This is the name of the queue as known by the Broker.</para>
+ <para>The <literal>queue.</literal> form is a short hand for declaring a destination:</para>
+ <screen><![CDATA[destination.name=direct://amq.direct//<queue name>?routingkey=’<queue name>’&durable=’true’]]></screen>
+ </section>
+ <section id="JMS-Client-0-8-JNDI-Properties-Format-Topic">
+ <title>Topic</title>
+ <para><literal>topic.</literal><emphasis>name</emphasis> declares a <ulink
+ url="&oracleJeeDocUrl;javax/jms/Topic.html">Topic</ulink> with the given JNDI name. The
+ value is topic name. This topic name is used on the Broker as a binding key between the
+ <literal>amq.topic</literal> exchange and the queue corresponding to the topic
+ subscriber.</para>
+ <para>The <literal>topic.</literal> form is a short hand for declaring a destination:</para>
+ <screen><![CDATA[destination.name=topic://amq.topic/<topic name>/?routingkey=<topic name>]]></screen>
+ </section>
+ <section id="JMS-Client-0-8-JNDI-Properties-Format-Destination">
+ <title>Destination</title>
+ <para><literal>destination.</literal><emphasis>name</emphasis> declares either a <ulink
+ url="&oracleJeeDocUrl;javax/jms/Queue.html">Queue</ulink> or <ulink
+ url="&oracleJeeDocUrl;javax/jms/Topic.html">Topic</ulink> (depending on the class) with the
+ given JNDI name. The value must be a Binding URL.</para>
+ <para>See <xref linkend="JMS-Client-0-8-Binding-URL"/> for format of the URL and its permitted
+ options.</para>
+ </section>
+
+
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Logging.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Logging.xml
new file mode 100644
index 0000000000..b231972784
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Logging.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-Logging">
+ <title>Logging</title>
+ <para>The Qpid JMS client uses the <ulink url="http://www.slf4j.org">Apache SLF4J</ulink> logging
+ framework. All logging activity created by the client is directed through the SLF4J API. SLF4J
+ is a is a façade for other common logging frameworks. This makes it easy for application authors
+ to use their prefered logging framework in their application stack, and have the Qpid JMS Client
+ use it too. </para>
+ <para>SLF4J suppplies bindings for many common logging frameworks (<ulink
+ url="&oracleJdkDocUrl;java/util/logging/package-summary.html">JUL</ulink>, <ulink
+ url="http://logging.apache.org/log4j/1.2/">Apache Log4J</ulink>, <ulink
+ url="http://logback.qos.ch">Logback</ulink>.</para>
+ <para>Include the SLF4J binding corresponding to the logging framework of your choosen logging
+ framework on classpath. For full details, see the SLF4J <ulink url="http://www.slf4j.org"
+ >documentation</ulink>.</para>
+
+ <section id="JMS-Client-0-8-Logging-RecommendedProductionLoggingLevel">
+ <title>Recommended Production Logging Level</title>
+ <para>In production, it is recommended that you configure your logging framework is configured
+ with logger <literal>org.apache.qpid</literal> set to <literal>WARN</literal>.</para>
+ <para>If you are using Apache Log4j with a log4j.properties file, this simply means adding the
+ following line:</para>
+ <screen>
+ org.apache.qpid=WARN
+ </screen>
+ <para>If you are using another logging framework, or you are using Log4j but configuring in
+ another manner, refer to the documentation accompanying the logging framework for details of
+ how to proceed.</para>
+ </section>
+ <section id="JMS-Client-0-8-Logging-EnablingDebugLogging">
+ <title>Enabling Debug</title>
+ <para>If you are experiencing a problem, it can be informative to enable debug logging to allow
+ the behaviour of the Qpid JMS client to be understood at a deeper level.</para>
+ <para>To do this, set the <literal>org.apache.qpid</literal> logger to
+ <literal>DEBUG</literal>.</para>
+ <para>If you are using Apache Log4j with a log4j.properties file, this simply means adding (or
+ changing) the following line:</para>
+ <screen>
+ org.apache.qpid=DEBUG
+ </screen>
+ <para>If you are using another logging framework, or you are using Log4j but configuring in
+ another manner, refer to the documentation accompanying the logging framework for details of
+ how to proceed.</para>
+ </section>
+
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-System-Properties.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-System-Properties.xml
new file mode 100644
index 0000000000..e2f419cdc7
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-System-Properties.xml
@@ -0,0 +1,623 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-System-Properties">
+ <title>System Properties</title>
+ <para>The following system properties affect the behaviour of the Qpid JMS client. System
+ properties are global in nature so affect all Qpid interactions made from within the same
+ JVM. For many options, there are equivalent <link linkend="JMS-Client-0-8-Connection-URL"
+ >Connection URL</link> options allowing the option to be controlled at the level of the
+ Connection.</para>
+
+ <table pgwide="1">
+ <title>System Properties Affecting Connection Behaviour</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.amqp.version</entry>
+ <entry>string</entry>
+ <entry>0-10</entry>
+ <entry><para>Sets the AMQP version to be used - currently supports one of
+ {0-8,0-9,0-91,0-10}.</para><para>The client will begin negotiation at
+ the specified version and only negotiate downwards if the Broker does
+ not support the specified version.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-Heartbeat">
+ <entry>qpid.heartbeat</entry>
+ <entry>int</entry>
+ <entry><para>Defaults to the heartbeat value suggested by the Broker, if
+ any.</para></entry>
+ <entry>Frequency of heartbeat messages (in seconds). A value of 0 disables
+ heartbeating. <para>Two consecutive missed heartbeats will result in the
+ connection timing out.</para><para>This can also be set per connection
+ using the <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-Heartbeat"
+ >Connection URL</link> options.</para><para>For compatibility with
+ old client configuration, the synonym
+ <varname>amqj.heartbeat.delay</varname> is supported.</para></entry>
+ </row>
+ <row>
+ <entry>ignore_setclientID</entry>
+ <entry>boolean</entry>
+ <entry>false</entry>
+ <entry>If a client ID is specified in the connection URL it's used or else an ID
+ is generated. If an ID is specified after it's been set Qpid will throw an
+ exception. <para>Setting this property to 'true' will disable that check and
+ allow you to set a client ID of your choice later on.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+
+ <table pgwide="1">
+ <title>Config Options For Session Behaviour</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row id="JMS-Client-0-8-System-Properties-DestSyntax">
+ <entry>qpid.dest_syntax</entry>
+ <entry>String</entry>
+ <entry>ADDR</entry>
+ <entry><para>The default addressing syntax. The Address (ADDR) syntax is supported when using AMQP 0-10. Binding URL (BURL)
+ is supported by AMQP protocols 0-8 through to 0-10.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-Maxprefetch">
+ <entry>max_prefetch</entry>
+ <entry>int</entry>
+ <entry>500</entry>
+ <entry><para>Maximum number of pre-fetched messages per Session. This can also
+ be defaulted for sessions created on a particular connection using the
+ <link
+ linkend="JMS-Client-0-8-Connection-URL-ConnectionOptions-Maxprefetch"
+ >Connection URL</link> options.</para></entry>
+ </row>
+
+
+ <!-- 0-10
+ <row>
+ <entry>qpid.session.command_limit</entry>
+ <entry>int</entry>
+ <entry>65536</entry>
+ <entry>Limits the # of unacked commands</entry>
+ </row>
+-->
+ <!-- 0-10
+ <row>
+ <entry>qpid.session.byte_limit</entry>
+ <entry>int</entry>
+ <entry>1048576</entry>
+ <entry>Limits the # of unacked commands in terms of bytes</entry>
+ </row>
+ -->
+ <row>
+ <entry>qpid.use_legacy_map_message</entry>
+ <entry>boolean</entry>
+ <entry>false</entry>
+ <entry><para>If set will use the old map message encoding. By default the Map
+ messages are encoded using the 0-10 map encoding.</para><para>This can
+ also be set per connection using the <link
+ linkend="JMS-Client-0-8-Connection-URL-ConnectionOptions-UseLegacyMap"
+ >Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.jms.daemon.dispatcher</entry>
+ <entry>boolean</entry>
+ <entry>false</entry>
+ <entry><para>Controls whether the Session dispatcher thread is a daemon thread
+ or not. If this system property is set to true then the Session
+ dispatcher threads will be created as daemon threads. This setting is
+ introduced in version 0.16.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table pgwide="1">
+ <title>Config Options For Consumer Behaviour</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row id="JMS-Client-0-8-System-Properties-DeclareExchanges">
+ <entry>qpid.declare_exchanges</entry>
+ <entry>Boolean</entry>
+ <entry>true</entry>
+ <entry><para>If true, creating a consumer will also declare the exchange on the
+ Broker (specified within the Binding URL associated with the
+ Destination), creating it if is does not already exist.
+ </para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-DeclareQueues">
+ <entry>qpid.declare_queues</entry>
+ <entry>Boolean</entry>
+ <entry>true</entry>
+ <entry><para>If true, creating a consumer will also declare the queue on the
+ Broker (specified within the Binding URL associated with the
+ Destination), creating it if is does not already
+ exist.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-RejectBehaviour">
+ <entry>qpid.reject.behaviour</entry>
+ <entry>String</entry>
+ <entry>NORMAL</entry>
+ <entry><para>Used with the maximum delivery count feature. See <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageConsumer-MaximumDeliveryCount"
+ /> for details.</para></entry>
+ </row>
+
+ <!-- 0-10
+ <row>
+ <entry>qpid.session.max_ack_delay</entry>
+ <entry>long</entry>
+ <entry>1000 (ms)</entry>
+ <entry><para>Timer interval to flush message acks in buffer when using AUTO_ACK
+ and DUPS_OK.</para>
+ <para>When using the above ack modes, message acks are batched and sent if
+ one of the following conditions are met (which ever happens first). <itemizedlist>
+ <listitem>
+ <para>When the ack timer fires.</para>
+ </listitem>
+ <listitem>
+ <para>if un_acked_msg_count > max_prefetch/2.</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>The ack timer can be disabled by setting it to 0.</para>
+ </entry>
+ </row>
+-->
+ <!-- 0-10
+ <row>
+ <entry>sync_ack</entry>
+ <entry>boolean</entry>
+ <entry>false</entry>
+ <entry><para>If set, each message will be acknowledged synchronously. When using
+ AUTO_ACK mode, you need to set this to "true", in order to get the
+ correct behaviour as described by the JMS spec.</para><para>This is set
+ to false by default for performance reasons, therefore by default
+ AUTO_ACK behaves similar to DUPS_OK.</para><para>This can also be set
+ per connection using the <link linkend="section-jms-connection-url"
+ >Connection URL</link> options.</para></entry>
+ </row>
+ -->
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table pgwide="1">
+ <title>Config Options For Producer Behaviour</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row id="JMS-Client-0-8-System-Properties-DefaultMandatory">
+ <entry>qpid.default_mandatory</entry>
+ <entry>Boolean</entry>
+ <entry>True</entry>
+ <entry><para>If true, messages sent to Queue destinations for which cannot be
+ routed to at least one queue on the Broker, will be returned to the
+ application. See <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageProducer-MandatoryMessage"
+ /> for more details.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-DefaultMandatoryTopic">
+ <entry>qpid.default_mandatory_topic</entry>
+ <entry>Boolean</entry>
+ <entry>False</entry>
+ <entry><para>If true, messages sent to Topic destinations for which cannot be
+ routed to at least one queue on the Broker, will be returned to the
+ application. See <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageProducer-MandatoryMessage"
+ /> for more details..</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-DefaultImmediate">
+ <entry>qpid.default_immediate</entry>
+ <entry>Boolean</entry>
+ <entry>False</entry>
+ <entry><para>If true, the message will be returned to the application unless the
+ Broker is able to route the message to at least one queue with a
+ consumer attached. See <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageProducer-ImmediateMessage"
+ /> for more details.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-FlowControlWaitFailure">
+ <entry>qpid.flow_control_wait_failure</entry>
+ <entry>Long</entry>
+ <entry>60000</entry>
+ <entry><para>Used with <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageProducer-FlowControl"
+ />. The amount of time (in milliseconds) to wait before timing
+ out.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-FlowControlWaitNotifyPeriod">
+ <entry>qpid.flow_control_wait_notify_period</entry>
+ <entry>Long</entry>
+ <entry>5000</entry>
+ <entry><para>Used with <xref
+ linkend="JMS-Client-0-8-Client-Understanding-MessageProducer-FlowControl"
+ />. The frequency at which the log message informing that the producer
+ is flow controlled .</para></entry>
+ </row>
+ <!--
+ <row>
+ <entry>sync_publish</entry>
+ <entry>string</entry>
+ <entry>"" (disabled)</entry>
+ <entry><para>If one of {persistent|all} is set then persistent messages or all
+ messages will be sent synchronously.</para><para>This can also be set
+ per connection using the <link linkend="section-jms-connection-url"
+ >Connection URL</link> options.</para></entry>
+ </row>
+ -->
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table pgwide="1">
+ <title>Config Options For Threading</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.thread_factory</entry>
+ <entry>string</entry>
+ <entry>org.apache.qpid.thread.DefaultThreadFactory</entry>
+ <entry><para>Specifies the thread factory to use.</para><para>If using a real
+ time JVM, you need to set the above property to
+ <varname>org.apache.qpid.thread.RealtimeThreadFactory</varname>.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.rt_thread_priority</entry>
+ <entry>int</entry>
+ <entry>20</entry>
+ <entry><para>Specifies the priority (1-99) for Real time threads created by the
+ real time thread factory.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table pgwide="1">
+ <title>Config Options For I/O</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.transport</entry>
+ <entry>string</entry>
+ <entry>org.apache.qpid.transport.network.io.IoNetworkTransport</entry>
+ <entry><para>The transport implementation to be used.</para><para>A user could
+ specify an alternative transport mechanism that implements the interface
+ <varname>org.apache.qpid.transport.network.OutgoingNetworkTransport</varname>.</para></entry>
+ </row>
+ <row id="JMS-Client-0-8-System-Properties-SyncOpTimeout">
+ <entry>qpid.sync_op_timeout</entry>
+ <entry>long</entry>
+ <entry>60000</entry>
+ <entry><para>The length of time (in milliseconds) to wait for a synchronous
+ operation to complete.</para><para>For compatibility with older clients,
+ the synonym <varname>amqj.default_syncwrite_timeout</varname> is
+ supported.</para></entry>
+ </row>
+ <row>
+ <entry>qpid.tcp_nodelay</entry>
+ <entry>boolean</entry>
+ <entry>true</entry>
+ <entry>
+ <para>Sets the TCP_NODELAY property of the underlying socket. The default
+ was changed to true as of Qpid 0.14.</para>
+ <para>This can also be set per connection using the Connection URL broker
+ option<link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-TcpNoDelay"
+ ><literal>tcp_nodelay</literal>.</link> options.</para>
+ <para>For compatibility with older clients, the synonym
+ <varname>amqj.tcp_nodelay</varname> is supported.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>qpid.send_buffer_size</entry>
+ <entry>integer</entry>
+ <entry>65535</entry>
+ <entry>
+ <para>Sets the SO_SNDBUF property of the underlying socket. Added in Qpid
+ 0.16.</para>
+ <para>For compatibility with older clients, the synonym
+ <varname>amqj.sendBufferSize</varname> is supported.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>qpid.receive_buffer_size</entry>
+ <entry>integer</entry>
+ <entry>65535</entry>
+ <entry>
+ <para>Sets the SO_RCVBUF property of the underlying socket. Added in Qpid
+ 0.16.</para>
+ <para>For compatibility with older clients, the synonym
+ <varname>amqj.receiveBufferSize</varname> is supported.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>qpid.failover_method_timeout</entry>
+ <entry>long</entry>
+ <entry>60000</entry>
+ <entry>
+ <para>During failover, this is the timeout for each attempt to try to
+ re-establish the connection. If a reconnection attempt exceeds the
+ timeout, the entire failover process is aborted.</para>
+ <para>It is only applicable for AMQP 0-8/0-9/0-9-1 clients.</para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <!-- These are all 0-10 related
+ <table pgwide="1">
+ <title>Config Options For Security</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+
+ <row>
+ <entry>qpid.sasl_mechs</entry>
+ <entry>string</entry>
+ <entry>PLAIN</entry>
+ <entry><para>The SASL mechanism to be used. More than one could be specified as
+ a comma separated list.</para><para>We currently support the following
+ mechanisms {PLAIN | GSSAPI | EXTERNAL}.</para><para>This can also be set
+ per connection using the <link linkend="JMS-Client-0-8-Connection-URL"
+ >Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.sasl_protocol</entry>
+ <entry>string</entry>
+ <entry>AMQP</entry>
+ <entry><para>When using GSSAPI as the SASL mechanism,
+ <varname>sasl_protocol</varname> must be set to the principal for
+ the qpidd broker, e.g. <varname>qpidd</varname>.</para><para>This can
+ also be set per connection using the <link
+ linkend="JMS-Client-0-8-Connection-URL">Connection URL</link>
+ options.</para></entry>
+ </row>
+ <row>
+ <entry>qpid.sasl_server_name</entry>
+ <entry>string</entry>
+ <entry>localhost</entry>
+ <entry><para>When using GSSAPI as the SASL mechanism,
+ <varname>sasl_server</varname> must be set to the host for the SASL
+ server, e.g. <varname>example.com</varname>.</para><para>This can also
+ be set per connection using the <link
+ linkend="JMS-Client-0-8-Connection-URL">Connection URL</link>
+ options.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table pgwide="1">
+ <title>Config Options For Security - Standard JVM properties needed when using GSSAPI as the
+ SASL mechanism.<footnote>
+ <para>Please refer to the Java security documentation for a complete understanding
+ of the above properties.</para>
+ </footnote></title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>javax.security.auth.useSubjectCredsOnly</entry>
+ <entry>boolean</entry>
+ <entry>true</entry>
+ <entry><para>If set to 'false', forces the SASL GASSPI client to obtain the
+ kerberos credentials explicitly instead of obtaining from the "subject"
+ that owns the current thread.</para></entry>
+ </row>
+
+ <row>
+ <entry>java.security.auth.login.config</entry>
+ <entry>string</entry>
+ <entry/>
+ <entry><para>Specifies the jass configuration
+ file.</para><para><varname>Ex-Djava.security.auth.login.config=myjas.conf</varname>
+ </para><para>Here is the sample myjas.conf JASS configuration file: <programlisting><![CDATA[
+
+ com.sun.security.jgss.initiate {
+ com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
+ };
+
+ ]]></programlisting></para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ -->
+ <table pgwide="1">
+ <title>Config Options For Security - Using SSL for securing connections or using EXTERNAL as
+ the SASL mechanism.</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.ssl_timeout</entry>
+ <entry>long</entry>
+ <entry>60000</entry>
+ <entry><para>Timeout value used by the Java SSL engine when waiting on
+ operations.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.ssl.KeyManagerFactory.algorithm</entry>
+ <entry>string</entry>
+ <entry>-</entry>
+ <entry>
+ <para>The key manager factory algorithm name. If not set, defaults to the
+ value returned from the Java runtime call
+ <literal>KeyManagerFactory.getDefaultAlgorithm()</literal></para>
+ <para>For compatibility with older clients, the synonym
+ <varname>qpid.ssl.keyStoreCertType</varname> is supported.</para>
+ </entry>
+ </row>
+
+ <row>
+ <entry>qpid.ssl.TrustManagerFactory.algorithm</entry>
+ <entry>string</entry>
+ <entry>-</entry>
+ <entry>
+ <para>The trust manager factory algorithm name. If not set, defaults to the
+ value returned from the Java runtime call
+ <literal>TrustManagerFactory.getDefaultAlgorithm()</literal></para>
+ <para>For compatibility with older clients, the synonym
+ <varname>qpid.ssl.trustStoreCertType</varname> is supported.</para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table pgwide="1">
+ <title>Config Options For Security - Standard JVM properties needed when Using SSL for
+ securing connections or using EXTERNAL as the SASL mechanism.<footnote>
+ <para>Qpid allows you to have per connection key and trust stores if required. If
+ specified per connection, the JVM arguments are ignored.</para>
+ </footnote></title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>javax.net.ssl.keyStore</entry>
+ <entry>string</entry>
+ <entry>jvm default</entry>
+ <entry><para>Specifies the key store path.</para><para>This can also be set per
+ connection using the <link linkend="JMS-Client-0-8-Connection-URL"
+ >Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>javax.net.ssl.keyStorePassword</entry>
+ <entry>string</entry>
+ <entry>jvm default</entry>
+ <entry><para>Specifies the key store password.</para><para>This can also be set
+ per connection using the <link linkend="JMS-Client-0-8-Connection-URL"
+ >Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>javax.net.ssl.trustStore</entry>
+ <entry>string</entry>
+ <entry>jvm default</entry>
+ <entry><para>Specifies the trust store path.</para><para>This can also be set
+ per connection using the <link linkend="JMS-Client-0-8-Connection-URL"
+ >Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>javax.net.ssl.trustStorePassword</entry>
+ <entry>string</entry>
+ <entry>jvm default</entry>
+ <entry><para>Specifies the trust store password.</para><para>This can also be
+ set per connection using the <link
+ linkend="JMS-Client-0-8-Connection-URL">Connection URL</link>
+ options.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/JMS-Client-Understanding.xml b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Understanding.xml
new file mode 100644
index 0000000000..6eae389563
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/JMS-Client-Understanding.xml
@@ -0,0 +1,526 @@
+<?xml version="1.0"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
+[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
+<!--
+
+ 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.
+
+-->
+
+<chapter id="JMS-Client-0-8-Client-Understanding">
+ <title>Understanding the Qpid JMS client</title>
+ <section id="JMS-Client-0-8-Client-Understanding-Overview">
+ <title>Overview</title>
+ <para>The Qpid JMS client provides a JMS 1.1 compliant implementation. As such, the primary
+ source of documentation is the <ulink url="&oracleJmsSpec;">JMS specification</ulink> and the
+ <ulink url="&oracleJeeDocUrl;/javax/jms/package-summary.html">JMS javadocs</ulink>. This
+ documentation assumes the reader has familiarity with these resources.</para>
+ <para>The remainder of this section describes how the Qpid JMS client behaves and the effect(s)
+ making JMS method calls will have on the Broker. </para>
+ <para>There areas where the Qpid JMS client provides features beyond those required for JMS
+ compliance. These are described in the sections that follow.</para>
+ <para>These sections are also used to bring out differences that may surprise those moving from
+ JMS implementations provided by other vendors.</para>
+ <figure>
+ <title>Architecture of a typical JMS application</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/QpidJmsOverview.png" format="PNG" scalefit="1"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-ConnectionFactory">
+ <title>ConnectionFactory</title>
+ <para>A <ulink url="&oracleJeeDocUrl;javax/jms/ConnectionFactory.html">ConnectionFactory</ulink>
+ allows an application to create a <ulink url="&oracleJeeDocUrl;javax/jms/Connection.html"
+ >Connection</ulink>.</para>
+ <para>The application obtains the ConnectionFactory from an <ulink
+ url="&oracleJdkDocUrl;javax/naming/InitialContext.html">InitialContext</ulink>. The
+ InitialContext is itself obtained from an InitialContextFactory. </para>
+ <para>The Qpid JMS client provides a single implementation of the InitialContextFactory in class
+ <literal>org.apache.qpid.jndi.PropertiesFileInitialContextFactory</literal>. This
+ implementation is backed by a <ulink url="&oracleJdkDocUrl;java/util/Properties.html"
+ >Properties</ulink> object which can of course be loaded from an external properties file,
+ or created programatically.</para>
+ <para>The examples in the previous chapter illustrated the Java code required to <link
+ linkend="JMS-Client-0-8-Examples-PTP">create the InitialContext</link> and an <link
+ linkend="JMS-Client-0-8-Examples-PTP-PropertiesFile">example properties file</link>.</para>
+ <para>Note that the Qpid Broker does not present a JNDI interface to the application.</para>
+ <figure>
+ <title>JNDI overview</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/JndiOverview.png" format="PNG" scalefit="1"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-Connection">
+ <title>Connection</title>
+ <para>A Connection represents an open communication channel between application and
+ Broker.</para>
+ <para>Connections are created from the ConnectionFactory <footnote>
+ <para>Constructors of the AMQConnection class must not be used.</para>
+ </footnote>.</para>
+ <para>Each connection utilises a single TCP/IP connection between the process of the application
+ and the process of the Broker. The act of establishing a connection is therefore a relatively
+ expensive operation. It is recommended that the same connection is used for a series of
+ message interactions. Patterns utilising a connection per message should not be used. </para>
+ <para>The underlying TCP/IP connection remains open for the lifetime of the JMS connection. It
+ is closed when the application calls <ulink
+ url="&oracleJeeDocUrl;javax/jms/Connection.html#close()">Connection#close()</ulink>, but it
+ can also be closed if the connection is closed from the Broker side (via a Management
+ operation or broker shutdown or running into coditions which AMQP specifications treats as errors and mandates closing the connection).
+ The JMS connection will also be closed if the underlying TCP/IP connection is broken.</para>
+ <para>Qpid connections have failover and heartbeating capabilities. They support SSL and
+ client-auth. These are described in the sub-sections that follow.</para>
+ <section id="JMS-Client-0-8-Client-Understanding-Connection-Failover">
+ <title>Failover</title>
+ <para>Qpid connections support a failover feature. This is the ability to automatically
+ re-establish a failed connection, either to the same Broker, or the next Broker in the
+ broker list.</para>
+ <para>This failover process is done in a manner that is mostly transparent to the application.
+ After a successful failover, any existing Connection, Session, MessageConsumer and
+ MessageProducer objects held by the application remain valid.</para>
+ <para>If a failover occurs during the scope of a JMS Transaction, any work performed by that
+ transaction is lost. The application is made aware of this loss by way of the <ulink
+ url="&oracleJeeDocUrl;javax/jms/TransactionRolledBackException.html"
+ >TransactionRolledBackException</ulink> from the <ulink
+ url="&oracleJeeDocUrl;javax/jms/Session.html#commit">Session#commit()</ulink> call.
+ Applications utilising failover must be prepared to catch this exception and respond by
+ either repeating the work of the transaction, or by propagating a rollback to the
+ originating system.</para>
+ <para>If, after all retries are exhausted, failover has failed to reconnect the application,
+ the Connection's <ulink url="&oracleJeeDocUrl;javax/jms/ExceptionListener.html"
+ >ExceptionListener</ulink> will receive a JMSException with a linked exception of <ulink
+ url="JMS-Client-0-8-Appendix-Exceptions-AMQDisconnectedException"
+ >AMQDisconnectedException</ulink>. Any further use of the JMS objects (Connection, Session
+ etc), will results in a <ulink url="&oracleJeeDocUrl;javax/jms/IllegalStateException.html"
+ >IllegalStateException</ulink>.</para>
+ <para>Configure failover using the Connection URL. Here's an example Connection URL utilising
+ failover between two brokers. Note the use of the broker options <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-Retries"
+ ><literal>retries</literal></link> and <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-ConnectDelay"
+ ><literal>connectdelay</literal></link> to control the number of connection attempts to
+ each individual broker, and the delay between each connection attempt. Also note the use of
+ the <emphasis>failover option</emphasis>
+ <literal>cyclecount</literal> to control the number of times the failover mechanism will
+ traverse the brokerlist.</para>
+ <example>
+ <title>Connection URL configured for failover</title>
+ <screen><![CDATA[
+amqp://username:password@clientid/test
+ ?brokerlist='tcp://localhost:15672?retries='10'&connectdelay='1000';tcp://localhost:25672?retries='10'&connectdelay='1000''
+ &failover='roundrobin?cyclecount='20'']]>
+ </screen>
+ </example>
+ <para>For full details see <xref linkend="JMS-Client-0-8-Connection-URL"/></para>
+ <note><para>Note, that a single broker failover is enabled by default. If the failover behaviour is not desired it can be switched off
+ by setting a failover option to <emphasis>nofailover</emphasis> as in the example below
+ <example>
+ <title>Connection URL configured with nofailover</title>
+ <screen><![CDATA[
+amqp://username:password@clientid/test
+ ?brokerlist='tcp://localhost:15672?failover='nofailover']]>
+ </screen>
+ </example>
+ </para></note>
+ <!-- TODO perhaps mention ConnectionListener?-->
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-Connection-Heartbeating">
+ <title>Heartbeating</title>
+ <para>Qpid connections support heartbeating. When enabled, the Qpid JMS client and Broker
+ exchange a heartbeat during periods of inactivity. This allows both peers to discover if the
+ TCP/IP connection becomes inoperable in a timely manner.</para>
+ <para>This feature is sometimes useful in applications that must traverse firewalls as the
+ heartbeat prevents connections from being closed during periods when there is no application
+ traffic.</para>
+ <para>It is also allows the both the JMS client and the Broker to confirm that the other is
+ <emphasis>minimally</emphasis> responsive. (It does nothing however to determine the
+ health of the higher level tiers of application, for this reason, applications may implement
+ an application level heartbeat either in addition to, or instead of the heartbeat.</para>
+ <para>If the client ever fails to receive two consecutive heartbeats, the Connection will be
+ automatically closed and the Connection's <ulink
+ url="&oracleJeeDocUrl;javax/jms/ExceptionListener.html">ExceptionListener</ulink> will
+ receive a JMSException with a linked exception of AMQDisconnectedException. Any further use
+ of the JMS objects (Connection, Session etc), will results in a <ulink
+ url="&oracleJeeDocUrl;javax/jms/IllegalStateException.html"
+ >IllegalStateException</ulink>.</para>
+ <para>To enable heartbeating either use a Connection URL including the broker option <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-Heartbeat"
+ ><literal>heartbeat</literal></link>, or use the system property <link
+ linkend="JMS-Client-0-8-System-Properties-Heartbeat"
+ ><literal>qpid.heartbeat</literal></link>. </para>
+ <example>
+ <title>Connection URL configured for heartbeating</title>
+ <screen><![CDATA[
+amqp://guest:guest@clientid/?brokerlist='localhost:5672?heartbeat='5'']]>
+ </screen>
+ </example>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-Connection-SSL">
+ <title>SSL</title>
+ <para>The Qpid JMS client supports connections encrypted using Secure Socket Layer (SSL) and
+ SSL-Client Authentication. SSL is configured using Connection URL. To use SSL, SSL must be
+ be configured on the Broker.</para>
+ <para>Some example Connection URLs using SSL follow:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Simple SSL when the Broker is secured by a certificate that is signed by a CA which
+ is trusted by the JVM.</para>
+ <example>
+ <title>Connection URL configured for SSL - CA trusted by JVM</title>
+ <screen><![CDATA[
+amqp://guest:guest@clientid/?brokerlist='localhost:5671'&ssl='true']]>
+ </screen>
+ </example>
+ </listitem>
+ <listitem>
+ <para>SSL when the Broker is secured by a certificate that is signed by a CA which is NOT
+ trusted by the JVM (such as when a organisation is using a private CA, or self-signed
+ certificates are in use). For this case, we use <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-TrustStore"
+ ><literal>trust_store</literal></link> and <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-TrustStorePassword"
+ ><literal>trust_store_password</literal></link> to specify a path a truststore file
+ (containing the certificate of the private-CA) and the truststore password.</para>
+ <example>
+ <title>Connection URL configured for SSL - CA not trusted by JVM</title>
+ <screen><![CDATA[
+amqp://guest:guest@clientid/?brokerlist='localhost:5671?trust_store='/path/to/acme_org_ca.ts'&trust_store_password='secret''&ssl='true']]>
+ </screen>
+ </example>
+ </listitem>
+ <listitem>
+ <para>SSL with SSL client-auth. For this case, we use <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-KeyStore"
+ ><literal>key_store</literal></link> and <link
+ linkend="JMS-Client-0-8-Connection-URL-BrokerOptions-KeyStorePassword"
+ ><literal>key_store_password</literal></link> to specify a path a keystore file
+ (containing the certificate of the client) and the keystore password.</para>
+ <example>
+ <title>Connection URL configured for SSL - SSL client-auth</title>
+ <screen><![CDATA[
+amqp://guest:guest@clientid/?brokerlist='localhost:5671?trust_store='/path/to/app1_client_cert.ks'&key_store_password='secret''&ssl='true']]>
+ </screen>
+ </example>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-Session">
+ <title>Session</title>
+ <para>A Session object is a single-threaded context for producing and consuming messages.</para>
+ <para>Session objects are created from the Connection. Whilst Session objects are relatively
+ lightweight, patterns utilising a single Session per message are not recommended.</para>
+ <para>The number of sessions open per connection at any one time is limited. This value is
+ negotiated when the connection is made. It defaults to 256.</para>
+ <para>Qpid JMS Sessions have the ability to prefetch messages to improve consumer performance.
+ This feature is described next.</para>
+ <section id="JMS-Client-0-8-Client-Understanding-Session-Prefecth">
+ <title>Prefetch</title>
+ <para>Prefetch specifies how many messages the client will optimistically cache for delivery
+ to a consumer. This is a useful parameter to tune that can improve the throughput of an
+ application. The prefetch buffer is scoped per <emphasis>Session</emphasis>.</para>
+ <para>The size of the prefetch buffer can be tuned per Connection using the connection url
+ option <link linkend="JMS-Client-0-8-Connection-URL-ConnectionOptions-Maxprefetch"
+ ><literal>maxprefetch</literal></link> (or JVM wide using the system property <link
+ linkend="JMS-Client-0-8-System-Properties-Maxprefetch"
+ ><literal>max_prefetch</literal></link>). By default, prefetch defaults to 500.</para>
+ <para>There are situations when you may wish to consider reducing the size of prefetch:</para>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>When using a <ulink url="http://www.eaipatterns.com/CompetingConsumers.html"
+ >Competing Consumers</ulink> pattern, prefetch can give the appearance of unequal
+ division of work. This will be apparent on startup when the queue has messages. The
+ first consumer started will cache prefetch size number of messages, possibly leaving
+ the other consumers with no initial work.</para>
+ </listitem>
+ <listitem>
+ <para>When using special queue types (such as LVQs, Sorted Queue and Priority Queues).
+ For these queue types the special delivery rules apply whilst the message resides on
+ the Broker. As soon as the message is sent to the client it delivery order is then
+ fixed. For example, if using a priority queue, and a prefetch of 100, and 100 messages
+ arrive with priority 2, the broker will send these to the client. If then a new
+ message arrives with priority 1, the broker cannot leap frog messages of the lower
+ priority. The priority 1 message will be delivered at the front of the next
+ batch.</para>
+ </listitem>
+ <listitem>
+ <para>When message size is large and you do not wish the memory footprint of the
+ application to grow (or suffer an OutOfMemoryError).</para>
+ </listitem>
+ </orderedlist>
+ </para>
+ <para>Finally, if using multiple MessageConsumers on a single Session, keep in mind that
+ unless you keep polling <emphasis>all</emphasis> consumers, it is possible for some traffic
+ patterns to result in consumer starvation and an application level deadlock. For example, if
+ prefetch is 100, and 100 hundred messages arrive suitable for consumer A, those messages
+ will be prefetched by the session, entirely filling the prefetch buffer. Now if the
+ application performs a blocking <ulink
+ url="&oracleJeeDocUrl;javax/jms/MessageConsumer.html#receive()"
+ >MessageConsumer#receive()</ulink> for Consumer B on the same Session, the application
+ will hang indefinitely as even if messages suitable for B arrive at the Broker. Those
+ messages can never be sent to the Session as no space is available in prefetch. </para>
+ <note><para>Please note, when the acknowlegement mode <emphasis>Session#SESSION_TRANSACTED</emphasis>
+ or <emphasis>Session#CLIENT_ACKNOWLEDGE</emphasis> is set on a consuming session,
+ the prefetched messages are released from the prefetch buffer on transaction commit/rollback
+ (in case of acknowledgement mode <emphasis>Session#SESSION_TRANSACTED</emphasis> )
+ or acknowledgement of the messages receipt (in case of acknowledgement mode
+ <emphasis>Session#CLIENT_ACKNOWLEDGE</emphasis> ). If the consuming application does not commit/rollback
+ the receiving transaction (for example, due to mistakes in application exception handling logic),
+ the prefetched messages continue to remain in the prefetch buffer preventing the delivery of the following messages.
+ As result, the application might stop the receiving of the messages
+ until the transaction is committed/rolled back (for <emphasis>Session#SESSION_TRANSACTED</emphasis> )
+ or received messages are acknowledged (for <emphasis>Session#CLIENT_ACKNOWLEDGE</emphasis>).</para></note>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-Session-TemporaryQueues">
+ <title>TemporaryQueues</title>
+ <para>Qpid implements JMS temporary queues as AMQP auto-delete queues. The life cycle of these
+ queues deviates from the JMS specification.</para>
+ <para>AMQP auto-delete queues are deleted either when the <emphasis>last</emphasis> Consumer
+ closes, or the Connection is closed. If no Consumer is ever attached to the queue, the queue
+ will remain until the Connection is closed.</para>
+ <para>This deviation has no practical impact on the implementation of the <ulink
+ url="http://www.eaipatterns.com/RequestReply.html">request/reply messaging pattern</ulink>
+ utilising a per-request temporary reply queue. The reply to queue is deleted as the
+ application closes the Consumer awaiting the response. </para>
+ <para>Temporary queues are exposed to Management in the same way as normal queues. Temporary
+ queue names take the form string <literal>TempQueue</literal> followed by a random
+ UUID.</para>
+ <para>Note that <ulink url="&oracleJeeDocUrl;javax/jms/TemporaryQueue.html#delete()"
+ >TemporaryQueue#delete()</ulink> merely marks the queue as deleted on within the JMS
+ client (and prevents further use of the queue from the application), however, the Queue will
+ remain on the Broker until the Consumer (or Connection) is closed.</para>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-Session-CreateQueue">
+ <title>CreateQueue</title>
+ <para>In the Qpid JMS client, <ulink
+ url="&oracleJeeDocUrl;javax/jms/Session.html#createQueue(java.lang.String)"
+ >Session#createQueue()</ulink> accepts either a queue name, or a Binding URL. If only name
+ is specified the destination will be resolved into binding URL:
+ direct://amq.direct//&lt;queue name&gt;?routingkey=’&lt;queue name&gt;’&amp;durable=’true’. </para>
+ <para>Calling Session#createQueue() has no effect on the Broker.</para>
+ <para>Reiterating the advice from the JMS javadoc, it is suggested that this method is not
+ generally used. Instead, application should lookup Destinations declared within JNDI.</para>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-Session-CreateTopic">
+ <title>CreateTopic</title>
+ <para>In the Qpid JMS client, <ulink
+ url="&oracleJeeDocUrl;javax/jms/Session.html#createTopic(java.lang.String)"
+ >Session#createTopic()</ulink> accepts either a topic name, or a Binding URL. If only name
+ is specified the destination will be resolved into binding URL: topic://amq.topic//&lt;topic
+ name&gt;?routingkey=’&lt;topic name&gt;’.</para>
+ <para>Calling Session#createTopic() has no effect on the Broker.</para>
+ <para>Reiterating the advice from the JMS javadoc, it is suggested that this method is not
+ generally used. Instead, application should lookup Destinations declared within JNDI.</para>
+ </section>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageProducer">
+ <title>MessageProducer</title>
+ <para>A MessageProducer sends a message an <emphasis>Exchange</emphasis>. It is the Exchange
+ (within the Broker) that routes the message to zero or more queue(s). Routing is performed
+ according to rules expressed as <emphasis>bindings</emphasis> between the exchange and queues
+ and a <emphasis>routing key</emphasis> included with each message.</para>
+ <para>To understand how this mechanism is used to deliver messages to queues and topics, see
+ <ulink url="&qpidJavaBrokerBook;Java-Broker-Concepts-Exchanges.html">Exchanges</ulink>
+ within the Java Broker book.</para>
+ <para>It is important to understand that when not used on a transactional session, <ulink
+ url="&oracleJeeDocUrl;javax/jms/MessageProducer.html#send(javax.jms.Message)"
+ >MessageProducer#send()</ulink> is <emphasis>asynchronous</emphasis> in nature. When #send()
+ returns to the application, the application cannot be certain if the Broker has received the
+ message. The Qpid JMS client may not have yet started to send the message, the message could
+ residing in a TCP/IP buffer, or the messages could be in some intermediate buffer within the
+ Broker. If the application requires certainty the message has been received by the Broker, a
+ <ulink url="&oracleJeeDocUrl;javax/jms/Session.html#SESSION_TRANSACTED">transactional
+ session</ulink>
+ <emphasis>must</emphasis> be used.</para>
+ <para>Qpid JMS MessageProducers have a number of features above that required by JMS. These are
+ described in the sub-sections that follow.</para>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageProducer-MandatoryMessage">
+ <title>Mandatory Messages</title>
+ <para>With this feature, publishing a message with a routing key for which no binding exists
+ on the exchange will result in the message being returned to the publisher's
+ connection.</para>
+ <para>The Message is returned to the application in an asynchronous fashion via the
+ Connection's <ulink url="&oracleJeeDocUrl;javax/jms/ExceptionListener.html"
+ >ExceptionListener</ulink>. When a message is returned, it will be invoked with a
+ JMSException whose linked exception is an <ulink
+ url="JMS-Client-0-8-Appendix-Exceptions-AMQNoRouteException">AMQNoRouteException</ulink>.
+ The returned message is available to the application by calling
+ AMQNoRouteException#getUndeliveredMessage(). The ExceptionListener will be invoked exactly
+ once for each returned message.</para>
+ <para>The mandatory message feature is turned <emphasis>on</emphasis> by default for Queue
+ destinations and <emphasis>off</emphasis> for Topic destinations. This can be overridden
+ using system properties <link linkend="JMS-Client-0-8-System-Properties-DefaultMandatory"
+ ><literal>qpid.default_mandatory</literal></link> and <link
+ linkend="JMS-Client-0-8-System-Properties-DefaultMandatoryTopic"
+ ><literal>qpid.default_mandatory_topic</literal></link> for Queues and Topics
+ respectively.</para>
+ <note><para>Please note, according to AMQP specifications the mandatory flag on a message tells the server
+ how to react if the message cannot be routed to a queue. If this flag is set, the server will return an unroutable message with a
+ Return method. If this flag is zero, the server silently drops the message. Please, refer <ulink url="&amqpSrc;">AMQP specifications</ulink>
+ for more details.</para></note>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageProducer-CloseWhenNoRoute">
+ <title>Close When No Route</title>
+ <para>With this feature, if a mandatory message is published with a routing key for which no
+ binding exists on the exchange the Broker will close the connection. This client feature
+ requires support for the corresponding feature by the Broker.</para>
+ <para>To enable or disable from the client, use the Connection URL option <link
+ linkend="JMS-Client-0-8-Connection-URL-ConnectionOptions-CloseWhenNoRoute"
+ ><literal>closeWhenNoRoute</literal></link>.</para>
+ <para>See <ulink url="&qpidJavaBrokerBook;Java-Broker-Close-Connection-When-No-Route.html">
+ Closing client connections on unroutable mandatory messages</ulink> within the Java Broker
+ book for full details of the functioning of this feature.</para>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageProducer-ImmediateMessage">
+ <title>Immediate Messages</title>
+ <para>This feature is defined in <ulink url="&amqpSrc;">AMQP specifications</ulink>.</para>
+ <para>When this feature is enabled, when publishing a message the Broker ensures that a
+ Consumer is attached to queue. If there is no Consumer attached to the queue, the message is
+ returned to the publisher's connection. The Message is returned to the application in an
+ asynchronous fashion using the Connection's <ulink
+ url="&oracleJeeDocUrl;javax/jms/ExceptionListener.html">ExceptionListener</ulink>.</para>
+ <para>The ExceptionListener will be invoked with a JMSException whose linked exception is an
+ <ulink url="JMS-Client-0-8-Appendix-Exceptions-AMQNoConsumersException"
+ >AMQNoConsumersException</ulink>. The returned message is available to the application by
+ calling AMQNoConsumersException#getUndeliveredMessage(). The ExceptionListener will be
+ invoked exactly once for each returned message.</para>
+ <para>The immediate message feature is turned <emphasis>off</emphasis> by default. It can be
+ enabled with system property <link
+ linkend="JMS-Client-0-8-System-Properties-DefaultImmediate"
+ ><literal>qpid.default_immediate</literal></link>.</para>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageProducer-FlowControl">
+ <title>Flow Control</title>
+ <para>With this feature, if a message is sent to a queue that is overflow, the producer's
+ session is blocked until the queue becomes underfull, or a timeout expires. This client
+ feature requires support for the corresponding feature by the Broker.</para>
+ <para>To control the timeout use System property <link
+ linkend="JMS-Client-0-8-System-Properties-FlowControlWaitFailure"
+ ><literal>qpid.flow_control_wait_failure</literal></link>. To control the frequency with
+ which warnings are logged whilst a Session is blocked, use System property <link
+ linkend="JMS-Client-0-8-System-Properties-FlowControlWaitNotifyPeriod"
+ ><literal>qpid.flow_control_wait_notify_period</literal></link></para>
+ <para>See <ulink
+ url="&qpidJavaBrokerBook;Java-Broker-Runtime-Disk-Space-Management.html#Qpid-Producer-Flow-Control"
+ > Producer Flow Control</ulink> within the Java Broker book for full details of the
+ functioning of this feature.</para>
+ </section>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageConsumer">
+ <title>MessageConsumer</title>
+ <para>A MessageConsumer receives messages from a Queue or Topic.</para>
+ <para>MessageConsumer objects are created from the Session.</para>
+ <para>Qpid JMS MessageConsumers have a number of features above that required by JMS. These are
+ described in the sub-sections that follow.</para>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageConsumer-ConsumerSideEffect">
+ <title>Consumers have Exchange/Queue Declaration and Binding Side Effect</title>
+ <para>By default, calling <ulink
+ url="&oracleJeeDocUrl;javax/jms/Session.html#createConsumer(javax.jms.Destination)"
+ >Session#createConsumer()</ulink> will cause:</para>
+ <orderedlist>
+ <listitem>
+ <para>If the exchange does not exist on the Broker, it will be created. The exchange is
+ specified by the Binding URL associated with the Destination.</para>
+ </listitem>
+ <listitem>
+ <para>If the queue does not exist on the Broker, it will be created. The queue is
+ specified by the Binding URL associated with the Destination.</para>
+ </listitem>
+ <listitem>
+ <para>If there is no binding between the exchange and queue, a binding will be created
+ using the routingkey as a bindingkey. The exchange, queue and routing key are specified
+ by the Binding URL associated with the Destination.</para>
+ </listitem>
+ </orderedlist>
+ <para>The exchange and queue declare side effect can be suppressed using system properties
+ <link linkend="JMS-Client-0-8-System-Properties-DeclareExchanges"
+ ><literal>qpid.declare_exchanges</literal></link> and <link
+ linkend="JMS-Client-0-8-System-Properties-DeclareQueues"
+ ><literal>qpid.declare_queues</literal></link>.</para>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageConsumer-TopicSubscriptions">
+ <title>Topic Subscriptions</title>
+ <para>The Qpid JMS client implements each subscription to a Topic as separate queue on the
+ Broker. From the perspective of the JMS application this implementational detail is
+ irrelevant: the application never needs to directly address these queues. However, these
+ details are important when considering Management and Operational concerns.</para>
+ <para>Durable topic subscriptions use a <emphasis>durable</emphasis> and
+ <emphasis>exclusive</emphasis> queue named as follows:</para>
+ <programlisting>
+ clientid: + subscriptionId
+ </programlisting>
+ <para>where <literal>subscriptionId</literal> is that passed to the <ulink
+ url="&oracleJeeDocUrl;javax/jms/Session.html#createDurableSubscriber(javax.jms.Topic,%20java.lang.String)"
+ >Session#createDurableSubscriber(javax.jms.Topic,java.lang.String)</ulink></para>
+ <para>Calling <ulink
+ url="&oracleJeeDocUrl;javax/jms/Session.html#unsubscribe(java.lang.String)"
+ >Session#unsubscribe(java.lang.String)</ulink> deletes the underlying queue.</para>
+ <para>Non-durable topic subscriptions use a <emphasis>non-durable</emphasis>,
+ <emphasis>exclusive</emphasis> and <emphasis>auto-delete</emphasis> queue named as
+ follows:</para>
+ <programlisting>
+ tmp + _ + ip + _ + port + _ + sequence
+ </programlisting>
+ <para>where <literal>ip</literal> is the ip address of the client with dots replaced by
+ underscores, <literal>port</literal> is the ephemeral port number assigned to the client's
+ connection, and <literal>sequence</literal> is a sequence number.</para>
+ <para>Closing the consumer (or closing the connection) will delete the underlying
+ queue.</para>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-MessageConsumer-MaximumDeliveryCount">
+ <title>Maximum Delivery Count</title>
+ <para>With this feature, the Broker keeps track of a number of times a message has been
+ delivered to a consumer. If the count ever exceeds a threshold value, the Broker moves the
+ message to a dead letter queue (DLQ). This is used to prevent poison messages preventing a
+ system's operation. This client feature requires support for the corresponding feature by
+ the Broker.</para>
+ <para>When using this feature, the application must either set system property <link
+ linkend="JMS-Client-0-8-System-Properties-RejectBehaviour">qpid.reject.behaviour</link> or
+ the Binding URL option <link linkend="JMS-Client-0-8-Binding-URL-Options-RejectBehaviour"
+ ><literal>rejectbehaviour</literal></link> to the value
+ <literal>server</literal>.</para>
+ <para>See <ulink
+ url="&qpidJavaBrokerBook;Java-Broker-Runtime-Handling-Undeliverable-Messages.html#Java-Broker-Runtime-Handling-Undeliverable-Messages-Maximum-Delivery-Count"
+ > Handling Undeliverable Messages</ulink> within the Java Broker book for full details of
+ the functioning of this feature.</para>
+ <note><para>The optional JMS message header <literal>JMSXDeliveryCount</literal> is <emphasis>not</emphasis>
+ supported.</para></note>
+ </section>
+ </section>
+ <section id="JMS-Client-0-8-Client-Understanding-Destinations">
+ <title>Destinations</title>
+ <para>A Destination is either a Queue or Topic. In the Qpid JMS client a Destination
+ encapsulates a Binding URL. In simple terms, the Binding URL comprises of an exchange, queue
+ and a routing key. Binding URLs are described fully by <xref
+ linkend="JMS-Client-0-8-Binding-URL"/>. </para>
+ <para>In many cases, applications do not need to deal directly with Binding URLs, instead they
+ can refer to JMS administered objects declared in the JNDI properties file with the
+ <literal>queue.</literal> and <literal>topic.</literal> prefix to create Queues and Topics
+ objects respectively. </para>
+ </section>
+</chapter>
diff --git a/qpid/doc/book/src/jms-client-0-8/Makefile b/qpid/doc/book/src/jms-client-0-8/Makefile
new file mode 100644
index 0000000000..ccb9d29f2f
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/Makefile
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+
+include ../Makefile.inc
diff --git a/qpid/doc/book/src/jms-client-0-8/commonEntities.xml b/qpid/doc/book/src/jms-client-0-8/commonEntities.xml
new file mode 100644
index 0000000000..64158f0e51
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/commonEntities.xml
@@ -0,0 +1,47 @@
+<!--
+
+ 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.
+
+-->
+
+<!ENTITY qpidVersion "0.26">
+<!ENTITY qpidDownloadUrlDesc "the Apache Qpid project web site">
+<!ENTITY qpidDownloadUrl "http://qpid.apache.org/download.html">
+
+<!ENTITY qpidMavenRepoDesc "Maven repositories">
+<!ENTITY qpidClientGroupId "org.apache.qpid">
+<!ENTITY qpidClientArtefactId "qpid-client">
+
+
+<!ENTITY qpidProgrammingBook "../../Programming-In-Apache-Qpid/html/">
+<!ENTITY qpidJavaBrokerBook "../../AMQP-Messaging-Broker-Java-Book/html/">
+<!ENTITY qpidSrc "http://svn.apache.org/viewvc/qpid/trunk/qpid/java/">
+
+<!ENTITY amqpSrc "http://www.amqp.org">
+
+<!-- Oracle javadoc -->
+
+<!ENTITY oracleJmsSpec "http://download.oracle.com/otndocs/jcp/7195-jms-1.1-fr-spec-oth-JSpec/">
+<!ENTITY oracleJdkDocUrl "http://docs.oracle.com/javase/6/docs/api/">
+<!ENTITY oracleJeeDocUrl "http://docs.oracle.com/javaee/6/api/">
+<!ENTITY oracleJmsTutorial "http://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html">
+
+
+
+
+
diff --git a/qpid/doc/book/src/jms-client-0-8/images/JndiOverview.png b/qpid/doc/book/src/jms-client-0-8/images/JndiOverview.png
new file mode 100644
index 0000000000..82f6efd0ef
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/images/JndiOverview.png
Binary files differ
diff --git a/qpid/doc/book/src/jms-client-0-8/images/JndiOverview.svg b/qpid/doc/book/src/jms-client-0-8/images/JndiOverview.svg
new file mode 100644
index 0000000000..a8d1f05552
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/images/JndiOverview.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+
+ 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.
+
+-->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="61 27 572 361" width="572pt" height="361pt" xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata> Produced by OmniGraffle 6.0.3 <dc:date>2013-12-29 17:48Z</dc:date></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="1.308"/><feOffset in="blur" result="offset" dx="0" dy="2"/><feFlood flood-color="black" flood-opacity=".5" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><linearGradient x1="0" x2="1" id="Gradient" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#6383ab"/><stop offset="1" stop-color="white"/></linearGradient><linearGradient id="Obj_Gradient" xl:href="#Gradient" gradientTransform="translate(137 97) rotate(90) scale(78)"/><font-face font-family="Helvetica" font-size="12" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face><linearGradient x1="0" x2="1" id="Gradient_2" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#62a073"/><stop offset="1" stop-color="white"/></linearGradient><linearGradient id="Obj_Gradient_2" xl:href="#Gradient_2" gradientTransform="translate(552 71) rotate(90) scale(250)"/><font-face font-family="Helvetica" font-size="12" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="522.94922" cap-height="717.28516" ascent="770.01953" descent="-229.98047" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><linearGradient x1="0" x2="1" id="Gradient_3" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#baa6ff"/><stop offset="1" stop-color="#624aba"/></linearGradient><linearGradient id="Obj_Gradient_3" xl:href="#Gradient_3" gradientTransform="translate(344.1991 155.44433) rotate(101.76829) scale(21.564619)"/><linearGradient x1="0" x2="1" id="Gradient_4" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff6"/><stop offset="1" stop-color="#fc6"/></linearGradient><linearGradient id="Obj_Gradient_4" xl:href="#Gradient_4" gradientTransform="translate(149.57673 206.53541) rotate(180) scale(25.153465)"/><font-face font-family="Monaco" font-size="8" units-per-em="1000" underline-position="-37.597656" underline-thickness="75.683594" slope="0" x-height="560.54688" cap-height="780.27344" ascent="1e3" descent="-250" font-weight="500"><font-face-src><font-face-name name="Monaco"/></font-face-src></font-face><font-face font-family="Monaco" font-size="7" units-per-em="1000" underline-position="-37.597656" underline-thickness="75.683594" slope="0" x-height="560.54688" cap-height="780.27344" ascent="1e3" descent="-250" font-weight="500"><font-face-src><font-face-name name="Monaco"/></font-face-src></font-face><linearGradient id="Obj_Gradient_5" xl:href="#Gradient_4" gradientTransform="translate(209.73909 266.2009) rotate(99.75359) scale(20.210732)"/><font-face font-family="Helvetica Neue" font-size="12" panose-1="2 0 5 3 0 0 0 9 0 4" units-per-em="1000" underline-position="-100" underline-thickness="50" slope="-1e3" x-height="517" cap-height="714" ascent="957.00194" descent="-213.00043" font-style="italic" font-weight="500"><font-face-src><font-face-name name="HelveticaNeue-Italic"/></font-face-src></font-face><font-face font-family="Helvetica Neue" font-size="12" panose-1="2 0 8 3 0 0 0 9 0 4" units-per-em="1000" underline-position="-100" underline-thickness="50" slope="0" x-height="517" cap-height="714" ascent="975.002" descent="-217.00044" font-weight="bold"><font-face-src><font-face-name name="HelveticaNeue-Bold"/></font-face-src></font-face><font-face font-family="Helvetica Neue" font-size="11" panose-1="2 0 5 3 0 0 0 2 0 4" units-per-em="1000" underline-position="-100" underline-thickness="50" slope="0" x-height="517" cap-height="714" ascent="952.00193" descent="-213.00043" font-weight="500"><font-face-src><font-face-name name="HelveticaNeue"/></font-face-src></font-face><linearGradient id="Obj_Gradient_6" xl:href="#Gradient_4" gradientTransform="translate(220.71163 202) rotate(140.077054) scale(25.153465)"/></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>JNDI overview</title><rect fill="white" width="960" height="1172"/><g><title>Layer 1</title><g><xl:use xl:href="#id26_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id570_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id10_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id594_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id19_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id599_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id600_Graphic" filter="url(#Shadow)"/></g><line x1="443.50465" y1="38.532298" x2="437.70354" y2="370.8774" fill="white"/><line x1="443.50465" y1="38.532298" x2="437.70354" y2="370.8774" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="1,4"/><g id="id26_Graphic"><path d="M 76 175 L 76 104.8 L 88.2 97 L 198 97 L 198 167.2 L 185.8 175 Z" fill="url(#Obj_Gradient)"/><path d="M 76 175 L 76 104.8 L 88.2 97 L 198 97 L 198 167.2 L 185.8 175 L 76 175 M 76 104.8 L 185.8 104.8 L 198 97 M 185.8 104.8 L 185.8 175" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(81 104.8)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="bold" x="17.233984" y="11" textLength="65.33203">Application</tspan></text></g><g id="id570_Graphic"><path d="M 486 321 L 486 96 L 499.2 71 L 618 71 L 618 296 L 604.8 321 Z" fill="url(#Obj_Gradient_2)"/><path d="M 486 321 L 486 96 L 499.2 71 L 618 71 L 618 296 L 604.8 321 L 486 321 M 486 96 L 604.8 96 L 618 71 M 604.8 96 L 604.8 321" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(491 96)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="bold" x="35.058203" y="11" textLength="38.683594">Broker</tspan></text></g><path d="M 107.4296 270.77631 C 94.5 267.5 99.656 239.91885 120.2816 244.625 C 122.1952 235.45121 146.18 236.94022 146.0232 244.625 C 161.0624 234.79607 180.2816 254.39476 167.3904 264.22369 C 182.8592 268.98901 167.1952 294.66391 154.5 290.375 C 153.484 297.52359 130.7888 300.0252 128.7968 290.375 C 115.9456 300.68095 89.1488 284.83498 107.4296 270.77631 Z" fill="white"/><path d="M 107.4296 270.77631 C 94.5 267.5 99.656 239.91885 120.2816 244.625 C 122.1952 235.45121 146.18 236.94022 146.0232 244.625 C 161.0624 234.79607 180.2816 254.39476 167.3904 264.22369 C 182.8592 268.98901 167.1952 294.66391 154.5 290.375 C 153.484 297.52359 130.7888 300.0252 128.7968 290.375 C 115.9456 300.68095 89.1488 284.83498 107.4296 270.77631 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(114 260.5)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="500" x="9.666992" y="11" textLength="26.666016">JNDI</tspan></text><path d="M 198 136 L 224.69935 130.54855 L 223.59255 135.86122 L 462.59204 185.65278 L 463.69884 180.34011 L 486 196 L 459.30065 201.45145 L 460.40745 196.13878 L 221.40796 146.34722 L 220.30116 151.65989 Z" fill="url(#Obj_Gradient_3)"/><path d="M 198 136 L 224.69935 130.54855 L 223.59255 135.86122 L 462.59204 185.65278 L 463.69884 180.34011 L 486 196 L 459.30065 201.45145 L 460.40745 196.13878 L 221.40796 146.34722 L 220.30116 151.65989 Z" stroke="#513d99" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 130.71163 175 L 143.28837 175 L 143.28837 218.07082 L 149.57673 218.07082 L 137 238.07083 L 124.42327 218.07082 L 130.71163 218.07082 Z" fill="url(#Obj_Gradient_4)"/><path d="M 130.71163 175 L 143.28837 175 L 143.28837 218.07082 L 149.57673 218.07082 L 137 238.07083 L 124.42327 218.07082 L 130.71163 218.07082 Z" stroke="#e97b00" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(144 187.88385) rotate(90)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="500" x="0" y="11" textLength="35.361328">lookup</tspan></text><path d="M 413 266.0802 C 413 258.69126 410.8283 257.7771 394.96463 250.4646 L 394.79705 250.38894 C 378.8496 243 378.68372 243 362.3173 243 C 340.52507 243 242 243 242 243 L 242 321 L 413 321 L 413 266.0802 Z" fill="white"/><path d="M 413 266.0802 C 413 258.69126 410.8283 257.7771 394.96463 250.4646 L 394.79705 250.38894 C 378.8496 243 378.68372 243 362.3173 243 C 340.52507 243 242 243 242 243 L 242 321 L 413 321 L 413 266.0802 Z M 413 265.69956 C 413 258.69126 412.83242 258.69126 378.68372 258.69126 L 378.68372 258.69126 C 378.68372 243.07644 378.68372 243 363.31937 243" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(247 260)" fill="black"><tspan font-family="Monaco" font-size="8" font-weight="500" x="0" y="8" textLength="139.22266">java.naming.factory.initial=…</tspan><tspan font-family="Monaco" font-size="7" font-weight="500" x="0" y="19" textLength="100.816406">connectionfactory.qpidCF</tspan><tspan font-family="Monaco" font-size="8" font-weight="500" x="100.816406" y="19" textLength="9.6015625">=…</tspan><tspan font-family="Monaco" font-size="8" font-weight="500" x="0" y="30" textLength="100.816406">queue.mytrades=trades</tspan><tspan font-family="Monaco" font-size="8" font-weight="500" x="0" y="41" textLength="148.82422">queue.myinstruments=instruments</tspan></text><path d="M 173.19828 275.30005 L 174.91024 265.34075 L 223.14507 273.63212 L 224.00105 268.65248 L 242 282 L 220.57713 288.57107 L 221.43311 283.59142 Z" fill="url(#Obj_Gradient_5)"/><path d="M 173.19828 275.30005 L 174.91024 265.34075 L 223.14507 273.63212 L 224.00105 268.65248 L 242 282 L 220.57713 288.57107 L 221.43311 283.59142 Z" stroke="#e97b00" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(189.84696 258.82977) rotate(9.75359)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="500" fill="black" x="1.16878206" y="11" textLength="19.347656">defi</tspan><tspan font-family="Helvetica" font-size="12" font-weight="500" fill="black" x="20.516438" y="11" textLength="23.355469">ned </tspan><tspan font-family="Helvetica" font-size="12" font-weight="500" fill="black" x="14.516438" y="25" textLength="12.673828">by</tspan></text><g id="id10_Graphic"><path d="M 551.4536 133.07864 L 587.49484 133.70774 C 589.9817 133.75115 591.785 146.1045 591.52006 161.28219 C 591.25513 176.45988 589.0218 188.74277 586.53496 188.69936 L 550.49372 188.07026 C 548.00687 188.02685 546.20358 175.6735 546.4685 160.49581 C 546.73343 145.31812 548.96675 133.03523 551.4536 133.07864" fill="#218041"/><path d="M 551.4536 133.07864 L 587.49484 133.70774 C 589.9817 133.75115 591.785 146.1045 591.52006 161.28219 C 591.25513 176.45988 589.0218 188.74277 586.53496 188.69936 L 550.49372 188.07026 C 548.00687 188.02685 546.20358 175.6735 546.4685 160.49581 C 546.73343 145.31812 548.96675 133.03523 551.4536 133.07864 M 587.49484 133.70774 C 585.008 133.66433 582.77468 145.94723 582.50975 161.12491 C 582.24482 176.3026 584.0481 188.65596 586.53496 188.69936" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><text transform="translate(201.5625 332)" fill="#7e7e7e"><tspan font-family="Helvetica Neue" font-size="12" font-style="italic" font-weight="500" fill="#7e7e7e" x="18.36675" y="11" textLength="21.12">Defi</tspan><tspan font-family="Helvetica Neue" font-size="12" font-style="italic" font-weight="500" fill="#7e7e7e" x="39.48675" y="11" textLength="125.796">nes the JMS administer</tspan><tspan font-family="Helvetica Neue" font-size="12" font-style="italic" font-weight="500" fill="#7e7e7e" x="165.06675" y="11" textLength="59.34">ed objects </tspan><tspan font-family="Helvetica Neue" font-size="12" font-style="italic" font-weight="500" fill="#7e7e7e" x="19.71075" y="25" textLength="200.016">(connection factories, queues, topics)</tspan><tspan font-family="Helvetica Neue" font-size="12" font-style="italic" font-weight="500" fill="#7e7e7e" x="57.58875" y="39" textLength="124.26">used by the application</tspan></text><text transform="translate(247 223)" fill="black"><tspan font-family="Helvetica Neue" font-size="12" font-weight="bold" x=".064" y="12" textLength="36.216">jndi.pr</tspan><tspan font-family="Helvetica Neue" font-size="12" font-weight="bold" x="36.064" y="12" textLength="46.872">operties</tspan></text><text transform="translate(548 159.778)" fill="black"><tspan font-family="Helvetica Neue" font-size="11" font-weight="500" x=".0175" y="10" textLength="30.965">trades</tspan></text><g id="id594_Graphic"><path d="M 550.24356 203.85664 L 586.2848 204.48574 C 588.77165 204.52915 590.57495 216.8825 590.31002 232.06019 C 590.0451 247.23788 587.81177 259.52077 585.32492 259.47736 L 549.28368 258.84826 C 546.79683 258.80485 544.99354 246.4515 545.25846 231.27381 C 545.5234 216.09612 547.7567 203.81323 550.24356 203.85664" fill="#218041"/><path d="M 550.24356 203.85664 L 586.2848 204.48574 C 588.77165 204.52915 590.57495 216.8825 590.31002 232.06019 C 590.0451 247.23788 587.81177 259.52077 585.32492 259.47736 L 549.28368 258.84826 C 546.79683 258.80485 544.99354 246.4515 545.25846 231.27381 C 545.5234 216.09612 547.7567 203.81323 550.24356 203.85664 M 586.2848 204.48574 C 583.79796 204.44233 581.56464 216.72523 581.2997 231.90291 C 581.03478 247.0806 582.83808 259.43396 585.32492 259.47736" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><text transform="translate(540 224)" fill="black"><tspan font-family="Helvetica Neue" font-size="11" font-weight="500" x=".1635" y="10" textLength="57.673">instruments</tspan></text><path d="M 176.95547 179.10681 L 186.60067 171.0356 L 232.34226 225.69743 L 237.16486 221.66183 L 240.3548 245.0712 L 217.87446 237.80424 L 222.69706 233.76864 Z" fill="url(#Obj_Gradient_6)"/><path d="M 176.95547 179.10681 L 186.60067 171.0356 L 232.34226 225.69743 L 237.16486 221.66183 L 240.3548 245.0712 L 217.87446 237.80424 L 222.69706 233.76864 Z" stroke="#e97b00" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(197.6773 183.16345) rotate(50.077054)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="500" x="0" y="11" textLength="30.017578">reads</tspan></text><g id="id19_Graphic"><rect x="499" y="152" width="31" height="32" fill="#218041"/><rect x="499" y="152" width="31" height="32" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id599_Graphic"><rect x="499" y="195" width="31" height="32" fill="#218041"/><rect x="499" y="195" width="31" height="32" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id600_Graphic"><rect x="499" y="238" width="31" height="32" fill="#218041"/><rect x="499" y="238" width="31" height="32" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g></g></g></svg>
diff --git a/qpid/doc/book/src/jms-client-0-8/images/QpidJmsOverview.png b/qpid/doc/book/src/jms-client-0-8/images/QpidJmsOverview.png
new file mode 100644
index 0000000000..1f90905747
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/images/QpidJmsOverview.png
Binary files differ
diff --git a/qpid/doc/book/src/jms-client-0-8/images/QpidJmsOverview.svg b/qpid/doc/book/src/jms-client-0-8/images/QpidJmsOverview.svg
new file mode 100644
index 0000000000..55a354a108
--- /dev/null
+++ b/qpid/doc/book/src/jms-client-0-8/images/QpidJmsOverview.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+
+ 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.
+
+-->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="197 97 577 280" width="577pt" height="280pt" xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata> Produced by OmniGraffle 6.0.3 <dc:date>2013-12-29 17:48Z</dc:date></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="1.308"/><feOffset in="blur" result="offset" dx="0" dy="2"/><feFlood flood-color="black" flood-opacity=".5" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><linearGradient x1="0" x2="1" id="Gradient" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#6383ab"/><stop offset="1" stop-color="white"/></linearGradient><linearGradient id="Obj_Gradient" xl:href="#Gradient" gradientTransform="translate(273 207) rotate(90) scale(78)"/><font-face font-family="Helvetica" font-size="12" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face><linearGradient x1="0" x2="1" id="Gradient_2" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#62a073"/><stop offset="1" stop-color="white"/></linearGradient><linearGradient id="Obj_Gradient_2" xl:href="#Gradient_2" gradientTransform="translate(471 110) rotate(90) scale(250)"/><linearGradient x1="0" x2="1" id="Gradient_3" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#baa6ff"/><stop offset="1" stop-color="#624aba"/></linearGradient><linearGradient id="Obj_Gradient_3" xl:href="#Gradient_3" gradientTransform="translate(374.5 235.21769) rotate(90) scale(21.564619)"/><font-face font-family="Helvetica" font-size="12" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="522.94922" cap-height="717.28516" ascent="770.01953" descent="-229.98047" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><linearGradient id="Obj_Gradient_4" xl:href="#Gradient" gradientTransform="translate(697.6057 142) rotate(90) scale(78)"/><linearGradient id="Obj_Gradient_5" xl:href="#Gradient_3" gradientTransform="translate(572.72086 183.88282) rotate(77.709507) scale(21.564619)"/><linearGradient id="Obj_Gradient_6" xl:href="#Gradient" gradientTransform="translate(697.6057 251) rotate(90) scale(78)"/><linearGradient id="Obj_Gradient_7" xl:href="#Gradient_3" gradientTransform="translate(574.32974 275.36927) rotate(93.517516) scale(21.564619)"/></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Typical Architecture</title><rect fill="white" width="960" height="1172"/><g><title>Layer 1</title><g><xl:use xl:href="#id26_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id570_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id10_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id594_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id597_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id599_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id19_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id601_Graphic" filter="url(#Shadow)"/><xl:use xl:href="#id602_Graphic" filter="url(#Shadow)"/></g><g id="id26_Graphic"><path d="M 212 285 L 212 214.8 L 224.2 207 L 334 207 L 334 277.2 L 321.8 285 Z" fill="url(#Obj_Gradient)"/><path d="M 212 285 L 212 214.8 L 224.2 207 L 334 207 L 334 277.2 L 321.8 285 L 212 285 M 212 214.8 L 321.8 214.8 L 334 207 M 321.8 214.8 L 321.8 285" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(217 214.8)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="bold" x="12.230078" y="11" textLength="75.339844">Application 1</tspan></text></g><g id="id570_Graphic"><path d="M 403 360 L 403 135 L 416.6 110 L 539 110 L 539 335 L 525.4 360 Z" fill="url(#Obj_Gradient_2)"/><path d="M 403 360 L 403 135 L 416.6 110 L 539 110 L 539 335 L 525.4 360 L 403 360 M 403 135 L 525.4 135 L 539 110 M 525.4 135 L 525.4 360" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(408 135)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="bold" x="36.858203" y="11" textLength="38.683594">Broker</tspan></text></g><path d="M 334 251.39115 L 334 240.60885 L 393 240.60885 L 393 235.21769 L 415 246 L 393 256.78231 L 393 251.39115 Z" fill="url(#Obj_Gradient_3)"/><path d="M 334 251.39115 L 334 240.60885 L 393 240.60885 L 393 235.21769 L 415 246 L 393 256.78231 L 393 251.39115 Z" stroke="#513d99" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(349.125 239)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="500" fill="black" x="6.361328" y="11" textLength="38.027344">publish</tspan></text><g id="id10_Graphic"><path d="M 477.42644 182.83601 L 509.42644 182.83601 C 511.63444 182.83601 513.42644 194.03601 513.42644 207.83601 C 513.42644 221.63601 511.63444 232.83601 509.42644 232.83601 L 477.42644 232.83601 C 475.21844 232.83601 473.42644 221.63601 473.42644 207.83601 C 473.42644 194.03601 475.21844 182.83601 477.42644 182.83601" fill="#218041"/><path d="M 477.42644 182.83601 L 509.42644 182.83601 C 511.63444 182.83601 513.42644 194.03601 513.42644 207.83601 C 513.42644 221.63601 511.63444 232.83601 509.42644 232.83601 L 477.42644 232.83601 C 475.21844 232.83601 473.42644 221.63601 473.42644 207.83601 C 473.42644 194.03601 475.21844 182.83601 477.42644 182.83601 M 509.42644 182.83601 C 507.21844 182.83601 505.42644 194.03601 505.42644 207.83601 C 505.42644 221.63601 507.21844 232.83601 509.42644 232.83601" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id594_Graphic"><path d="M 474.7307 257.26253 L 506.7307 257.26253 C 508.9387 257.26253 510.7307 268.46253 510.7307 282.26253 C 510.7307 296.06253 508.9387 307.26253 506.7307 307.26253 L 474.7307 307.26253 C 472.5227 307.26253 470.7307 296.06253 470.7307 282.26253 C 470.7307 268.46253 472.5227 257.26253 474.7307 257.26253" fill="#218041"/><path d="M 474.7307 257.26253 L 506.7307 257.26253 C 508.9387 257.26253 510.7307 268.46253 510.7307 282.26253 C 510.7307 296.06253 508.9387 307.26253 506.7307 307.26253 L 474.7307 307.26253 C 472.5227 307.26253 470.7307 296.06253 470.7307 282.26253 C 470.7307 268.46253 472.5227 257.26253 474.7307 257.26253 M 506.7307 257.26253 C 504.5227 257.26253 502.7307 268.46253 502.7307 282.26253 C 502.7307 296.06253 504.5227 307.26253 506.7307 307.26253" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id597_Graphic"><path d="M 636.6057 220 L 636.6057 149.8 L 648.8057 142 L 758.6057 142 L 758.6057 212.2 L 746.4057 220 Z" fill="url(#Obj_Gradient_4)"/><path d="M 636.6057 220 L 636.6057 149.8 L 648.8057 142 L 758.6057 142 L 758.6057 212.2 L 746.4057 220 L 636.6057 220 M 636.6057 149.8 L 746.4057 149.8 L 758.6057 142 M 746.4057 149.8 L 746.4057 220" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(641.6057 149.8)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="bold" x="12.230078" y="11" textLength="75.339844">Application 2</tspan></text></g><path d="M 514.57405 213.10361 L 512.27883 202.56842 L 613.96232 180.41551 L 612.81472 175.14791 L 636.6057 181 L 617.40514 196.21829 L 616.25754 190.9507 Z" fill="url(#Obj_Gradient_5)"/><path d="M 514.57405 213.10361 L 512.27883 202.56842 L 613.96232 180.41551 L 612.81472 175.14791 L 636.6057 181 L 617.40514 196.21829 L 616.25754 190.9507 Z" stroke="#513d99" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(532.21918 196.5776) rotate(-12.290493)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="500" fill="black" x="17.930041" y="11" textLength="48.691406">consume</tspan></text><g id="id599_Graphic"><path d="M 636.6057 329 L 636.6057 258.8 L 648.8057 251 L 758.6057 251 L 758.6057 321.2 L 746.4057 329 Z" fill="url(#Obj_Gradient_6)"/><path d="M 636.6057 329 L 636.6057 258.8 L 648.8057 251 L 758.6057 251 L 758.6057 321.2 L 746.4057 329 L 636.6057 329 M 636.6057 258.8 L 746.4057 258.8 L 758.6057 251 M 746.4057 258.8 L 746.4057 329" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(641.6057 258.8)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="bold" x="12.230078" y="11" textLength="75.339844">Application 3</tspan></text></g><path d="M 510.39994 287.64353 L 511.06147 276.88153 L 614.97792 283.26922 L 615.3087 277.88822 L 636.6057 290 L 613.98562 299.41222 L 614.3164 294.03122 Z" fill="url(#Obj_Gradient_7)"/><path d="M 510.39994 287.64353 L 511.06147 276.88153 L 614.97792 283.26922 L 615.3087 277.88822 L 636.6057 290 L 613.98562 299.41222 L 614.3164 294.03122 Z" stroke="#513d99" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(531.88514 276.54967) rotate(3.5175156)" fill="black"><tspan font-family="Helvetica" font-size="12" font-weight="500" fill="black" x="17.946518" y="11" textLength="48.691406">consume</tspan></text><g id="id19_Graphic"><rect x="415" y="188" width="31" height="32" fill="#218041"/><rect x="415" y="188" width="31" height="32" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id601_Graphic"><rect x="415" y="230" width="31" height="32" fill="#218041"/><rect x="415" y="230" width="31" height="32" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id602_Graphic"><rect x="415" y="272" width="31" height="32" fill="#218041"/><rect x="415" y="272" width="31" height="32" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><path d="M 448.79433 245.96582 L 443.80928 242.23727 L 457.7571 223.5891 L 455.26457 221.72483 L 473.42644 207.83601 L 465.23466 229.18192 L 462.74214 227.31765 Z" fill="#e0c635"/><path d="M 448.79433 245.96582 L 443.80928 242.23727 L 457.7571 223.5891 L 455.26457 221.72483 L 473.42644 207.83601 L 465.23466 229.18192 L 462.74214 227.31765 Z" stroke="#513d99" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 443.9547 246.64579 L 449.17973 243.26174 L 461.11203 261.68537 L 463.72454 259.99335 L 470.4589 281.84286 L 453.2745 266.76145 L 455.887 265.06942 Z" fill="#e0c635"/><path d="M 443.9547 246.64579 L 449.17973 243.26174 L 461.11203 261.68537 L 463.72454 259.99335 L 470.4589 281.84286 L 453.2745 266.76145 L 455.887 265.06942 Z" stroke="#513d99" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g></g></svg>