Author: ataylor
Date: 2011-04-19 06:32:50 -0400 (Tue, 19 Apr 2011)
New Revision: 10529
Added:
trunk/docs/rest-manual/
trunk/docs/rest-manual/HornetQ_Rest_Manual-en.iml
trunk/docs/rest-manual/en/
trunk/docs/rest-manual/en/Author_Group.xml
trunk/docs/rest-manual/en/Book_Info.xml
trunk/docs/rest-manual/en/HornetQ_Rest_Manual.ent
trunk/docs/rest-manual/en/HornetQ_Rest_Manual.xml
trunk/docs/rest-manual/en/about.xml
trunk/docs/rest-manual/en/basics.xml
trunk/docs/rest-manual/en/consuming-messages.xml
trunk/docs/rest-manual/en/creating-destinations.xml
trunk/docs/rest-manual/en/installation.xml
trunk/docs/rest-manual/en/introduction.xml
trunk/docs/rest-manual/en/jms-and-rest.xml
trunk/docs/rest-manual/en/notice.xml
trunk/docs/rest-manual/en/posting-messages.xml
trunk/docs/rest-manual/en/pushing-messages.xml
trunk/docs/rest-manual/en/security.xml
trunk/docs/rest-manual/pom.xml
trunk/hornetq-rest/hornetq-rest-all.iml
trunk/hornetq-rest/hornetq-rest/hornetq-rest.iml
Removed:
trunk/hornetq-rest/docbook/pom.xml
trunk/hornetq-rest/docbook/reference/en/
Modified:
trunk/docs/pom.xml
trunk/docs/rest-manual/en/master.xml
trunk/hornetq-rest/hornetq-rest/pom.xml
trunk/hornetq-rest/pom.xml
trunk/hornetq.ipr
trunk/hornetq.iws
trunk/pom.xml
Log:
added rest jar and integrated docs
Modified: trunk/docs/pom.xml
===================================================================
--- trunk/docs/pom.xml 2011-04-19 03:31:49 UTC (rev 10528)
+++ trunk/docs/pom.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -30,6 +30,7 @@
<modules>
<module>user-manual</module>
<module>quickstart-guide</module>
+ <module>rest-manual</module>
</modules>
Added: trunk/docs/rest-manual/HornetQ_Rest_Manual-en.iml
===================================================================
--- trunk/docs/rest-manual/HornetQ_Rest_Manual-en.iml (rev 0)
+++ trunk/docs/rest-manual/HornetQ_Rest_Manual-en.iml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module
org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true"
type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5"
inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
+
Copied: trunk/docs/rest-manual/en/Author_Group.xml (from rev 10511,
trunk/docs/quickstart-guide/en/Author_Group.xml)
===================================================================
--- trunk/docs/rest-manual/en/Author_Group.xml (rev 0)
+++ trunk/docs/rest-manual/en/Author_Group.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,28 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+<authorgroup>
+ <author>
+ <firstname>Bill</firstname>
+ <surname>Burke</surname>
+ <affiliation>
+ <shortaffil>Red Hat, Inc.</shortaffil>
+ <orgdiv>JBoss</orgdiv>
+ </affiliation>
+ </author>
+</authorgroup>
Copied: trunk/docs/rest-manual/en/Book_Info.xml (from rev 10511,
trunk/docs/quickstart-guide/en/Book_Info.xml)
===================================================================
--- trunk/docs/rest-manual/en/Book_Info.xml (rev 0)
+++ trunk/docs/rest-manual/en/Book_Info.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,45 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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.
+ -->
+
+<!-- This document was created with Syntext Serna Free. -->
+<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+<bookinfo id="HornetQ_Rest_Guide">
+ <title>HornetQ Rest Guide</title>
+ <subtitle>Putting the buzz in messaging</subtitle>
+ <productname>HornetQ</productname>
+ <edition>2.1.0</edition>
+ <pubsnumber>1</pubsnumber>
+ <abstract>
+ <para>This HornetQ Rest guide will help you get HornetQ Rest up and running in
a few minutes and will explain the basics needed
+ to get started.</para>
+ </abstract>
+ <corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="images/hornetQ_logo_600px.png"
format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>HornetQ Logo</phrase>
+ </textobject>
+ </inlinemediaobject>
+ </corpauthor>
+ <copyright>
+ <year>&YEAR;</year>
+ <holder>&HOLDER;</holder>
+ </copyright>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="Author_Group.xml"/>
+</bookinfo>
Copied: trunk/docs/rest-manual/en/HornetQ_Rest_Manual.ent (from rev 10511,
trunk/docs/quickstart-guide/en/HornetQ_QuickStart_Guide.ent)
===================================================================
--- trunk/docs/rest-manual/en/HornetQ_Rest_Manual.ent (rev 0)
+++ trunk/docs/rest-manual/en/HornetQ_Rest_Manual.ent 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,18 @@
+<!ENTITY PRODUCT "HornetQ">
+<!ENTITY BOOKID "HornetQ_Rest_Manual">
+<!ENTITY YEAR "2011">
+<!ENTITY HOLDER "Red Hat Inc.">
+<!ENTITY semi ";"><!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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.
+ -->
+
+
Copied: trunk/docs/rest-manual/en/HornetQ_Rest_Manual.xml (from rev 10511,
trunk/docs/quickstart-guide/en/HornetQ_QuickStart_Guide.xml)
===================================================================
--- trunk/docs/rest-manual/en/HornetQ_Rest_Manual.xml (rev 0)
+++ trunk/docs/rest-manual/en/HornetQ_Rest_Manual.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+
+]>
+<book>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="Book_Info.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="notice.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="about.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="introduction.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="installation.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="basics.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="posting-messages.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="consuming-messages.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="pushing-messages.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="creating-destinations.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="security.xml"/>
+ <xi:include
xmlns:xi="http://www.w3.org/2001/XInclude"
href="jms-and-rest.xml"/>
+</book>
Copied: trunk/docs/rest-manual/en/about.xml (from rev 10511,
trunk/docs/quickstart-guide/en/about.xml)
===================================================================
--- trunk/docs/rest-manual/en/about.xml (rev 0)
+++ trunk/docs/rest-manual/en/about.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+
+<chapter id="about">
+ <title>About HornetQ</title>
+ <para>What is HornetQ?</para>
+ <itemizedlist>
+ <listitem>
+ <para>HornetQ is an open source project to build a multi-protocol,
embeddable, very high
+ performance, clustered, asynchronous messaging system.</para>
+ </listitem>
+ <listitem>
+ <para>For answers to more questions about what HornetQ is and what it
isn't please visit
+ the <ulink
url="http://www.jboss.org/community/wiki/HornetQGeneralFAQs">... wiki
+ page</ulink>.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Why use HornetQ? Here are just a few of the reasons:</para>
+ <itemizedlist>
+ <listitem>
+ <para>100% open source software. HornetQ is licenced using the Apache
Software License v2.0
+ to minimise barriers to adoption.</para>
+ </listitem>
+ <listitem>
+ <para>HornetQ is designed with usability in mind.</para>
+ </listitem>
+ <listitem>
+ <para>Written in Java. Runs on any platform with a Java 6+ runtime,
that's everything
+ from Windows desktops to IBM mainframes.</para>
+ </listitem>
+ <listitem>
+ <para>Amazing performance. Our class beating high performance journal
provides persistent
+ messaging performance at rates normally seen for non persistent
messaging, our non
+ persistent messaging performance rocks the boat too.</para>
+ </listitem>
+ <listitem>
+ <para>Full feature set. All the features you'd expect in any
serious messaging system,
+ and others you won't find anywhere else.</para>
+ </listitem>
+ <listitem>
+ <para>Elegant, clean-cut design with minimal third party dependencies.
Run HornetQ
+ stand-alone, run it in integrated in your favourite JEE application
server, or run
+ it embedded inside your own product. It's up to you.</para>
+ </listitem>
+ <listitem>
+ <para>Seamless high availability. We provide a HA solution with
automatic client
+ failover so you can guarantee zero message loss or duplication in event
of server
+ failure.</para>
+ </listitem>
+ <listitem>
+ <para>Hugely flexible clustering. Create clusters of servers that know
how to load
+ balance messages. Link geographically distributed clusters over
unreliable
+ connections to form a global network. Configure routing of messages in a
highly
+ flexible way.</para>
+ </listitem>
+ <listitem>
+ <para>For a full list of features, please see the <ulink
+
url="http://www.jboss.org/community/wiki/HornetQFeatures">fe... wiki
+ page</ulink> .</para>
+ </listitem>
+ </itemizedlist>
+</chapter>
\ No newline at end of file
Added: trunk/docs/rest-manual/en/basics.xml
===================================================================
--- trunk/docs/rest-manual/en/basics.xml (rev 0)
+++ trunk/docs/rest-manual/en/basics.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+ <chapter>
+ <title>HornetQ REST Interface Basics</title>
+
+ <para>The HornetQ REST interface publishes a variety of REST resources to
+ perform various tasks on a queue or topic. Only the top-level queue and
+ topic URI schemes are published to the outside world. You must discover
+ all over resources to interact with by looking for and traversing links.
+ You'll find published links within custom response headers and embedded in
+ published XML representations. Let's look at how this works.</para>
+
+ <sect1>
+ <title>Queue and Topic Resources</title>
+
+ <para>To interact with a queue or topic you do a HEAD or GET request on
+ the following relative URI pattern:</para>
+
+ <programlisting>/queues/{name}
+/topics/{name}
+</programlisting>
+
+ <para>The base of the URI is the base URL of the WAR you deployed the
+ HornetQ REST server within as defined in the Installation and
+ Configuration section of this document. Replace the
+ <literal>{name}</literal> string within the above URI pattern with the
+ name of the queue or topic you are interested in interacting with. For
+ example if you have configured a JMS topic named "foo" within your
+ <literal>hornetq-jms.xml</literal> file, the URI name should be
+ "jms.topic.foo". If you have configured a JMS queue name "bar"
within
+ your <literal>hornetq-jms.xml</literal> file, the URI name should be
+ "jms.queue.bar". Internally, HornetQ prepends the "jms.topic"
or
+ "jms.queue" strings to the name of the deployed destination. Next,
+ perform your HEAD or GET request on this URI. Here's what a
+ request/response would look like.</para>
+
+ <programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
+Host:
example.com
+
+--- Response ---
+HTTP/1.1 200 Ok
+msg-create:
http://example.com/queues/jms.queue.bar/create
+msg-pull-consumers:
http://example.com/queues/jms.queue.bar/pull-consumers
+msg-push-consumers:
http://example.com/queues/jms.queue.bar/push-consumers
+</programlisting>
+
+ <para>The HEAD or GET response contains a number of custom response
+ headers that are URLs to additional REST resources that allow you to
+ interact with the queue or topic in different ways. It is important not
+ to rely on the scheme of the URLs returned within these headers as they
+ are an implementation detail. Treat them as opaque and query for them
+ each and every time you initially interact (at boot time) with the
+ server. If you treat all URLs as opaque then you will be isolated from
+ implementation changes as the HornetQ REST interface evolves over
+ time.</para>
+
+ <para></para>
+ </sect1>
+
+ <sect1>
+ <title>Queue Resource Response Headers</title>
+
+ <para>Below is a list of response headers you should expect when
+ interacting with a Queue resource.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>msg-create</term>
+
+ <listitem>
+ <para>This is a URL you POST messages to. The semantics of this
+ link are described in Chapter 4.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-create-with-id</term>
+
+ <listitem>
+ <para>This is a URL template you POST message to. The semantics of
+ this link are described in Chapter 4.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-pull-consumers</term>
+
+ <listitem>
+ <para>This is a URL for creating consumers that will pull from a
+ queue. The semantics of this link are described in Chapter
+ 5.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-push-consumers</term>
+
+ <listitem>
+ <para>This is a URL for registering other URLs you want the
+ HornetQ REST server to push messages to. The semantics of this
+ link are described in Chapter 6</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <sect1>
+ <title>Topic Resource Respones Headers</title>
+
+ <para>Below is a list of response headers you should expect when
+ interacting with a Topic resource.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>msg-create</term>
+
+ <listitem>
+ <para>This is a URL you POST messages to. The semantics of this
+ link are described in Chapter 4.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-create-with-id</term>
+
+ <listitem>
+ <para>This is a URL template you POST messages to. The semantics
+ of this link are described in Chapter 4.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-pull-subscriptions</term>
+
+ <listitem>
+ <para>This is a URL for creating subscribers that will pull from a
+ topic. The semantics of this link are described in Chapter
+ 5.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-push-subscriptions</term>
+
+ <listitem>
+ <para>This is a URL for registering other URLs you want the
+ HornetQ REST server to push messages to. The semantics of this
+ link are described in Chapter 6.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para></para>
+ </sect1>
+ </chapter>
\ No newline at end of file
Added: trunk/docs/rest-manual/en/consuming-messages.xml
===================================================================
--- trunk/docs/rest-manual/en/consuming-messages.xml (rev 0)
+++ trunk/docs/rest-manual/en/consuming-messages.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,696 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+
+<chapter>
+ <title>Consuming Messages via Pull</title>
+
+ <para>There are two different ways to consume messages from a topic or
+ queue. You can wait and have the messaging server push them to you, or you
+ can continuously poll the server yourself to see if messages are
+ available. This chapter discusses the latter. Consuming messages via a
+ pull works almost identically for queues and topics with some minor, but
+ important caveats. To start consuming you must create a consumer resource
+ on the server that is dedicated to your client. Now, this pretty much
+ breaks the stateless principle of REST, but after much prototyping, this
+ is the best way to work most effectively with HornetQ through a REST
+ interface.</para>
+
+ <para>You create consumer resources by doing a simple POST to the URL
+ published by the <literal>msg-pull-consumers</literal> response header if
+ you're interacting with a queue, the
+ <literal>msg-pull-subscribers</literal> response header if you're
+ interacting with a topic. These headers are provided by the main queue or
+ topic resource discussed in Chapter 3. Doing an empty POST to one of these
+ URLs will create a consumer resource that follows an auto-acknowledge
+ protocol and, if you're interacting with a topic, creates a temporty
+ subscription to the topic. If you want to use the acknowledgement protocol
+ and/or create a durable subscription (topics only), then you must use the
+ form parameters (<literal>application/x-www-form-urlencoded</literal>)
+ described below.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>autoAck</term>
+
+ <listitem>
+ <para>A value of <literal>true</literal> or
<literal>false</literal>
+ can be given. This defaults to <literal>true</literal> if you do not
+ pass this parameter.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>durable</term>
+
+ <listitem>
+ <para>A value of <literal>true</literal> or
<literal>false</literal>
+ can be given. This defaults to <literal>false</literal> if you do
+ not pass this parameter. Only available on topics. This specifies
+ whether you want a durable subscription or not. A durable
+ subscription persists through server restart.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>name</term>
+
+ <listitem>
+ <para>This is the name of the durable subscription. If you do not
+ provide this parameter, the name will be automatically generated by
+ the server. Only usable on topics.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>selector</term>
+
+ <listitem>
+ <para>This is an optional JMS selector string. The HornetQ REST
+ interface adds HTTP headers to the JMS message for REST produced
+ messages. HTTP headers are prefixed with "http_" and every '-'
+ charactor is converted to a '$'.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>idle-timeout</term>
+
+ <listitem>
+ <para>For a topic subscription, idle time in milliseconds in which
+ the consumer connections will be closed if idle.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>delete-when-idle</term>
+
+ <listitem>
+ <para>Boolean value, If true, a topic subscription will be deleted
+ (even if it is durable) when an the idle timeout is reached.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <sect1>
+ <title>Auto-Acknowledge</title>
+
+ <para>This section focuses on the auto-acknowledge protocol for
+ consuming messages via a pull. Here's a list of the response headers and
+ URLs you'll be interested in.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>msg-pull-consumers</term>
+
+ <listitem>
+ <para>The URL of a factory resource for creating queue consumer
+ resources. You will pull from these created resources.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-pull-subscriptions</term>
+
+ <listitem>
+ <para>The URL of a factory resource for creating topic
+ subscription resources. You will pull from the created
+ resources.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-consume-next</term>
+
+ <listitem>
+ <para>The URL you will pull the next message from. This is
+ returned with every response.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-consumer</term>
+
+ <listitem>
+ <para>This is a URL pointing back to the consumer or subscription
+ resource created for the client.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <sect2>
+ <title>Creating an Auto-Ack Consumer or Subscription</title>
+
+ <para>Here is an example of creating an auto-acknowledged queue pull
+ consumer.</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Find the pull-consumers URL by doing a HEAD or GET request
+ to the base queue resource.</para>
+
+ <programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
+ Host:
example.com
+
+ --- Response ---
+ HTTP/1.1 200 Ok
+ msg-create:
http://example.com/queues/jms.queue.bar/create
+ msg-pull-consumers:
http://example.com/queues/jms.queue.bar/pull-consumers
+ msg-push-consumers:
http://example.com/queues/jms.queue.bar/push-consumers
+ </programlisting>
+ </listitem>
+
+ <listitem>
+ <para>Next do an empty POST to the URL returned in the
+ <literal>msg-pull-consumers</literal> header.</para>
+
+ <programlisting>POST /queues/jms.queue.bar/pull-consumers HTTP/1.1
+ Host:
example.com
+
+ --- response ---
+ HTTP/1.1 201 Created
+ Location:
http://example.com/queues/jms.queue.bar/pull-consumers/auto-ack/333
+ msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/auto-ack/333/consu...
+ </programlisting>
+
+ <para>The <literal>Location</literal> header points to the
JMS
+ consumer resource that was created on the server. It is good to
+ remember this URL, although, as you'll see later, it is
+ transmitted with each response just to remind you.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>Creating an auto-acknowledged consumer for a topic is pretty
+ much the same. Here's an example of creating a durable
+ auto-acknowledged topic pull subscription.</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Find the <literal>pull-subscriptions</literal> URL by
doing
+ a HEAD or GET request to the base topic resource</para>
+
+ <programlisting>HEAD /topics/jms.topic.bar HTTP/1.1
+ Host:
example.com
+
+ --- Response ---
+ HTTP/1.1 200 Ok
+ msg-create:
http://example.com/topics/jms.topic.foo/create
+ msg-pull-subscriptions:
http://example.com/topics/jms.topic.foo/pull-subscriptions
+ msg-push-subscriptions:
http://example.com/topics/jms.topic.foo/push-subscriptions
+ </programlisting>
+ </listitem>
+
+ <listitem>
+ <para>Next do a POST to the URL returned in the
+ <literal>msg-pull-subscriptions</literal> header passing in a
+ <literal>true</literal> value for the
<literal>durable</literal>
+ form parameter.</para>
+
+ <programlisting>POST /topics/jms.topic.foo/pull-subscriptions HTTP/1.1
+ Host:
example.com
+ Content-Type: application/x-www-form-urlencoded
+
+ durable=true
+
+ --- Response ---
+ HTTP/1.1 201 Created
+ Location:
http://example.com/topics/jms.topic.foo/pull-subscriptions/auto-ack/222
+ msg-consume-next:
http://example.com/topics/jms.topic.foo/pull-subscriptions/auto-ack/222/c...
+ </programlisting>
+
+ <para>The <literal>Location</literal> header points to the
JMS
+ subscription resource that was created on the server. It is good
+ to remember this URL, although, as you'll see later, it is
+ transmitted with each response just to remind you.</para>
+ </listitem>
+ </orderedlist>
+ </sect2>
+
+ <sect2>
+ <title>Consuming Messages</title>
+
+ <para>After you have created a consumer resource, you are ready to
+ start pulling messages from the server. Notice that when you created
+ the consumer for either the queue or topic, the response contained a
+ <literal>msg-consume-next</literal> response header. POST to the URL
+ contained within this header to consume the next message in the queue
+ or topic subscription. A successful POST causes the server to extract
+ a message from the queue or topic subscription, acknowledge it, and
+ return it to the consuming client. If there are no messages in the
+ queue or topic subscription, a 503 (Service Unavailable) HTTP code is
+ returned.</para>
+
+ <warning>
+ <para>For both successful and unsuccessful posts to the
+ msg-consume-next URL, the response will contain a new
+ msg-consume-next header. You must ALWAYS use this new URL returned
+ within the new msg-consume-next header to consume new
+ messages.</para>
+ </warning>
+
+ <para>Here's an example of pulling multiple messages from the consumer
+ resource.</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Do a POST on the msg-consume-next URL that was returned with
+ the consumer or subscription resource discussed earlier.</para>
+
+ <programlisting>POST /queues/jms.queue.bar/pull-consumers/consume-next-1
+ Host:
example.com
+
+ --- Response ---
+ HTTP/1.1 200 Ok
+ Content-Type: application/xml
+ msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/consume-next-2
+ msg-consumer:
http://example.com/queues/jms.queue.bar/pull-consumers/333
+
+ <order>...</order>
+ </programlisting>
+
+ <para>The POST returns the message consumed from the queue. It
+ also returns a new msg-consume-next link. Use this new link to get
+ the next message. Notice also a msg-consumer response header is
+ returned. This is a URL that points back to the consumer or
+ subscription resource. You will need that to clean up your
+ connection after you are finished using the queue or topic.</para>
+ </listitem>
+
+ <listitem>
+ <para>The POST returns the message consumed from the queue. It
+ also returns a new msg-consume-next link. Use this new link to get
+ the next message.</para>
+
+ <programlisting>POST /queues/jms.queue.bar/pull-consumers/consume-next-2
+ Host:
example.com
+
+ --- Response ---
+ Http/1.1 503 Service Unavailable
+ Retry-After: 5
+ msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/consume-next-2
+ </programlisting>
+
+ <para>In this case, there are no messages in the queue, so we get
+ a 503 response back. As per the HTTP 1.1 spec, a 503 response may
+ return a Retry-After head specifying the time in seconds that you
+ should retry a post. Also notice, that another new
+ msg-consume-next URL is present. Although it probabley is the same
+ URL you used last post, get in the habit of using URLs returned in
+ response headers as future versions of HornetQ REST might be
+ redirecting you or adding additional data to the URL after
+ timeouts like this.</para>
+ </listitem>
+
+ <listitem>
+ <para>POST to the URL within the last
+ <literal>msg-consume-next</literal> to get the next
+ message.</para>
+
+ <programlisting>POST /queues/jms.queue.bar/pull-consumers/consume-next-2
+ Host:
example.com
+
+ --- Response ---
+ HTTP/1.1 200 Ok
+ Content-Type: application/xml
+ msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/consume-next-3
+
+ <order>...</order></programlisting>
+ </listitem>
+ </orderedlist>
+ </sect2>
+
+ <sect2>
+ <title>Recovering From Network Failures</title>
+
+ <para>If you experience a network failure and do not know if your post
+ to a msg-consume-next URL was successful or not, just re-do your POST.
+ A POST to a msg-consume-next URL is idempotent, meaning that it will
+ return the same result if you execute on any one msg-consume-next URL
+ more than once. Behind the scenes, the consumer resource caches the
+ last consumed message so that if there is a message failure and you do
+ a re-post, the cached last message will be returned (along with a new
+ msg-consume-next URL). This is the reason why the protocol always
+ requires you to use the next new msg-consume-next URL returned with
+ each response. Information about what state the client is in is
+ embedded within the actual URL.</para>
+ </sect2>
+
+ <sect2>
+ <title>Recovering From Client or Server Crashes</title>
+
+ <para>If the server crashes and you do a POST to the msg-consume-next
+ URL, the server will return a 412 (Preconditions Failed) response
+ code. This is telling you that the URL you are using is out of sync
+ with the server. The response will contain a new msg-consume-next
+ header to invoke on.</para>
+
+ <para>If the client crashes there are multiple ways you can recover.
+ If you have remembered the last msg-consume-next link, you can just
+ re-POST to it. If you have remembered the consumer resource URL, you
+ can do a GET or HEAD request to obtain a new msg-consume-next URL. If
+ you have created a topic subscription using the name parameter
+ discussed earlier, you can re-create the consumer. Re-creation will
+ return a msg-consume-next URL you can use. If you cannot do any of
+ these things, you will have to create a new consumer.</para>
+
+ <para>The problem with the auto-acknowledge protocol is that if the
+ client or server crashes, it is possible for you to skip messages. The
+ scenario would happen if the server crashes after auto-acknowledging a
+ message and before the client receives the message. If you want more
+ reliable messaging, then you must use the acknowledgement
+ protocol.</para>
+ </sect2>
+ </sect1>
+
+ <sect1>
+ <title>Manual Acknowledgement</title>
+
+ <para>The manual acknowledgement protocol is similar to the auto-ack
+ protocol except there is an additional round trip to the server to tell
+ it that you have received the message and that the server can internally
+ ack the message. Here is a list of the respone headers you will be
+ interested in.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>msg-pull-consumers</term>
+
+ <listitem>
+ <para>The URL of a factory resource for creating queue consumer
+ resources. You will pull from these created resources</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-pull-subscriptions</term>
+
+ <listitem>
+ <para>The URL of a factory resource for creating topic
+ subscription resources. You will pull from the created
+ resources.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-acknowledge-next</term>
+
+ <listitem>
+ <para>URL used to obtain the next message in the queue or topic
+ subscription. It does not acknowledge the message though.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-acknowledgement</term>
+
+ <listitem>
+ <para>URL used to acknowledge a message.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>msg-consumer</term>
+
+ <listitem>
+ <para>This is a URL pointing back to the consumer or subscription
+ resource created for the client.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <sect2>
+ <title>Creating manually-acknowledged consumers or
+ subscriptions</title>
+
+ <para>Here is an example of creating an auto-acknowledged queue pull
+ consumer.</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Find the pull-consumers URL by doing a HEAD or GET request
+ to the base queue resource.</para>
+
+ <programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
+ Host:
example.com
+
+ --- Response ---
+ HTTP/1.1 200 Ok
+ msg-create:
http://example.com/queues/jms.queue.bar/create
+ msg-pull-consumers:
http://example.com/queues/jms.queue.bar/pull-consumers
+ msg-push-consumers:
http://example.com/queues/jms.queue.bar/push-consumers
+ </programlisting>
+ </listitem>
+
+ <listitem>
+ <para>Next do a POST to the URL returned in the
+ <literal>msg-pull-consumers</literal> header passing in a
+ <literal>false</literal> value to the
<literal>autoAck</literal>
+ form parameter .</para>
+
+ <programlisting>POST /queues/jms.queue.bar/pull-consumers HTTP/1.1
+ Host:
example.com
+ Content-Type: application/x-www-form-urlencoded
+
+ autoAck=false
+
+ --- response ---
+ HTTP/1.1 201 Created
+ Location:
http://example.com/queues/jms.queue.bar/pull-consumers/acknowledged/333
+ msg-acknowledge-next:
http://example.com/queues/jms.queue.bar/pull-consumers/acknowledged/333/a...
+ </programlisting>
+
+ <para>The <literal>Location</literal> header points to the
JMS
+ consumer resource that was created on the server. It is good to
+ remember this URL, although, as you'll see later, it is
+ transmitted with each response just to remind you.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>Creating an manually-acknowledged consumer for a topic is pretty
+ much the same. Here's an example of creating a durable
+ manually-acknowledged topic pull subscription.</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Find the <literal>pull-subscriptions</literal> URL by
doing
+ a HEAD or GET request to the base topic resource</para>
+
+ <programlisting>HEAD /topics/jms.topic.bar HTTP/1.1
+ Host:
example.com
+
+ --- Response ---
+ HTTP/1.1 200 Ok
+ msg-create:
http://example.com/topics/jms.topic.foo/create
+ msg-pull-subscriptions:
http://example.com/topics/jms.topic.foo/pull-subscriptions
+ msg-push-subscriptions:
http://example.com/topics/jms.topic.foo/push-subscriptions
+ </programlisting>
+ </listitem>
+
+ <listitem>
+ <para>Next do a POST to the URL returned in the
+ <literal>msg-pull-subscriptions</literal> header passing in a
+ <literal>true</literal> value for the
<literal>durable</literal>
+ form parameter and a <literal>false</literal> value to the
+ <literal>autoAck</literal> form parameter.</para>
+
+ <programlisting>POST /topics/jms.topic.foo/pull-subscriptions HTTP/1.1
+ Host:
example.com
+ Content-Type: application/x-www-form-urlencoded
+
+ durable=true&autoAck=false
+
+ --- Response ---
+ HTTP/1.1 201 Created
+ Location:
http://example.com/topics/jms.topic.foo/pull-subscriptions/acknowledged/222
+ msg-acknowledge-next:
http://example.com/topics/jms.topic.foo/pull-subscriptions/acknowledged/2...
+ </programlisting>
+
+ <para>The <literal>Location</literal> header points to the
JMS
+ subscription resource that was created on the server. It is good
+ to remember this URL, although, as you'll see later, it is
+ transmitted with each response just to remind you.</para>
+ </listitem>
+ </orderedlist>
+ </sect2>
+
+ <sect2>
+ <title>Consuming and Acknowledging a Message</title>
+
+ <para>After you have created a consumer resource, you are ready to
+ start pulling messages from the server. Notice that when you created
+ the consumer for either the queue or topic, the response contained a
+ <literal>msg-acknowledge-next</literal> response header. POST to the
+ URL contained within this header to consume the next message in the
+ queue or topic subscription. If there are no messages in the queue or
+ topic subscription, a 503 (Service Unavailable) HTTP code is returned.
+ A successful POST causes the server to extract a message from the
+ queue or topic subscription and return it to the consuming client. It
+ does not acknowledge the message though. The response will contain the
+ <literal>acknowledgement</literal> header which you will use to
+ acknowledge the message.</para>
+
+ <para>Here's an example of pulling multiple messages from the consumer
+ resource.</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Do a POST on the msg-acknowledge-next URL that was returned
+ with the consumer or subscription resource discussed
+ earlier.</para>
+
+ <programlisting>POST /queues/jms.queue.bar/pull-consumers/consume-next-1
+ Host:
example.com
+
+ --- Response ---
+ HTTP/1.1 200 Ok
+ Content-Type: application/xml
+ msg-acknowledgement:
http://example.com/queues/jms.queue.bar/pull-consumers/333/acknowledgement/2
+ msg-consumer:
http://example.com/queues/jms.queue.bar/pull-consumers/333
+
+ <order>...</order>
+ </programlisting>
+
+ <para>The POST returns the message consumed from the queue. It
+ also returns a <literal>msg-acknowledgemen</literal>t link. You
+ will use this new link to acknowledge the message. Notice also a
+ <literal>msg-consumer</literal> response header is returned. This
+ is a URL that points back to the consumer or subscription
+ resource. You will need that to clean up your connection after you
+ are finished using the queue or topic.</para>
+ </listitem>
+
+ <listitem>
+ <para>Acknowledge or unacknowledge the message by doing a POST to
+ the URL contained in the <literal>msg-acknowledgement</literal>
+ header. You must pass an <literal>acknowledge</literal> form
+ parameter set to <literal>true</literal> or
+ <literal>false</literal> depending on whether you want to
+ acknowledge or unacknowledge the message on the server.</para>
+
+ <programlisting>POST
/queues/jms.queue.bar/pull-consumers/acknowledgement/2
+ Host:
example.com
+ Content-Type: application/x-www-form-urlencoded
+
+ acknowledge=true
+
+ --- Response ---
+ Http/1.1 200 Ok
+ msg-acknowledge-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/acknowledge-ne...
+ </programlisting>
+
+ <para>Whether you acknowledge or unacknowledge the message, the
+ response will contain a new msg-acknowledge-next header that you
+ must use to obtain the next message.</para>
+ </listitem>
+ </orderedlist>
+ </sect2>
+
+ <sect2>
+ <title>Recovering From Network Failures</title>
+
+ <para>If you experience a network failure and do not know if your post
+ to a <literal>msg-acknowledge-next</literal> or
+ <literal>msg-acknowledgement</literal> URL was successful or not, just
+ re-do your POST. A POST to one of these URLs is idempotent, meaning
+ that it will return the same result if you re-post. Behind the scenes,
+ the consumer resource keeps track of its current state. If the last
+ action was a call to <literal>msg-acknowledge-next</literal>, it will
+ have the last message cached, so that if a re-post is done, it will
+ return the message again. Same goes with re-posting to
+ <literal>msg-acknowledgement</literal>. The server remembers its last
+ state and will return the same results. If you look at the URLs you'll
+ see that they contain information about the expected current state of
+ the server. This is how the server knows what the client is
+ expecting.</para>
+ </sect2>
+
+ <sect2>
+ <title>Recovering From Client or Server Crashes</title>
+
+ <para>If the server crashes and while you are doing a POST to the
+ <literal>msg-acknowledge-next</literal> URL, just re-post. Everything
+ should reconnect all right. On the other hand, if the server crashes
+ while you are doing a POST to <literal>msg-acknowledgement</literal>,
+ the server will return a 412 (Preconditions Failed) response code.
+ This is telling you that the URL you are using is out of sync with the
+ server and the message you are acknowledging was probably re-enqueued.
+ The response will contain a new
+ <literal>msg-acknowledge-next</literal> header to invoke
on.</para>
+
+ <para>As long as you have "bookmarked" the consumer resource URL
+ (returned from <literal>Location</literal> header on a create, or the
+ <literal>msg-consumer</literal> header), you can recover from client
+ crashes by doing a GET or HEAD request on the consumer resource to
+ obtain what state you are in. If the consumer resource is expecting
+ you to acknowledge a message, it will return a
+ <literal>msg-acknowledgement</literal> header in the response. If the
+ consumer resource is expecting you to pull for the next message, the
+ <literal>msg-acknowledge-next</literal> header will be in the
+ response. With manual acknowledgement you are pretty much guaranteed
+ to avoid skipped messages. For topic subscriptions that were created
+ with a name parameter, you do not have to "bookmark" the returned URL.
+ Instead, you can re-create the consumer resource with the same exact
+ name. The response will contain the same information as if you did a
+ GET or HEAD request on the consumer resource.</para>
+ </sect2>
+ </sect1>
+
+ <sect1>
+ <title>Blocking Pulls with Accept-Wait</title>
+
+ <para>Unless your queue or topic has a high rate of message flowing
+ though it, if you use the pull protocol, you're going to be receiving a
+ lot of 503 responses as you continuously pull the server for new
+ messages. To alleviate this problem, the HornetQ REST interface provides
+ the <literal>Accept-Wait</literal> header. This is a generic HTTP
+ request header that is a hint to the server for how long the client is
+ willing to wait for a response from the server. The value of this header
+ is the time in seconds the client is willing to block for. You would
+ send this request header with your pull requests. Here's an
+ example:</para>
+
+ <programlisting>POST /queues/jms.queue.bar/pull-consumers/consume-next-2
+ Host:
example.com
+ Accept-Wait: 30
+
+ --- Response ---
+ HTTP/1.1 200 Ok
+ Content-Type: application/xml
+ msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/consume-next-3
+
+ <order>...</order></programlisting>
+
+ <para>In this example, we're posting to a msg-consume-next URL and
+ telling the server that we would be willing to block for 30
+ seconds.</para>
+ </sect1>
+
+ <sect1>
+ <title>Clean Up Your Consumers!</title>
+
+ <para>When the client is done with its consumer or topic subscription it
+ should do an HTTP DELETE call on the consumer URL passed back from the
+ Location header or the msg-consumer response header. The server will
+ time out a consumer with the value configured from Chapter 2.3, so you
+ don't have to clean up if you dont' want to, but if you are a good kid,
+ you will clean up your messes. A consumer timeout for durable
+ subscriptions will not delete the underlying durable JMS subscription
+ though, only the server-side consumer resource (and underlying JMS
+ session).</para>
+ </sect1>
+</chapter>
Added: trunk/docs/rest-manual/en/creating-destinations.xml
===================================================================
--- trunk/docs/rest-manual/en/creating-destinations.xml (rev 0)
+++ trunk/docs/rest-manual/en/creating-destinations.xml 2011-04-19 10:32:50 UTC (rev
10529)
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+
+<chapter>
+ <title>Creating Destinations</title>
+
+ <para>You can create a durable queue or topic through the REST interface.
+ Currently you cannot create a temporary queue or topic. To create a queue
+ you do a POST to the relative URL /queues with an XML representation of
+ the queue. The XML syntax is the same queue syntax that you would specify
+ in hornetq-jms.xml if you were creating a queue there. For example:</para>
+
+ <programlisting>POST /queues
+ Host:
example.com
+ Content-Type: application/hornetq.jms.queue+xml
+
+ <queue name="testQueue">
+ <durable>true</durable>
+ </queue>
+
+ --- Response ---
+ HTTP/1.1 201 Created
+ Location:
http://example.com/queues/jms.queue.testQueue
+ </programlisting>
+
+ <para>Notice that the Content-Type is
+ application/hornetq.jms.queue+xml.</para>
+
+ <para>Here's what creating a topic would look like:</para>
+
+ <programlisting>POST /topics
+ Host:
example.com
+ Content-Type: application/hornetq.jms.topic+xml
+
+ <topic name="testTopic">
+ </topic>
+
+ --- Response ---
+ HTTP/1.1 201 Created
+ Location:
http://example.com/topics/jms.topic.testTopic</programlisting>
+</chapter>
Copied: trunk/docs/rest-manual/en/installation.xml (from rev 10511,
trunk/docs/quickstart-guide/en/installation.xml)
===================================================================
--- trunk/docs/rest-manual/en/installation.xml (rev 0)
+++ trunk/docs/rest-manual/en/installation.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,352 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+<chapter>
+ <title>Installation and Configuration</title>
+
+ <para>HornetQ's REST interface is installed as a Web archive (WAR). It
+ depends on the <ulink
url="http://jboss.org/resteasy">RESTEasy</ulink>
+ project and can currently only run within a servlet container. Installing
+ the HornetQ REST interface is a little bit different depending whether
+ HornetQ is already installed and configured for your environment (i.e.
+ you're deploying within JBoss 6 AppServer) or you want the HornetQ REST
+ WAR to startup and manage the HornetQ server.</para>
+
+ <sect1>
+ <title>Installing Within Pre-configured Environment</title>
+
+ <para>The section should be used when you want to use the HornetQ REST
+ interface in an environment that already has HornetQ installed and
+ running, i.e. JBoss 6 Application Server. You must create a Web archive
+ (.WAR) file with the following web.xml settings:</para>
+
+ <programlisting><web-app>
+ <listener>
+
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
+ </listener>
+
+ <listener>
+
<listener-class>org.hornetq.rest.integration.RestMessagingBootstrapListener</listener-class>
+ </listener>
+
+ <filter>
+ <filter-name>Rest-Messaging</filter-name>
+ <filter-class>
+ org.jboss.resteasy.plugins.server.servlet.FilterDispatcher
+ </filter-class>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>Rest-Messaging</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+</web-app</programlisting>
+
+ <para>Within your WEB-INF/lib directory you must have the
+ hornetq-rest.jar file. If RESTEasy is not installed within your
+ environment, you must add the RESTEasy jar files within the lib
+ directory as well. Here's a sample Maven pom.xml that can build your WAR
+ for this case.</para>
+
+ <programlisting><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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.somebody</groupId>
+ <artifactId>myapp</artifactId>
+ <packaging>war</packaging>
+ <name>My App</name>
+ <repositories>
+ <repository>
+ <id>jboss</id>
+
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
+ </repository>
+ </repositories>
+
+
+ <build>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+
<artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.hornetq.rest</groupId>
+ <artifactId>hornetq-rest</artifactId>
+ <version>2.2.0</version>
+ </dependency>
+ </dependencies>
+</project>
+</programlisting>
+
+ <para></para>
+ </sect1>
+
+ <sect1>
+ <title>Bootstrapping HornetQ Along with REST</title>
+
+ <para>You can bootstrap HornetQ within your WAR as well. To do this, you
+ must have the HornetQ core and JMS jars along with Netty, Resteasy, and
+ the HornetQ REST jar within your WEB-INF/lib. You must also have a
+ hornetq-configuration.xml, hornetq-jms.xml, and hornetq-users.xml config
+ files within WEB-INF/classes. The examples that come with the HornetQ
+ REST distribution show how to do this. You must also add an additional
+ listener to your web.xml file. Here's an example:</para>
+
+ <programlisting><web-app>
+ <listener>
+
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
+ </listener>
+
+
+ <listener>
+
<listener-class>org.hornetq.rest.integration.HornetqBootstrapListener</listener-class>
+ </listener>
+
+ <listener>
+
<listener-class>org.hornetq.rest.integration.RestMessagingBootstrapListener</listener-class>
+ </listener>
+
+ <filter>
+ <filter-name>Rest-Messaging</filter-name>
+ <filter-class>
+ org.jboss.resteasy.plugins.server.servlet.FilterDispatcher
+ </filter-class>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>Rest-Messaging</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+</web-app></programlisting>
+
+ <para>Here's a Maven pom.xml file for creating a WAR for this
+ environment. Make sure your hornetq configuration files are within the
+ src/main/resources directory so that they are stuffed within the WAR's
+ WEB-INF/classes directory!</para>
+
+ <programlisting><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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.somebody</groupId>
+ <artifactId>myapp</artifactId>
+ <packaging>war</packaging>
+ <name>My App</name>
+ <repositories>
+ <repository>
+ <id>jboss</id>
+
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
+ </repository>
+ </repositories>
+ <build>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+
<artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.hornetq</groupId>
+ <artifactId>hornetq-core</artifactId>
+ <version>2.1.1.GA</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.netty</groupId>
+ <artifactId>netty</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hornetq</groupId>
+ <artifactId>hornetq-jms</artifactId>
+ <version>2.1.1.GA</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.spec.javax.jms</groupId>
+ <artifactId>jboss-jms-api_1.1_spec</artifactId>
+ <version>1.0.0.Beta1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.hornetq.rest</groupId>
+ <artifactId>hornetq-rest</artifactId>
+ <version>2.2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxrs</artifactId>
+ <version>2.0.1.GA</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxb-provider</artifactId>
+ <version>2.0.1.GA</version>
+ </dependency>
+ </dependencies>
+</project></programlisting>
+
+ <para></para>
+ </sect1>
+
+ <sect1>
+ <title>REST Configuration</title>
+
+ <para>The HornetQ REST implementation does have some configuration
+ options. These are configured via XML configuration file that must be in
+ your WEB-INF/classes directory. You must set the web.xml context-param
+ <literal>rest.messaging.config.file</literal> to specify the name of
the
+ configuration file. Below is the format of the XML configuration file
+ and the default values for each.</para>
+
+ <programlisting><rest-messaging>
+ <server-in-vm-id>0</server-in-vm-id>
+ <use-link-headers>false</use-link-headers>
+ <default-durable-send>false</default-durable-send>
+ <dups-ok>true</dups-ok>
+
<topic-push-store-dir>topic-push-store</topic-push-store-dir>
+
<queue-push-store-dir>queue-push-store</queue-push-store-dir>
+ <producer-time-to-live>0</producer-time-to-live>
+
<producer-session-pool-size>10</producer-session-pool-size>
+
<session-timeout-task-interval>1</session-timeout-task-interval>
+
<consumer-session-timeout-seconds>300</consumer-session-timeout-seconds>
+ <consumer-window-size>-1</consumer-window-size>
+</rest-messaging
+</programlisting>
+
+ <para>Let's give an explanation of each config option.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>server-in-vm-id</term>
+
+ <listitem>
+ <para>The HornetQ REST impl uses the IN-VM transport to
+ communicate with HornetQ. It uses the default server id, which is
+ "0".</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>use-link-headers</term>
+
+ <listitem>
+ <para>By default, all links (URLs) are published using custom
+ headers. You can instead have the HornetQ REST implementation
+ publish links using the <ulink
+
url="http://tools.ietf.org/html/draft-nottingham-http-link-header-10...
+ Header specification</ulink> instead if you desire.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>default-durable-send</term>
+
+ <listitem>
+ <para>Whether a posted message should be persisted by default if
+ the user does not specify a durable query parameter.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>dups-ok</term>
+
+ <listitem>
+ <para>If this is true, no duplicate detection protocol will be
+ enforced for message posting.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>topic-push-store-dir</term>
+
+ <listitem>
+ <para>This must be a relative or absolute file system path. This
+ is a directory where push registrations for topics are stored. See
+ Chapter 6.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>queue-push-store-dir</term>
+
+ <listitem>
+ <para>This must be a relative or absolute file system path. This
+ is a directory where push registrations for queues are stored. See
+ Chapter 6.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>producer-session-pool-size</term>
+
+ <listitem>
+ <para>The REST implementation pools HornetQ sessions for sending
+ messages. This is the size of the pool. That number of sessions
+ will be created at startup time.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>producer-time-to-live</term>
+
+ <listitem>
+ <para>Default time to live for posted messages. Default is no
+ ttl.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>session-timeout-task-interval</term>
+
+ <listitem>
+ <para>Pull consumers and pull subscriptions can time out. This is
+ the interval the thread that checks for timed-out sessions will
+ run at. A value of 1 means it will run every 1 second.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>consumer-session-timeout-seconds</term>
+
+ <listitem>
+ <para>Timeout in seconds for pull consumers/subscriptions that
+ remain idle for that amount of time.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>consumer-window-size</term>
+
+ <listitem>
+ <para>For consumers, this config option is the same as the HornetQ
+ one of the same name. It will be used by sessions created by the
+ HornetQ REST implementation.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+ </chapter>
\ No newline at end of file
Copied: trunk/docs/rest-manual/en/introduction.xml (from rev 10511,
trunk/docs/quickstart-guide/en/introduction.xml)
===================================================================
--- trunk/docs/rest-manual/en/introduction.xml (rev 0)
+++ trunk/docs/rest-manual/en/introduction.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+<chapter>
+ <title>Introduction</title>
+
+ <para>The HornetQ REST interface allows you to leverage the reliability
+ and scalability features of HornetQ over a simple REST/HTTP interface.
+ Messages are produced and consumed by sending and receiving simple HTTP
+ messages that contain the content you want to push around. For instance,
+ here's a simple example of posting an order to an order processing queue
+ express as an HTTP message:</para>
+
+ <para><programlisting>POST /queue/orders/create HTTP/1.1
+Host:
example.com
+Content-Type: application/xml
+
+<order>
+ <name>Bill</name>
+ <item>iPhone 4</item>
+ <cost>$199.99</cost>
+</order>
+</programlisting>As you can see, we're just posting some arbitrary XML
+ document to a URL. When the XML is received on the server is it processed
+ within HornetQ as a JMS message and distributed through core HornetQ.
+ Simple and easy. Consuming messages from a queue or topic looks very
+ similar. We'll discuss the entire interface in detail later in this
+ docbook.</para>
+
+ <para></para>
+
+ <sect1>
+ <title>Goals of REST Interface</title>
+
+ <para>Why would you want to use HornetQ's REST interface? What are the
+ goals of the REST interface?</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Easily usable by machine-based (code) clients.</para>
+ </listitem>
+
+ <listitem>
+ <para>Zero client footprint. We want HornetQ to be usable by any
+ client/programming language that has an adequate HTTP client
+ library. You shouldn't have to download, install, and configure a
+ special library to interact with HornetQ.</para>
+ </listitem>
+
+ <listitem>
+ <para>Lightweight interoperability. The HTTP protocol is strong
+ enough to be our message exchange protocol. Since interactions are
+ RESTful the HTTP uniform interface provides all the interoperability
+ you need to communicate between different languages, platforms, and
+ even messaging implementations that choose to implement the same
+ RESTful interface as HornetQ (i.e. the <ulink
+ url="http://rest-star.org">REST-*</ulink>
effort.)</para>
+ </listitem>
+
+ <listitem>
+ <para>No envelope (i.e. SOAP) or feed (i.e. Atom) format
+ requirements. You shouldn't have to learn, use, or parse a specific
+ XML document format in order to send and receive messages through
+ HornetQ's REST interface.</para>
+ </listitem>
+
+ <listitem>
+ <para>Leverage the reliability, scalability, and clustering features
+ of HornetQ on the back end without sacrificing the simplicity of a
+ REST interface.</para>
+
+ <para></para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+ </chapter>
Added: trunk/docs/rest-manual/en/jms-and-rest.xml
===================================================================
--- trunk/docs/rest-manual/en/jms-and-rest.xml (rev 0)
+++ trunk/docs/rest-manual/en/jms-and-rest.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+<chapter>
+ <title>Mixing JMS and REST</title>
+
+ <para>The HornetQ REST interface supports mixing JMS and REST producres
+ and consumers. You can send an ObjectMessage through a JMS Producer, and
+ have a REST client consume it. You can have a REST client POST a message
+ to a topic and have a JMS Consumer receive it. Some simple transformations
+ are supported if you have the correct RESTEasy providers installed.</para>
+
+ <sect1>
+ <title>JMS Producers - REST Consumers</title>
+
+ <para>If you have a JMS producer, the HornetQ REST interface only
+ supports ObjectMessage type. If the JMS producer is aware that there may
+ be REST consumers, it should set a JMS property to specify what
+ Content-Type the Java object should be translated into by REST clients.
+ The HornetQ REST server will use RESTEasy content handlers
+ (MessageBodyReader/Writers) to transform the Java object to the type
+ desired. Here's an example of a JMS producer setting the content type of
+ the message.</para>
+
+ <programlisting>ObjectMessage message = session.createObjectMessage();
+message.setStringProperty(org.hornetq.rest.HttpHeaderProperty.CONTENT_TYPE,
"application/xml");
+</programlisting>
+
+ <para>If the JMS producer does not set the content-type, then this
+ information must be obtained from the REST consumer. If it is a pull
+ consumer, then the REST client should send an Accept header with the
+ desired media types it wants to convert the Java object into. If the
+ REST client is a push registration, then the type attribute of the link
+ element of the push registration should be set to the desired
+ type.</para>
+ </sect1>
+
+ <sect1>
+ <title>REST Producers - JMS Consumers</title>
+
+ <para>If you have a REST client producing messages and a JMS consumer,
+ HornetQ REST has a simple helper class for you to transform the HTTP
+ body to a Java object. Here's some example code:</para>
+
+ <programlisting>public void onMessage(Message message)
+{
+ MyType obj = org.hornetq.rest.Jms.getEntity(message, MyType.class);
+}
+</programlisting>
+
+ <para>The way the <literal>getEntity()</literal> method works is
that if
+ the message is an ObjectMessage, it will try to extract the desired type
+ from it like any other JMS message. If a REST producer sent the message,
+ then the method uses RESTEasy to convert the HTTP body to the Java
+ object you want. See the Javadoc of this class for more helper
+ methods.</para>
+ </sect1>
+ </chapter>
\ No newline at end of file
Modified: trunk/docs/rest-manual/en/master.xml
===================================================================
--- trunk/hornetq-rest/docbook/reference/en/master.xml 2011-04-14 16:17:29 UTC (rev
10511)
+++ trunk/docs/rest-manual/en/master.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -20,1994 +20,14 @@
<para></para>
</preface>
- <chapter>
- <title>Introduction</title>
- <para>The HornetQ REST interface allows you to leverage the reliability
- and scalability features of HornetQ over a simple REST/HTTP interface.
- Messages are produced and consumed by sending and receiving simple HTTP
- messages that contain the content you want to push around. For instance,
- here's a simple example of posting an order to an order processing queue
- express as an HTTP message:</para>
- <para><programlisting>POST /queue/orders/create HTTP/1.1
-Host:
example.com
-Content-Type: application/xml
-<order>
- <name>Bill</name>
- <item>iPhone 4</item>
- <cost>$199.99</cost>
-</order>
-</programlisting>As you can see, we're just posting some arbitrary XML
- document to a URL. When the XML is received on the server is it processed
- within HornetQ as a JMS message and distributed through core HornetQ.
- Simple and easy. Consuming messages from a queue or topic looks very
- similar. We'll discuss the entire interface in detail later in this
- docbook.</para>
- <para></para>
- <sect1>
- <title>Goals of REST Interface</title>
- <para>Why would you want to use HornetQ's REST interface? What are the
- goals of the REST interface?</para>
- <itemizedlist>
- <listitem>
- <para>Easily usable by machine-based (code) clients.</para>
- </listitem>
- <listitem>
- <para>Zero client footprint. We want HornetQ to be usable by any
- client/programming language that has an adequate HTTP client
- library. You shouldn't have to download, install, and configure a
- special library to interact with HornetQ.</para>
- </listitem>
- <listitem>
- <para>Lightweight interoperability. The HTTP protocol is strong
- enough to be our message exchange protocol. Since interactions are
- RESTful the HTTP uniform interface provides all the interoperability
- you need to communicate between different languages, platforms, and
- even messaging implementations that choose to implement the same
- RESTful interface as HornetQ (i.e. the <ulink
- url="http://rest-star.org">REST-*</ulink>
effort.)</para>
- </listitem>
- <listitem>
- <para>No envelope (i.e. SOAP) or feed (i.e. Atom) format
- requirements. You shouldn't have to learn, use, or parse a specific
- XML document format in order to send and receive messages through
- HornetQ's REST interface.</para>
- </listitem>
-
- <listitem>
- <para>Leverage the reliability, scalability, and clustering features
- of HornetQ on the back end without sacrificing the simplicity of a
- REST interface.</para>
-
- <para></para>
- </listitem>
- </itemizedlist>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Installation and Configuration</title>
-
- <para>HornetQ's REST interface is installed as a Web archive (WAR). It
- depends on the <ulink
url="http://jboss.org/resteasy">RESTEasy</ulink>
- project and can currently only run within a servlet container. Installing
- the HornetQ REST interface is a little bit different depending whether
- HornetQ is already installed and configured for your environment (i.e.
- you're deploying within JBoss 6 AppServer) or you want the HornetQ REST
- WAR to startup and manage the HornetQ server.</para>
-
- <sect1>
- <title>Installing Within Pre-configured Environment</title>
-
- <para>The section should be used when you want to use the HornetQ REST
- interface in an environment that already has HornetQ installed and
- running, i.e. JBoss 6 Application Server. You must create a Web archive
- (.WAR) file with the following web.xml settings:</para>
-
- <programlisting><web-app>
- <listener>
-
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
- </listener>
-
- <listener>
-
<listener-class>org.hornetq.rest.integration.RestMessagingBootstrapListener</listener-class>
- </listener>
-
- <filter>
- <filter-name>Rest-Messaging</filter-name>
- <filter-class>
- org.jboss.resteasy.plugins.server.servlet.FilterDispatcher
- </filter-class>
- </filter>
-
- <filter-mapping>
- <filter-name>Rest-Messaging</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
-</web-app</programlisting>
-
- <para>Within your WEB-INF/lib directory you must have the
- hornetq-rest.jar file. If RESTEasy is not installed within your
- environment, you must add the RESTEasy jar files within the lib
- directory as well. Here's a sample Maven pom.xml that can build your WAR
- for this case.</para>
-
- <programlisting><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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.somebody</groupId>
- <artifactId>myapp</artifactId>
- <packaging>war</packaging>
- <name>My App</name>
- <repositories>
- <repository>
- <id>jboss</id>
-
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
- </repository>
- </repositories>
-
-
- <build>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>org.hornetq.rest</groupId>
- <artifactId>hornetq-rest</artifactId>
- <version>2.2.0</version>
- </dependency>
- </dependencies>
-</project>
-</programlisting>
-
- <para></para>
- </sect1>
-
- <sect1>
- <title>Bootstrapping HornetQ Along with REST</title>
-
- <para>You can bootstrap HornetQ within your WAR as well. To do this, you
- must have the HornetQ core and JMS jars along with Netty, Resteasy, and
- the HornetQ REST jar within your WEB-INF/lib. You must also have a
- hornetq-configuration.xml, hornetq-jms.xml, and hornetq-users.xml config
- files within WEB-INF/classes. The examples that come with the HornetQ
- REST distribution show how to do this. You must also add an additional
- listener to your web.xml file. Here's an example:</para>
-
- <programlisting><web-app>
- <listener>
-
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
- </listener>
-
-
- <listener>
-
<listener-class>org.hornetq.rest.integration.HornetqBootstrapListener</listener-class>
- </listener>
-
- <listener>
-
<listener-class>org.hornetq.rest.integration.RestMessagingBootstrapListener</listener-class>
- </listener>
-
- <filter>
- <filter-name>Rest-Messaging</filter-name>
- <filter-class>
- org.jboss.resteasy.plugins.server.servlet.FilterDispatcher
- </filter-class>
- </filter>
-
- <filter-mapping>
- <filter-name>Rest-Messaging</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
-</web-app></programlisting>
-
- <para>Here's a Maven pom.xml file for creating a WAR for this
- environment. Make sure your hornetq configuration files are within the
- src/main/resources directory so that they are stuffed within the WAR's
- WEB-INF/classes directory!</para>
-
- <programlisting><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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.somebody</groupId>
- <artifactId>myapp</artifactId>
- <packaging>war</packaging>
- <name>My App</name>
- <repositories>
- <repository>
- <id>jboss</id>
-
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
- </repository>
- </repositories>
- <build>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>org.hornetq</groupId>
- <artifactId>hornetq-core</artifactId>
- <version>2.1.1.GA</version>
- </dependency>
- <dependency>
- <groupId>org.jboss.netty</groupId>
- <artifactId>netty</artifactId>
- </dependency>
- <dependency>
- <groupId>org.hornetq</groupId>
- <artifactId>hornetq-jms</artifactId>
- <version>2.1.1.GA</version>
- </dependency>
- <dependency>
- <groupId>org.jboss.spec.javax.jms</groupId>
- <artifactId>jboss-jms-api_1.1_spec</artifactId>
- <version>1.0.0.Beta1</version>
- </dependency>
- <dependency>
- <groupId>org.hornetq.rest</groupId>
- <artifactId>hornetq-rest</artifactId>
- <version>2.2.0</version>
- </dependency>
- <dependency>
- <groupId>org.jboss.resteasy</groupId>
- <artifactId>resteasy-jaxrs</artifactId>
- <version>2.0.1.GA</version>
- </dependency>
- <dependency>
- <groupId>org.jboss.resteasy</groupId>
- <artifactId>resteasy-jaxb-provider</artifactId>
- <version>2.0.1.GA</version>
- </dependency>
- </dependencies>
-</project></programlisting>
-
- <para></para>
- </sect1>
-
- <sect1>
- <title>REST Configuration</title>
-
- <para>The HornetQ REST implementation does have some configuration
- options. These are configured via XML configuration file that must be in
- your WEB-INF/classes directory. You must set the web.xml context-param
- <literal>rest.messaging.config.file</literal> to specify the name of
the
- configuration file. Below is the format of the XML configuration file
- and the default values for each.</para>
-
- <programlisting><rest-messaging>
- <server-in-vm-id>0</server-in-vm-id>
- <use-link-headers>false</use-link-headers>
- <default-durable-send>false</default-durable-send>
- <dups-ok>true</dups-ok>
-
<topic-push-store-dir>topic-push-store</topic-push-store-dir>
-
<queue-push-store-dir>queue-push-store</queue-push-store-dir>
- <producer-time-to-live>0</producer-time-to-live>
-
<producer-session-pool-size>10</producer-session-pool-size>
-
<session-timeout-task-interval>1</session-timeout-task-interval>
-
<consumer-session-timeout-seconds>300</consumer-session-timeout-seconds>
- <consumer-window-size>-1</consumer-window-size>
-</rest-messaging
-</programlisting>
-
- <para>Let's give an explanation of each config option.</para>
-
- <variablelist>
- <varlistentry>
- <term>server-in-vm-id</term>
-
- <listitem>
- <para>The HornetQ REST impl uses the IN-VM transport to
- communicate with HornetQ. It uses the default server id, which is
- "0".</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>use-link-headers</term>
-
- <listitem>
- <para>By default, all links (URLs) are published using custom
- headers. You can instead have the HornetQ REST implementation
- publish links using the <ulink
-
url="http://tools.ietf.org/html/draft-nottingham-http-link-header-10...
- Header specification</ulink> instead if you desire.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>default-durable-send</term>
-
- <listitem>
- <para>Whether a posted message should be persisted by default if
- the user does not specify a durable query parameter.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>dups-ok</term>
-
- <listitem>
- <para>If this is true, no duplicate detection protocol will be
- enforced for message posting.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>topic-push-store-dir</term>
-
- <listitem>
- <para>This must be a relative or absolute file system path. This
- is a directory where push registrations for topics are stored. See
- Chapter 6.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>queue-push-store-dir</term>
-
- <listitem>
- <para>This must be a relative or absolute file system path. This
- is a directory where push registrations for queues are stored. See
- Chapter 6.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>producer-session-pool-size</term>
-
- <listitem>
- <para>The REST implementation pools HornetQ sessions for sending
- messages. This is the size of the pool. That number of sessions
- will be created at startup time.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>producer-time-to-live</term>
-
- <listitem>
- <para>Default time to live for posted messages. Default is no
- ttl.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>session-timeout-task-interval</term>
-
- <listitem>
- <para>Pull consumers and pull subscriptions can time out. This is
- the interval the thread that checks for timed-out sessions will
- run at. A value of 1 means it will run every 1 second.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>consumer-session-timeout-seconds</term>
-
- <listitem>
- <para>Timeout in seconds for pull consumers/subscriptions that
- remain idle for that amount of time.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>consumer-window-size</term>
-
- <listitem>
- <para>For consumers, this config option is the same as the HornetQ
- one of the same name. It will be used by sessions created by the
- HornetQ REST implementation.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
- </chapter>
-
- <chapter>
- <title>HornetQ REST Interface Basics</title>
-
- <para>The HornetQ REST interface publishes a variety of REST resources to
- perform various tasks on a queue or topic. Only the top-level queue and
- topic URI schemes are published to the outside world. You must discover
- all over resources to interact with by looking for and traversing links.
- You'll find published links within custom response headers and embedded in
- published XML representations. Let's look at how this works.</para>
-
- <sect1>
- <title>Queue and Topic Resources</title>
-
- <para>To interact with a queue or topic you do a HEAD or GET request on
- the following relative URI pattern:</para>
-
- <programlisting>/queues/{name}
-/topics/{name}
-</programlisting>
-
- <para>The base of the URI is the base URL of the WAR you deployed the
- HornetQ REST server within as defined in the Installation and
- Configuration section of this document. Replace the
- <literal>{name}</literal> string within the above URI pattern with the
- name of the queue or topic you are interested in interacting with. For
- example if you have configured a JMS topic named "foo" within your
- <literal>hornetq-jms.xml</literal> file, the URI name should be
- "jms.topic.foo". If you have configured a JMS queue name "bar"
within
- your <literal>hornetq-jms.xml</literal> file, the URI name should be
- "jms.queue.bar". Internally, HornetQ prepends the "jms.topic"
or
- "jms.queue" strings to the name of the deployed destination. Next,
- perform your HEAD or GET request on this URI. Here's what a
- request/response would look like.</para>
-
- <programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/queues/jms.queue.bar/create
-msg-pull-consumers:
http://example.com/queues/jms.queue.bar/pull-consumers
-msg-push-consumers:
http://example.com/queues/jms.queue.bar/push-consumers
-</programlisting>
-
- <para>The HEAD or GET response contains a number of custom response
- headers that are URLs to additional REST resources that allow you to
- interact with the queue or topic in different ways. It is important not
- to rely on the scheme of the URLs returned within these headers as they
- are an implementation detail. Treat them as opaque and query for them
- each and every time you initially interact (at boot time) with the
- server. If you treat all URLs as opaque then you will be isolated from
- implementation changes as the HornetQ REST interface evolves over
- time.</para>
-
- <para></para>
- </sect1>
-
- <sect1>
- <title>Queue Resource Response Headers</title>
-
- <para>Below is a list of response headers you should expect when
- interacting with a Queue resource.</para>
-
- <variablelist>
- <varlistentry>
- <term>msg-create</term>
-
- <listitem>
- <para>This is a URL you POST messages to. The semantics of this
- link are described in Chapter 4.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-create-with-id</term>
-
- <listitem>
- <para>This is a URL template you POST message to. The semantics of
- this link are described in Chapter 4.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-pull-consumers</term>
-
- <listitem>
- <para>This is a URL for creating consumers that will pull from a
- queue. The semantics of this link are described in Chapter
- 5.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-push-consumers</term>
-
- <listitem>
- <para>This is a URL for registering other URLs you want the
- HornetQ REST server to push messages to. The semantics of this
- link are described in Chapter 6</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1>
- <title>Topic Resource Respones Headers</title>
-
- <para>Below is a list of response headers you should expect when
- interacting with a Topic resource.</para>
-
- <variablelist>
- <varlistentry>
- <term>msg-create</term>
-
- <listitem>
- <para>This is a URL you POST messages to. The semantics of this
- link are described in Chapter 4.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-create-with-id</term>
-
- <listitem>
- <para>This is a URL template you POST messages to. The semantics
- of this link are described in Chapter 4.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-pull-subscriptions</term>
-
- <listitem>
- <para>This is a URL for creating subscribers that will pull from a
- topic. The semantics of this link are described in Chapter
- 5.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-push-subscriptions</term>
-
- <listitem>
- <para>This is a URL for registering other URLs you want the
- HornetQ REST server to push messages to. The semantics of this
- link are described in Chapter 6.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para></para>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Posting Messages</title>
-
- <para>This chapter discusses the protocol for posting messages to a queue
- or a topic. In Chapter 3, you saw that a queue or topic resource publishes
- variable custom headers that are links to other RESTful resources. The
- <literal>msg-create</literal> header is the URL you post messages to.
- Messages are published to a queue or topic by sending a simple HTTP
- message to the URL published by the msg-create header. The HTTP message
- contains whatever content you want to publish to the HornetQ destination.
- Here's an example scenario:</para>
-
- <orderedlist>
- <listitem>
- <para>Obtain the starting <literal>msg-create</literal> header
from
- the queue or topic resource.</para>
-
- <para><programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/queues/jms.queue.bar/create
-msg-create-with-id:
http://example.com/queues/jms.queue.bar/create/{id}
-</programlisting></para>
- </listitem>
-
- <listitem>
- <para>Do a POST to the URL contained in the
- <literal>msg-create</literal> header.</para>
-
- <para><programlisting>POST /queues/jms.queue.bar/create
-Host:
example.com
-Content-Type: application/xml
-
-<order>
- <name>Bill</name>
- <item>iPhone4</name>
- <cost>$199.99</cost>
-</order>
-
---- Response ---
-HTTP/1.1 201 Created
-msg-create-next:
http://example.com/queues/jms.queue.bar/create/002
-</programlisting>A successful response will return a 201 response code. Also
- notice that a <literal>msg-create-next</literal> response header is
- sent as well. You must use this URL to POST your next message.</para>
- </listitem>
-
- <listitem>
- <para>POST your next message to the queue using the URL returned in
- the <literal>msg-create-next</literal> header.</para>
-
- <para><programlisting>POST /queues/jms.queue.bar/create/002
-Host:
example.com
-Content-Type: application/xml
-
-<order>
- <name>Monica</name>
- <item>iPad</item>
- <cost>$499.99</cost>
-</order>
-
---- Response --
-HTTP/1.1 201 Created
-msg-create-next:
http://example.com/queues/jms.queue.bar/create/003
-</programlisting>Continue using the new
<literal>msg-create-next</literal>
- header returned with each response.</para>
- </listitem>
- </orderedlist>
-
- <para>It is <emphasis>VERY IMPORTENT</emphasis> that you never
re-use
- returned <literal>msg-create-next</literal> headers to post new
messages.
- This URL may be uniquely generated for each message and used for duplicate
- detection. If you lose the URL within the
- <literal>msg-create-next</literal> header, then just go back to the
queue
- or topic resource to get the msg-create URL.</para>
-
- <sect1>
- <title>Duplicate Detection</title>
-
- <para>Sometimes you might have network problems when posting new
- messages to a queue or topic. You may do a POST and never receive a
- response. Unfortunately, you don't know whether or not the server
- received the message and so a re-post of the message might cause
- duplicates to be posted to the queue or topic. By default, the HornetQ
- REST interface is configured to accept and post duplicate messages. You
- can change this by turning on duplicate message detection by setting the
- <literal>dups-ok</literal> config option to
<literal>false</literal> as
- described in Chapter 3. When you do this, the initial POST to the
- msg-create URL will redirect you, using the standard HTTP 307
- redirection mechanism to a unique URL to POST to. All other interactions
- remain the same as discussed earlier. Here's an example:</para>
-
- <orderedlist>
- <listitem>
- <para>Obtain the starting <literal>msg-create</literal>
header from
- the queue or topic resource.</para>
-
- <para><programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/queues/jms.queue.bar/create
-msg-create-with-id:
http://example.com/queues/jms.queue.bar/create/{id}
-</programlisting></para>
- </listitem>
-
- <listitem>
- <para>Do a POST to the URL contained in the
- <literal>msg-create</literal> header.</para>
-
- <para><programlisting>POST /queues/jms.queue.bar/create
-Host:
example.com
-Content-Type: application/xml
-
-<order>
- <name>Bill</name>
- <item>iPhone4</name>
- <cost>$199.99</cost>
-</order>
-
---- Response ---
-HTTP/1.1 307 Redirect
-Location:
http://example.com/queues/jms.queue.bar/create/001
-</programlisting>A successful response will return a 307 response code. This
- is standard HTTP protocol. It is telling you that you must re-POST
- to the URL contained within the <literal>Location</literal>
- header.</para>
- </listitem>
-
- <listitem>
- <para>re-POST your message to the URL provided within the
- <literal>Location</literal>
header<literal>.</literal></para>
-
- <para><programlisting>POST /queues/jms.queue.bar/create/001
-Host:
example.com
-Content-Type: application/xml
-
-<order>
- <name>Bill</name>
- <item>iPhone4</name>
- <cost>$199.99</cost>
-</order>
-
---- Response --
-HTTP/1.1 201 Created
-msg-create-next:
http://example.com/queues/jms.queue.bar/create/002
-</programlisting>You should receive a 201 Created response. If there is a
- network failure, just re-POST to the Location header. For new
- messages, use the returned <literal>msg-create-next</literal>
header
- returned with each response.</para>
- </listitem>
-
- <listitem>
- <para>POST any new message to the returned
- <literal>msg-create-next</literal> header.</para>
-
- <para><programlisting>POST /queues/jms.queue.bar/create/002
-Host:
example.com
-Content-Type: application/xml
-
-<order>
- <name>Monica</name>
- <item>iPad</name>
- <cost>$499.99</cost>
-</order>
-
---- Response --
-HTTP/1.1 201 Created
-msg-create-next:
http://example.com/queues/jms.queue.bar/create/003</programlisting>If
- there ever is a network problem, just repost to the URL provided in
- the <literal>msg-create-next</literal> header.</para>
- </listitem>
- </orderedlist>
-
- <para>How can this work? As you can see, with each successful response,
- the HornetQ REST server returns a uniquely generated URL within the
- msg-create-next header. This URL is dedicated to the next new message
- you want to post. Behind the scenes, the code extracts an identify from
- the URL and uses HornetQ's duplicate detection mechanism by setting the
- <literal>DUPLICATE_DETECTION_ID</literal> property of the JMS message
- that is actually posted to the system.</para>
-
- <para>An alternative to this approach is to use the
- <literal>msg-create-with-id</literal> header. This is not an invokable
- URL, but a URL template. The idea is that the client provides the
- <literal>DUPLICATE_DETECTION_ID</literal> and creates it's own
- <literal>create-next</literal> URL. The
- <literal>msg-create-with-id</literal> header looks like this
(you've see
- it in previous examples, but we haven't used it):</para>
-
- <programlisting>msg-create-with-id:
http://example.com/queues/jms.queue.bar/create/{id}</programlisting>
-
- <para>You see that it is a regular URL appended with a
- <literal>{id}</literal>. This <literal>{id}</literal> is a
pattern
- matching substring. A client would generate its
- <literal>DUPLICATE_DETECTION_ID</literal> and replace
- <literal>{id}</literal> with that generated id, then POST to the new
- URL. The URL the client creates works exactly like a
- <literal>create-next</literal> URL described earlier. The response of
- this POST would also return a new <literal>msg-create-next</literal>
- header. The client can continue to generate its own
- DUPLICATE_DETECTION_ID, or use the new URL returned via the
- <literal>msg-create-nex</literal>t header.</para>
-
- <para>The advantage of this approach is that the client does not have to
- repost the message. It also only has to come up with a unique
- <literal>DUPLICATE_DETECTION_ID</literal> once.</para>
- </sect1>
-
- <sect1>
- <title>Persistent Messages</title>
-
- <para>By default, posted messages are not durable and will not be
- persisted in HornetQ's journal. You can create durable messages by
- modifying the default configuration as expressed in Chapter 2 so that
- all messages are persisted when sent. Alternatively, you can set a URL
- query parameter called <literal>durable</literal> to true when you
post
- your messages to the URLs returned in the
<literal>msg-create</literal>,
- <literal>msg-create-with-id</literal>, or
- <literal>msg-create-next</literal> headers. here's an example of
- that.</para>
-
- <programlisting>POST /queues/jms.queue.bar/create?durable=true
-Host:
example.com
-Content-Type: application/xml
-
-<order>
- <name>Bill</name>
- <item>iPhone4</item>
- <cost>$199.99</cost>
-</order>
-</programlisting>
- </sect1>
-
- <sect1>
- <title>TTL, Expiration and Priority</title>
-
- <para>You can set the time to live, expiration, and/or the priority of
- the message in the queue or topic by setting an additional query
- parameter. The <literal>expiration</literal> query parameter is an
long
- specify the time in milliseconds since epoch (a long date). The
- <literal>ttl</literal> query parameter is a time in milliseconds you
- want the message active. The <literal>priority</literal> is another
- query parameter with an integer value between 0 and 9 expressing the
- priority of the message. i.e.:</para>
-
- <programlisting>POST
/queues/jms.queue.bar/create?expiration=30000&priority=3
-Host:
example.com
-Content-Type: application/xml
-
-<order>
- <name>Bill</name>
- <item>iPhone4</item>
- <cost>$199.99</cost>
-</order>
-</programlisting>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Consuming Messages via Pull</title>
-
- <para>There are two different ways to consume messages from a topic or
- queue. You can wait and have the messaging server push them to you, or you
- can continuously poll the server yourself to see if messages are
- available. This chapter discusses the latter. Consuming messages via a
- pull works almost identically for queues and topics with some minor, but
- important caveats. To start consuming you must create a consumer resource
- on the server that is dedicated to your client. Now, this pretty much
- breaks the stateless principle of REST, but after much prototyping, this
- is the best way to work most effectively with HornetQ through a REST
- interface.</para>
-
- <para>You create consumer resources by doing a simple POST to the URL
- published by the <literal>msg-pull-consumers</literal> response header
if
- you're interacting with a queue, the
- <literal>msg-pull-subscribers</literal> response header if you're
- interacting with a topic. These headers are provided by the main queue or
- topic resource discussed in Chapter 3. Doing an empty POST to one of these
- URLs will create a consumer resource that follows an auto-acknowledge
- protocol and, if you're interacting with a topic, creates a temporty
- subscription to the topic. If you want to use the acknowledgement protocol
- and/or create a durable subscription (topics only), then you must use the
- form parameters (<literal>application/x-www-form-urlencoded</literal>)
- described below.</para>
-
- <variablelist>
- <varlistentry>
- <term>autoAck</term>
-
- <listitem>
- <para>A value of <literal>true</literal> or
<literal>false</literal>
- can be given. This defaults to <literal>true</literal> if you do
not
- pass this parameter.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>durable</term>
-
- <listitem>
- <para>A value of <literal>true</literal> or
<literal>false</literal>
- can be given. This defaults to <literal>false</literal> if you do
- not pass this parameter. Only available on topics. This specifies
- whether you want a durable subscription or not. A durable
- subscription persists through server restart.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>name</term>
-
- <listitem>
- <para>This is the name of the durable subscription. If you do not
- provide this parameter, the name will be automatically generated by
- the server. Only usable on topics.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>selector</term>
-
- <listitem>
- <para>This is an optional JMS selector string. The HornetQ REST
- interface adds HTTP headers to the JMS message for REST produced
- messages. HTTP headers are prefixed with "http_" and every
'-'
- charactor is converted to a '$'.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>idle-timeout</term>
-
- <listitem>
- <para>For a topic subscription, idle time in milliseconds in which
- the consumer connections will be closed if idle.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>delete-when-idle</term>
-
- <listitem>
- <para>Boolean value, If true, a topic subscription will be deleted
- (even if it is durable) when an the idle timeout is reached.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <sect1>
- <title>Auto-Acknowledge</title>
-
- <para>This section focuses on the auto-acknowledge protocol for
- consuming messages via a pull. Here's a list of the response headers and
- URLs you'll be interested in.</para>
-
- <variablelist>
- <varlistentry>
- <term>msg-pull-consumers</term>
-
- <listitem>
- <para>The URL of a factory resource for creating queue consumer
- resources. You will pull from these created resources.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-pull-subscriptions</term>
-
- <listitem>
- <para>The URL of a factory resource for creating topic
- subscription resources. You will pull from the created
- resources.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-consume-next</term>
-
- <listitem>
- <para>The URL you will pull the next message from. This is
- returned with every response.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-consumer</term>
-
- <listitem>
- <para>This is a URL pointing back to the consumer or subscription
- resource created for the client.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <sect2>
- <title>Creating an Auto-Ack Consumer or Subscription</title>
-
- <para>Here is an example of creating an auto-acknowledged queue pull
- consumer.</para>
-
- <orderedlist>
- <listitem>
- <para>Find the pull-consumers URL by doing a HEAD or GET request
- to the base queue resource.</para>
-
- <programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/queues/jms.queue.bar/create
-msg-pull-consumers:
http://example.com/queues/jms.queue.bar/pull-consumers
-msg-push-consumers:
http://example.com/queues/jms.queue.bar/push-consumers
-</programlisting>
- </listitem>
-
- <listitem>
- <para>Next do an empty POST to the URL returned in the
- <literal>msg-pull-consumers</literal> header.</para>
-
- <programlisting>POST /queues/jms.queue.bar/pull-consumers HTTP/1.1
-Host:
example.com
-
---- response ---
-HTTP/1.1 201 Created
-Location:
http://example.com/queues/jms.queue.bar/pull-consumers/auto-ack/333
-msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/auto-ack/333/consu...
-</programlisting>
-
- <para>The <literal>Location</literal> header points to the
JMS
- consumer resource that was created on the server. It is good to
- remember this URL, although, as you'll see later, it is
- transmitted with each response just to remind you.</para>
- </listitem>
- </orderedlist>
-
- <para>Creating an auto-acknowledged consumer for a topic is pretty
- much the same. Here's an example of creating a durable
- auto-acknowledged topic pull subscription.</para>
-
- <orderedlist>
- <listitem>
- <para>Find the <literal>pull-subscriptions</literal> URL by
doing
- a HEAD or GET request to the base topic resource</para>
-
- <programlisting>HEAD /topics/jms.topic.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/topics/jms.topic.foo/create
-msg-pull-subscriptions:
http://example.com/topics/jms.topic.foo/pull-subscriptions
-msg-push-subscriptions:
http://example.com/topics/jms.topic.foo/push-subscriptions
-</programlisting>
- </listitem>
-
- <listitem>
- <para>Next do a POST to the URL returned in the
- <literal>msg-pull-subscriptions</literal> header passing in a
- <literal>true</literal> value for the
<literal>durable</literal>
- form parameter.</para>
-
- <programlisting>POST /topics/jms.topic.foo/pull-subscriptions HTTP/1.1
-Host:
example.com
-Content-Type: application/x-www-form-urlencoded
-
-durable=true
-
---- Response ---
-HTTP/1.1 201 Created
-Location:
http://example.com/topics/jms.topic.foo/pull-subscriptions/auto-ack/222
-msg-consume-next:
http://example.com/topics/jms.topic.foo/pull-subscriptions/auto-ack/222/c...
-</programlisting>
-
- <para>The <literal>Location</literal> header points to the
JMS
- subscription resource that was created on the server. It is good
- to remember this URL, although, as you'll see later, it is
- transmitted with each response just to remind you.</para>
- </listitem>
- </orderedlist>
- </sect2>
-
- <sect2>
- <title>Consuming Messages</title>
-
- <para>After you have created a consumer resource, you are ready to
- start pulling messages from the server. Notice that when you created
- the consumer for either the queue or topic, the response contained a
- <literal>msg-consume-next</literal> response header. POST to the URL
- contained within this header to consume the next message in the queue
- or topic subscription. A successful POST causes the server to extract
- a message from the queue or topic subscription, acknowledge it, and
- return it to the consuming client. If there are no messages in the
- queue or topic subscription, a 503 (Service Unavailable) HTTP code is
- returned.</para>
-
- <warning>
- <para>For both successful and unsuccessful posts to the
- msg-consume-next URL, the response will contain a new
- msg-consume-next header. You must ALWAYS use this new URL returned
- within the new msg-consume-next header to consume new
- messages.</para>
- </warning>
-
- <para>Here's an example of pulling multiple messages from the consumer
- resource.</para>
-
- <orderedlist>
- <listitem>
- <para>Do a POST on the msg-consume-next URL that was returned with
- the consumer or subscription resource discussed earlier.</para>
-
- <programlisting>POST
/queues/jms.queue.bar/pull-consumers/consume-next-1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-Content-Type: application/xml
-msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/consume-next-2
-msg-consumer:
http://example.com/queues/jms.queue.bar/pull-consumers/333
-
-<order>...</order>
-</programlisting>
-
- <para>The POST returns the message consumed from the queue. It
- also returns a new msg-consume-next link. Use this new link to get
- the next message. Notice also a msg-consumer response header is
- returned. This is a URL that points back to the consumer or
- subscription resource. You will need that to clean up your
- connection after you are finished using the queue or topic.</para>
- </listitem>
-
- <listitem>
- <para>The POST returns the message consumed from the queue. It
- also returns a new msg-consume-next link. Use this new link to get
- the next message.</para>
-
- <programlisting>POST
/queues/jms.queue.bar/pull-consumers/consume-next-2
-Host:
example.com
-
---- Response ---
-Http/1.1 503 Service Unavailable
-Retry-After: 5
-msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/consume-next-2
-</programlisting>
-
- <para>In this case, there are no messages in the queue, so we get
- a 503 response back. As per the HTTP 1.1 spec, a 503 response may
- return a Retry-After head specifying the time in seconds that you
- should retry a post. Also notice, that another new
- msg-consume-next URL is present. Although it probabley is the same
- URL you used last post, get in the habit of using URLs returned in
- response headers as future versions of HornetQ REST might be
- redirecting you or adding additional data to the URL after
- timeouts like this.</para>
- </listitem>
-
- <listitem>
- <para>POST to the URL within the last
- <literal>msg-consume-next</literal> to get the next
- message.</para>
-
- <programlisting>POST
/queues/jms.queue.bar/pull-consumers/consume-next-2
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-Content-Type: application/xml
-msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/consume-next-3
-
-<order>...</order></programlisting>
- </listitem>
- </orderedlist>
- </sect2>
-
- <sect2>
- <title>Recovering From Network Failures</title>
-
- <para>If you experience a network failure and do not know if your post
- to a msg-consume-next URL was successful or not, just re-do your POST.
- A POST to a msg-consume-next URL is idempotent, meaning that it will
- return the same result if you execute on any one msg-consume-next URL
- more than once. Behind the scenes, the consumer resource caches the
- last consumed message so that if there is a message failure and you do
- a re-post, the cached last message will be returned (along with a new
- msg-consume-next URL). This is the reason why the protocol always
- requires you to use the next new msg-consume-next URL returned with
- each response. Information about what state the client is in is
- embedded within the actual URL.</para>
- </sect2>
-
- <sect2>
- <title>Recovering From Client or Server Crashes</title>
-
- <para>If the server crashes and you do a POST to the msg-consume-next
- URL, the server will return a 412 (Preconditions Failed) response
- code. This is telling you that the URL you are using is out of sync
- with the server. The response will contain a new msg-consume-next
- header to invoke on.</para>
-
- <para>If the client crashes there are multiple ways you can recover.
- If you have remembered the last msg-consume-next link, you can just
- re-POST to it. If you have remembered the consumer resource URL, you
- can do a GET or HEAD request to obtain a new msg-consume-next URL. If
- you have created a topic subscription using the name parameter
- discussed earlier, you can re-create the consumer. Re-creation will
- return a msg-consume-next URL you can use. If you cannot do any of
- these things, you will have to create a new consumer.</para>
-
- <para>The problem with the auto-acknowledge protocol is that if the
- client or server crashes, it is possible for you to skip messages. The
- scenario would happen if the server crashes after auto-acknowledging a
- message and before the client receives the message. If you want more
- reliable messaging, then you must use the acknowledgement
- protocol.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Manual Acknowledgement</title>
-
- <para>The manual acknowledgement protocol is similar to the auto-ack
- protocol except there is an additional round trip to the server to tell
- it that you have received the message and that the server can internally
- ack the message. Here is a list of the respone headers you will be
- interested in.</para>
-
- <variablelist>
- <varlistentry>
- <term>msg-pull-consumers</term>
-
- <listitem>
- <para>The URL of a factory resource for creating queue consumer
- resources. You will pull from these created resources</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-pull-subscriptions</term>
-
- <listitem>
- <para>The URL of a factory resource for creating topic
- subscription resources. You will pull from the created
- resources.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-acknowledge-next</term>
-
- <listitem>
- <para>URL used to obtain the next message in the queue or topic
- subscription. It does not acknowledge the message though.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-acknowledgement</term>
-
- <listitem>
- <para>URL used to acknowledge a message.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>msg-consumer</term>
-
- <listitem>
- <para>This is a URL pointing back to the consumer or subscription
- resource created for the client.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <sect2>
- <title>Creating manually-acknowledged consumers or
- subscriptions</title>
-
- <para>Here is an example of creating an auto-acknowledged queue pull
- consumer.</para>
-
- <orderedlist>
- <listitem>
- <para>Find the pull-consumers URL by doing a HEAD or GET request
- to the base queue resource.</para>
-
- <programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/queues/jms.queue.bar/create
-msg-pull-consumers:
http://example.com/queues/jms.queue.bar/pull-consumers
-msg-push-consumers:
http://example.com/queues/jms.queue.bar/push-consumers
-</programlisting>
- </listitem>
-
- <listitem>
- <para>Next do a POST to the URL returned in the
- <literal>msg-pull-consumers</literal> header passing in a
- <literal>false</literal> value to the
<literal>autoAck</literal>
- form parameter .</para>
-
- <programlisting>POST /queues/jms.queue.bar/pull-consumers HTTP/1.1
-Host:
example.com
-Content-Type: application/x-www-form-urlencoded
-
-autoAck=false
-
---- response ---
-HTTP/1.1 201 Created
-Location:
http://example.com/queues/jms.queue.bar/pull-consumers/acknowledged/333
-msg-acknowledge-next:
http://example.com/queues/jms.queue.bar/pull-consumers/acknowledged/333/a...
-</programlisting>
-
- <para>The <literal>Location</literal> header points to the
JMS
- consumer resource that was created on the server. It is good to
- remember this URL, although, as you'll see later, it is
- transmitted with each response just to remind you.</para>
- </listitem>
- </orderedlist>
-
- <para>Creating an manually-acknowledged consumer for a topic is pretty
- much the same. Here's an example of creating a durable
- manually-acknowledged topic pull subscription.</para>
-
- <orderedlist>
- <listitem>
- <para>Find the <literal>pull-subscriptions</literal> URL by
doing
- a HEAD or GET request to the base topic resource</para>
-
- <programlisting>HEAD /topics/jms.topic.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/topics/jms.topic.foo/create
-msg-pull-subscriptions:
http://example.com/topics/jms.topic.foo/pull-subscriptions
-msg-push-subscriptions:
http://example.com/topics/jms.topic.foo/push-subscriptions
-</programlisting>
- </listitem>
-
- <listitem>
- <para>Next do a POST to the URL returned in the
- <literal>msg-pull-subscriptions</literal> header passing in a
- <literal>true</literal> value for the
<literal>durable</literal>
- form parameter and a <literal>false</literal> value to the
- <literal>autoAck</literal> form parameter.</para>
-
- <programlisting>POST /topics/jms.topic.foo/pull-subscriptions HTTP/1.1
-Host:
example.com
-Content-Type: application/x-www-form-urlencoded
-
-durable=true&autoAck=false
-
---- Response ---
-HTTP/1.1 201 Created
-Location:
http://example.com/topics/jms.topic.foo/pull-subscriptions/acknowledged/222
-msg-acknowledge-next:
http://example.com/topics/jms.topic.foo/pull-subscriptions/acknowledged/2...
-</programlisting>
-
- <para>The <literal>Location</literal> header points to the
JMS
- subscription resource that was created on the server. It is good
- to remember this URL, although, as you'll see later, it is
- transmitted with each response just to remind you.</para>
- </listitem>
- </orderedlist>
- </sect2>
-
- <sect2>
- <title>Consuming and Acknowledging a Message</title>
-
- <para>After you have created a consumer resource, you are ready to
- start pulling messages from the server. Notice that when you created
- the consumer for either the queue or topic, the response contained a
- <literal>msg-acknowledge-next</literal> response header. POST to the
- URL contained within this header to consume the next message in the
- queue or topic subscription. If there are no messages in the queue or
- topic subscription, a 503 (Service Unavailable) HTTP code is returned.
- A successful POST causes the server to extract a message from the
- queue or topic subscription and return it to the consuming client. It
- does not acknowledge the message though. The response will contain the
- <literal>acknowledgement</literal> header which you will use to
- acknowledge the message.</para>
-
- <para>Here's an example of pulling multiple messages from the consumer
- resource.</para>
-
- <orderedlist>
- <listitem>
- <para>Do a POST on the msg-acknowledge-next URL that was returned
- with the consumer or subscription resource discussed
- earlier.</para>
-
- <programlisting>POST
/queues/jms.queue.bar/pull-consumers/consume-next-1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-Content-Type: application/xml
-msg-acknowledgement:
http://example.com/queues/jms.queue.bar/pull-consumers/333/acknowledgement/2
-msg-consumer:
http://example.com/queues/jms.queue.bar/pull-consumers/333
-
-<order>...</order>
-</programlisting>
-
- <para>The POST returns the message consumed from the queue. It
- also returns a <literal>msg-acknowledgemen</literal>t link. You
- will use this new link to acknowledge the message. Notice also a
- <literal>msg-consumer</literal> response header is returned.
This
- is a URL that points back to the consumer or subscription
- resource. You will need that to clean up your connection after you
- are finished using the queue or topic.</para>
- </listitem>
-
- <listitem>
- <para>Acknowledge or unacknowledge the message by doing a POST to
- the URL contained in the <literal>msg-acknowledgement</literal>
- header. You must pass an <literal>acknowledge</literal> form
- parameter set to <literal>true</literal> or
- <literal>false</literal> depending on whether you want to
- acknowledge or unacknowledge the message on the server.</para>
-
- <programlisting>POST
/queues/jms.queue.bar/pull-consumers/acknowledgement/2
-Host:
example.com
-Content-Type: application/x-www-form-urlencoded
-
-acknowledge=true
-
---- Response ---
-Http/1.1 200 Ok
-msg-acknowledge-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/acknowledge-ne...
-</programlisting>
-
- <para>Whether you acknowledge or unacknowledge the message, the
- response will contain a new msg-acknowledge-next header that you
- must use to obtain the next message.</para>
- </listitem>
- </orderedlist>
- </sect2>
-
- <sect2>
- <title>Recovering From Network Failures</title>
-
- <para>If you experience a network failure and do not know if your post
- to a <literal>msg-acknowledge-next</literal> or
- <literal>msg-acknowledgement</literal> URL was successful or not,
just
- re-do your POST. A POST to one of these URLs is idempotent, meaning
- that it will return the same result if you re-post. Behind the scenes,
- the consumer resource keeps track of its current state. If the last
- action was a call to <literal>msg-acknowledge-next</literal>, it
will
- have the last message cached, so that if a re-post is done, it will
- return the message again. Same goes with re-posting to
- <literal>msg-acknowledgement</literal>. The server remembers its
last
- state and will return the same results. If you look at the URLs you'll
- see that they contain information about the expected current state of
- the server. This is how the server knows what the client is
- expecting.</para>
- </sect2>
-
- <sect2>
- <title>Recovering From Client or Server Crashes</title>
-
- <para>If the server crashes and while you are doing a POST to the
- <literal>msg-acknowledge-next</literal> URL, just re-post.
Everything
- should reconnect all right. On the other hand, if the server crashes
- while you are doing a POST to
<literal>msg-acknowledgement</literal>,
- the server will return a 412 (Preconditions Failed) response code.
- This is telling you that the URL you are using is out of sync with the
- server and the message you are acknowledging was probably re-enqueued.
- The response will contain a new
- <literal>msg-acknowledge-next</literal> header to invoke
on.</para>
-
- <para>As long as you have "bookmarked" the consumer resource URL
- (returned from <literal>Location</literal> header on a create, or
the
- <literal>msg-consumer</literal> header), you can recover from client
- crashes by doing a GET or HEAD request on the consumer resource to
- obtain what state you are in. If the consumer resource is expecting
- you to acknowledge a message, it will return a
- <literal>msg-acknowledgement</literal> header in the response. If
the
- consumer resource is expecting you to pull for the next message, the
- <literal>msg-acknowledge-next</literal> header will be in the
- response. With manual acknowledgement you are pretty much guaranteed
- to avoid skipped messages. For topic subscriptions that were created
- with a name parameter, you do not have to "bookmark" the returned URL.
- Instead, you can re-create the consumer resource with the same exact
- name. The response will contain the same information as if you did a
- GET or HEAD request on the consumer resource.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Blocking Pulls with Accept-Wait</title>
-
- <para>Unless your queue or topic has a high rate of message flowing
- though it, if you use the pull protocol, you're going to be receiving a
- lot of 503 responses as you continuously pull the server for new
- messages. To alleviate this problem, the HornetQ REST interface provides
- the <literal>Accept-Wait</literal> header. This is a generic HTTP
- request header that is a hint to the server for how long the client is
- willing to wait for a response from the server. The value of this header
- is the time in seconds the client is willing to block for. You would
- send this request header with your pull requests. Here's an
- example:</para>
-
- <programlisting>POST /queues/jms.queue.bar/pull-consumers/consume-next-2
-Host:
example.com
-Accept-Wait: 30
-
---- Response ---
-HTTP/1.1 200 Ok
-Content-Type: application/xml
-msg-consume-next:
http://example.com/queues/jms.queue.bar/pull-consumers/333/consume-next-3
-
-<order>...</order></programlisting>
-
- <para>In this example, we're posting to a msg-consume-next URL and
- telling the server that we would be willing to block for 30
- seconds.</para>
- </sect1>
-
- <sect1>
- <title>Clean Up Your Consumers!</title>
-
- <para>When the client is done with its consumer or topic subscription it
- should do an HTTP DELETE call on the consumer URL passed back from the
- Location header or the msg-consumer response header. The server will
- time out a consumer with the value configured from Chapter 2.3, so you
- don't have to clean up if you dont' want to, but if you are a good kid,
- you will clean up your messes. A consumer timeout for durable
- subscriptions will not delete the underlying durable JMS subscription
- though, only the server-side consumer resource (and underlying JMS
- session).</para>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Pushing Messages</title>
-
- <para>You can configure the HornetQ REST server to push messages to a
- registered URL either remotely through the REST interface, or by creating
- a pre-configured XML file for the HornetQ REST server to load at boot
- time.</para>
-
- <sect1>
- <title>The Queue Push Subscription XML</title>
-
- <para>Creating a push consumer for a queue first involves creating a
- very simple XML document. This document tells the server if the push
- subscription should survive server reboots (is it durable). It must
- provide a URL to ship the forwarded message to. Finally, you have to
- provide authentication information if the final endpoint requires
- authentication. Here's a simple example:</para>
-
- <programlisting><push-registration>
- <durable>false</durable>
- <selector><![CDATA[
- SomeAttribute > 1
- ]]>
- </selector>
- <link rel="push" href="http://somewhere.com"
type="application/json" method="PUT"/>
- <maxRetries>5</maxRetries>
- <retryWaitMillis>1000</retryWaitMillis>
- <disableOnFailure>true</disableOnFailure>
-</push-registration>
-</programlisting>
-
- <para>The <literal>durable</literal> element specifies whether
the
- registration should be saved to disk so that if there is a server
- restart, the push subscription will still work. This element is not
- required. If left out it defaults to <literal>false</literal>. If
- durable is set to true, an XML file for the push subscription will be
- created within the directory specified by the
- <literal>queue-push-store-dir</literal> config variable defined in
- Chapter 2. (<literal>topic-push-store-dir</literal> for
topics).</para>
-
- <para>The <literal>selector</literal> element is optional and
defines a
- JMS message selector. You should enclose it within CDATA blocks as some
- of the selector characters are illegal XML.</para>
-
- <para>The <literal>maxRetries</literal> element specifies how
many times
- a the server will try to push a message to a URL if there is a
- connection failure.</para>
-
- <para>The <literal>retryWaitMillis</literal> element specifies
how long
- to wait before performing a retry.</para>
-
- <para>The <literal>disableOnFailure</literal> element, if set to
true,
- will disable the registration if all retries have failed. It will not
- disable the connection on non-connection-failure issues (like a bad
- request for instance). In these cases, the dead letter queue logic of
- HornetQ will take over.</para>
-
- <para>The <literal>link</literal> element specifies the basis of
the
- interaction. The <literal>href</literal> attribute contains the URL
you
- want to interact with. It is the only required attribute. The
- <literal>type</literal> attribute specifies the content-type ofwhat
the
- push URL is expecting. The <literal>method</literal> attribute defines
- what HTTP method the server will use when it sends the message to the
- server. If it is not provided it defaults to POST. The
- <literal>rel</literal> attribute is very important and the value of it
- triggers different behavior. Here's the values a rel attribute can
- have:</para>
-
- <variablelist>
- <varlistentry>
- <term>destination</term>
-
- <listitem>
- <para>The href URL is assumed to be a queue or topic resource of
- another HornetQ REST server. The push registration will initially
- do a HEAD request to this URL to obtain a msg-create-with-id
- header. It will use this header to push new messages to the
- HornetQ REST endpoint reliably. Here's an example:</para>
-
- <programlisting><push-registration>
- <link rel="destination"
href="http://somewhere.com/queues/jms.queue.foo"/>
-</push-registration> </programlisting>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>template</term>
-
- <listitem>
- <para>In this case, the server is expecting the link element's
- href attribute to be a URL expression. The URL expression must
- have one and only one URL parameter within it. The server will use
- a unique value to create the endpoint URL. Here's an
- example:</para>
-
- <programlisting><push-registration>
- <link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="PUT"/>
-</push-registration>
-</programlisting>
-
- <para>In this example, the {id} sub-string is the one and only one
- URL parameter.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>user defined</term>
-
- <listitem>
- <para>If the rel attributes is not destination or template (or is
- empty or missing), then the server will send an HTTP message to
- the href URL using the HTTP method defined in the method
- attribute. Here's an example:</para>
-
- <programlisting><push-registration>
- <link href="http://somewhere.com" type="application/json"
method="PUT"/>
-</push-registration></programlisting>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1>
- <title>The Topic Push Subscription XML</title>
-
- <para>The push XML for a topic is the same except the root element is
- push-topic-registration. (Also remember the
<literal>selector</literal>
- element is optional). The rest of the document is the same. Here's an
- example of a template registration:</para>
-
- <programlisting><push-topic-registration>
- <durable>true</durable>
- <selector><![CDATA[
- SomeAttribute > 1
- ]]>
- </selector>
- <link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="POST"/>
-</push-topic registration></programlisting>
- </sect1>
-
- <sect1>
- <title>Creating a Push Subscription at Runtime</title>
-
- <para>Creating a push subscription at runtime involves getting the
- factory resource URL from the msg-push-consumers header, if the
- destination is a queue, or msg-push-subscriptions header, if the
- destination is a topic. Here's an example of creating a push
- registration for a queue:</para>
-
- <orderedlist>
- <listitem>
- <para>First do a HEAD request to the queue resource:</para>
-
- <programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/queues/jms.queue.bar/create
-msg-pull-consumers:
http://example.com/queues/jms.queue.bar/pull-consumers
-msg-push-consumers:
http://example.com/queues/jms.queue.bar/push-consumers</programlisting...
- </listitem>
-
- <listitem>
- <para>Next POST your subscription XML to the URL returned from
- msg-push-consumers header</para>
-
- <programlisting>POST /queues/jms.queue.bar/push-consumers
-Host:
example.com
-Content-Type: application/xml
-
-<push-registration>
- <link rel="destination"
href="http://somewhere.com/queues/jms.queue.foo"/>
-</push-registration>
-
---- Response ---
-HTTP/1.1 201 Created
-Location:
http://example.com/queues/jms.queue.bar/push-consumers/1-333-1212
-</programlisting>
-
- <para>The Location header contains the URL for the created resource.
- If you want to unregister this, then do a HTTP DELETE on this
- URL.</para>
- </listitem>
- </orderedlist>
-
- <para>Here's an example of creating a push registration for a
- topic:</para>
-
- <orderedlist>
- <listitem>
- <para>First do a HEAD request to the topic resource:</para>
-
- <programlisting>HEAD /topics/jms.topic.bar HTTP/1.1
-Host:
example.com
-
---- Response ---
-HTTP/1.1 200 Ok
-msg-create:
http://example.com/topics/jms.topic.bar/create
-msg-pull-subscriptions:
http://example.com/topics/jms.topic.bar/pull-subscriptions
-msg-push-subscriptions:
http://example.com/topics/jms.topic.bar/push-subscriptions</programlis...
- </listitem>
-
- <listitem>
- <para>Next POST your subscription XML to the URL returned from
- msg-push-subscriptions header</para>
-
- <programlisting>POST /topics/jms.topic.bar/push-subscriptions
-Host:
example.com
-Content-Type: application/xml
-
-<push-registration>
- <link rel="template"
href="http://somewhere.com/resources/{id}"/>
-</push-registration>
-
---- Response ---
-HTTP/1.1 201 Created
-Location:
http://example.com/topics/jms.topic.bar/push-subscriptions/1-333-1212
-</programlisting>
-
- <para>The Location header contains the URL for the created resource.
- If you want to unregister this, then do a HTTP DELETE on this
- URL.</para>
- </listitem>
- </orderedlist>
- </sect1>
-
- <sect1>
- <title>Creating a Push Subscription by Hand</title>
-
- <para>You can create a push XML file yourself if you do not want to go
- through the REST interface to create a push subscription. There is some
- additional information you need to provide though. First, in the root
- element, you must define a unique id attribute. You must also define a
- destination element to specify the queue you should register a consumer
- with. For a topic, the destination element is the name of the
- subscription that will be reated. For a topic, you must also specify the
- topic name within the topic element.</para>
-
- <para>Here's an example of a hand-created queue registration. This file
- must go in the directory specified by the queue-push-store-dir config
- variable defined in Chapter 2:</para>
-
- <programlisting><push-registration id="111">
- <destination>jms.queue.bar</destination>
- <durable>true>
- <link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="PUT"/>
-</push-registration></programlisting>
-
- <para>Here's an example of a hand-created topic registration. This file
- must go in the directory specified by the topic-push-store-dir config
- variable defined in Chapter 2:</para>
-
- <programlisting><push-topic-registration id="112">
- <destination>my-subscription-1</destination
- <durable>true</durable>
- <link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="PUT"/>
- <topic>jms.topic.foo</topic>
-</push-topic-registration></programlisting>
- </sect1>
-
- <sect1>
- <title>Pushing to Authenticated Servers</title>
-
- <para>Push subscriptions only support BASIC and DIGEST authentication
- out of the box. Here is an example of adding BASIC
- authentication:</para>
-
- <programlisting><push-topic-registration>
- <durable>true</durable>
- <link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="POST"/>
- <authentication>
- <basic-auth>
- <username>guest</username>
- <password>geheim</password>
- </basic-auth>
- </authentication>
-</push-topic registration></programlisting>
-
- <para>For DIGEST, just replace basic-auth with digest-auth.</para>
-
- <para>For other authentication mechanisms, you can register headers you
- want transmitted with each request. Use the header element with the name
- attribute representing the name of the header. Here's what custom
- headers might look like:</para>
-
- <programlisting><push-topic-registration>
- <durable>true</durable>
- <link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="POST"/>
- <header
name="secret-header">jfdiwe3321</header>
-</push-topic registration></programlisting>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Creating Destinations</title>
-
- <para>You can create a durable queue or topic through the REST interface.
- Currently you cannot create a temporary queue or topic. To create a queue
- you do a POST to the relative URL /queues with an XML representation of
- the queue. The XML syntax is the same queue syntax that you would specify
- in hornetq-jms.xml if you were creating a queue there. For example:</para>
-
- <programlisting>POST /queues
-Host:
example.com
-Content-Type: application/hornetq.jms.queue+xml
-
-<queue name="testQueue">
- <durable>true</durable>
-</queue>
-
---- Response ---
-HTTP/1.1 201 Created
-Location:
http://example.com/queues/jms.queue.testQueue
-</programlisting>
-
- <para>Notice that the Content-Type is
- application/hornetq.jms.queue+xml.</para>
-
- <para>Here's what creating a topic would look like:</para>
-
- <programlisting>POST /topics
-Host:
example.com
-Content-Type: application/hornetq.jms.topic+xml
-
-<topic name="testTopic">
-</topic>
-
---- Response ---
-HTTP/1.1 201 Created
-Location:
http://example.com/topics/jms.topic.testTopic</programlisting>
- </chapter>
-
- <chapter>
- <title>Securing the HornetQ REST Interface</title>
-
- <para></para>
-
- <sect1>
- <title>Within JBoss Application server</title>
-
- <para>Securing the HornetQ REST interface is very simple with the JBoss
- Application Server. You turn on authentication for all URLs within your
- WAR's web.xml, and let the user Principal to propagate to HornetQ. This
- only works if you are using the JBossSecurityManager with HornetQ. See
- the HornetQ documentation for more details.</para>
- </sect1>
-
- <sect1>
- <title>Security in other environments</title>
-
- <para>To secure the HornetQ REST interface in other environments you
- must role your own security by specifying security constraints with your
- web.xml for every path of every queue and topic you have deployed. Here
- is a list of URI patterns:</para>
-
- <table>
- <title></title>
-
- <tgroup cols="2">
- <tbody>
- <row>
- <entry>/queues</entry>
-
- <entry>secure the POST operation to secure queue
- creation</entry>
- </row>
-
- <row>
- <entry>/queues/{queue-name}</entry>
-
- <entry>secure the GET HEAD operation to getting information
- about the queue.</entry>
- </row>
-
- <row>
- <entry>/queues/{queue-name}/create/*</entry>
-
- <entry>secure this URL pattern for producing messages.</entry>
- </row>
-
- <row>
- <entry>/queues/{queue-name}/pull-consumers/*</entry>
-
- <entry>secure this URL pattern for pulling messages
- messages.</entry>
- </row>
-
- <row>
- <entry>/queues/{queue-name}/push-consumers/*</entry>
-
- <entry>secure this URL pattern for pushing messages.</entry>
- </row>
-
- <row>
- <entry>/topics</entry>
-
- <entry>secure the POST operation to secure topic
- creation</entry>
- </row>
-
- <row>
- <entry>/topics/{topic-name}</entry>
-
- <entry>secure the GET HEAD operation to getting information
- about the topic.</entry>
- </row>
-
- <row>
- <entry>/topics/{topic-name}/create/*</entry>
-
- <entry>secure this URL pattern for producing messages.</entry>
- </row>
-
- <row>
- <entry>/topics/{topic-name}/pull-subscriptions/*</entry>
-
- <entry>secure this URL pattern for pulling messages
- messages.</entry>
- </row>
-
- <row>
- <entry>/topics/{topic-name}/push-subscriptions/*</entry>
-
- <entry>secure this URL pattern for pushing messages.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Mixing JMS and REST</title>
-
- <para>The HornetQ REST interface supports mixing JMS and REST producres
- and consumers. You can send an ObjectMessage through a JMS Producer, and
- have a REST client consume it. You can have a REST client POST a message
- to a topic and have a JMS Consumer receive it. Some simple transformations
- are supported if you have the correct RESTEasy providers installed.</para>
-
- <sect1>
- <title>JMS Producers - REST Consumers</title>
-
- <para>If you have a JMS producer, the HornetQ REST interface only
- supports ObjectMessage type. If the JMS producer is aware that there may
- be REST consumers, it should set a JMS property to specify what
- Content-Type the Java object should be translated into by REST clients.
- The HornetQ REST server will use RESTEasy content handlers
- (MessageBodyReader/Writers) to transform the Java object to the type
- desired. Here's an example of a JMS producer setting the content type of
- the message.</para>
-
- <programlisting>ObjectMessage message = session.createObjectMessage();
-message.setStringProperty(org.hornetq.rest.HttpHeaderProperty.CONTENT_TYPE,
"application/xml");
-</programlisting>
-
- <para>If the JMS producer does not set the content-type, then this
- information must be obtained from the REST consumer. If it is a pull
- consumer, then the REST client should send an Accept header with the
- desired media types it wants to convert the Java object into. If the
- REST client is a push registration, then the type attribute of the link
- element of the push registration should be set to the desired
- type.</para>
- </sect1>
-
- <sect1>
- <title>REST Producers - JMS Consumers</title>
-
- <para>If you have a REST client producing messages and a JMS consumer,
- HornetQ REST has a simple helper class for you to transform the HTTP
- body to a Java object. Here's some example code:</para>
-
- <programlisting>public void onMessage(Message message)
-{
- MyType obj = org.hornetq.rest.Jms.getEntity(message, MyType.class);
-}
-</programlisting>
-
- <para>The way the <literal>getEntity()</literal> method works is
that if
- the message is an ObjectMessage, it will try to extract the desired type
- from it like any other JMS message. If a REST producer sent the message,
- then the method uses RESTEasy to convert the HTTP body to the Java
- object you want. See the Javadoc of this class for more helper
- methods.</para>
- </sect1>
- </chapter>
</book>
Copied: trunk/docs/rest-manual/en/notice.xml (from rev 10511,
trunk/docs/quickstart-guide/en/notice.xml)
===================================================================
--- trunk/docs/rest-manual/en/notice.xml (rev 0)
+++ trunk/docs/rest-manual/en/notice.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,32 @@
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+
+<chapter id="notice">
+ <title>Legal Notice</title>
+
+ <para>Copyright © 2010 Red Hat, Inc. and others.</para>
+ <para>The text of and illustrations in this document are licensed by Red
Hat under
+ a Creative Commons Attribution–Share Alike 3.0 Unported license
("CC-BY-SA").</para>
+ <para>An explanation of CC-BY-SA is available at
+ <ulink
url="http://creativecommons.org/licenses/by-sa/3.0/">http://...;.
+ In accordance with CC-BY-SA, if you distribute this document or an
adaptation
+ of it, you must provide the URL for the original version.</para>
+ <para>Red Hat, as the licensor of this document, waives the right to
enforce,
+ and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent
+ permitted by applicable law.</para>
+</chapter>
\ No newline at end of file
Added: trunk/docs/rest-manual/en/posting-messages.xml
===================================================================
--- trunk/docs/rest-manual/en/posting-messages.xml (rev 0)
+++ trunk/docs/rest-manual/en/posting-messages.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+
+ <chapter>
+ <title>Posting Messages</title>
+
+ <para>This chapter discusses the protocol for posting messages to a queue
+ or a topic. In Chapter 3, you saw that a queue or topic resource publishes
+ variable custom headers that are links to other RESTful resources. The
+ <literal>msg-create</literal> header is the URL you post messages to.
+ Messages are published to a queue or topic by sending a simple HTTP
+ message to the URL published by the msg-create header. The HTTP message
+ contains whatever content you want to publish to the HornetQ destination.
+ Here's an example scenario:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Obtain the starting <literal>msg-create</literal> header
from
+ the queue or topic resource.</para>
+
+ <para><programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
+Host:
example.com
+
+--- Response ---
+HTTP/1.1 200 Ok
+msg-create:
http://example.com/queues/jms.queue.bar/create
+msg-create-with-id:
http://example.com/queues/jms.queue.bar/create/{id}
+</programlisting></para>
+ </listitem>
+
+ <listitem>
+ <para>Do a POST to the URL contained in the
+ <literal>msg-create</literal> header.</para>
+
+ <para><programlisting>POST /queues/jms.queue.bar/create
+Host:
example.com
+Content-Type: application/xml
+
+<order>
+ <name>Bill</name>
+ <item>iPhone4</name>
+ <cost>$199.99</cost>
+</order>
+
+--- Response ---
+HTTP/1.1 201 Created
+msg-create-next:
http://example.com/queues/jms.queue.bar/create/002
+</programlisting>A successful response will return a 201 response code. Also
+ notice that a <literal>msg-create-next</literal> response header is
+ sent as well. You must use this URL to POST your next message.</para>
+ </listitem>
+
+ <listitem>
+ <para>POST your next message to the queue using the URL returned in
+ the <literal>msg-create-next</literal> header.</para>
+
+ <para><programlisting>POST /queues/jms.queue.bar/create/002
+Host:
example.com
+Content-Type: application/xml
+
+<order>
+ <name>Monica</name>
+ <item>iPad</item>
+ <cost>$499.99</cost>
+</order>
+
+--- Response --
+HTTP/1.1 201 Created
+msg-create-next:
http://example.com/queues/jms.queue.bar/create/003
+</programlisting>Continue using the new
<literal>msg-create-next</literal>
+ header returned with each response.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>It is <emphasis>VERY IMPORTENT</emphasis> that you never
re-use
+ returned <literal>msg-create-next</literal> headers to post new
messages.
+ This URL may be uniquely generated for each message and used for duplicate
+ detection. If you lose the URL within the
+ <literal>msg-create-next</literal> header, then just go back to the
queue
+ or topic resource to get the msg-create URL.</para>
+
+ <sect1>
+ <title>Duplicate Detection</title>
+
+ <para>Sometimes you might have network problems when posting new
+ messages to a queue or topic. You may do a POST and never receive a
+ response. Unfortunately, you don't know whether or not the server
+ received the message and so a re-post of the message might cause
+ duplicates to be posted to the queue or topic. By default, the HornetQ
+ REST interface is configured to accept and post duplicate messages. You
+ can change this by turning on duplicate message detection by setting the
+ <literal>dups-ok</literal> config option to
<literal>false</literal> as
+ described in Chapter 3. When you do this, the initial POST to the
+ msg-create URL will redirect you, using the standard HTTP 307
+ redirection mechanism to a unique URL to POST to. All other interactions
+ remain the same as discussed earlier. Here's an example:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Obtain the starting <literal>msg-create</literal>
header from
+ the queue or topic resource.</para>
+
+ <para><programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
+Host:
example.com
+
+--- Response ---
+HTTP/1.1 200 Ok
+msg-create:
http://example.com/queues/jms.queue.bar/create
+msg-create-with-id:
http://example.com/queues/jms.queue.bar/create/{id}
+</programlisting></para>
+ </listitem>
+
+ <listitem>
+ <para>Do a POST to the URL contained in the
+ <literal>msg-create</literal> header.</para>
+
+ <para><programlisting>POST /queues/jms.queue.bar/create
+Host:
example.com
+Content-Type: application/xml
+
+<order>
+ <name>Bill</name>
+ <item>iPhone4</name>
+ <cost>$199.99</cost>
+</order>
+
+--- Response ---
+HTTP/1.1 307 Redirect
+Location:
http://example.com/queues/jms.queue.bar/create/001
+</programlisting>A successful response will return a 307 response code. This
+ is standard HTTP protocol. It is telling you that you must re-POST
+ to the URL contained within the <literal>Location</literal>
+ header.</para>
+ </listitem>
+
+ <listitem>
+ <para>re-POST your message to the URL provided within the
+ <literal>Location</literal>
header<literal>.</literal></para>
+
+ <para><programlisting>POST /queues/jms.queue.bar/create/001
+Host:
example.com
+Content-Type: application/xml
+
+<order>
+ <name>Bill</name>
+ <item>iPhone4</name>
+ <cost>$199.99</cost>
+</order>
+
+--- Response --
+HTTP/1.1 201 Created
+msg-create-next:
http://example.com/queues/jms.queue.bar/create/002
+</programlisting>You should receive a 201 Created response. If there is a
+ network failure, just re-POST to the Location header. For new
+ messages, use the returned <literal>msg-create-next</literal>
header
+ returned with each response.</para>
+ </listitem>
+
+ <listitem>
+ <para>POST any new message to the returned
+ <literal>msg-create-next</literal> header.</para>
+
+ <para><programlisting>POST /queues/jms.queue.bar/create/002
+Host:
example.com
+Content-Type: application/xml
+
+<order>
+ <name>Monica</name>
+ <item>iPad</name>
+ <cost>$499.99</cost>
+</order>
+
+--- Response --
+HTTP/1.1 201 Created
+msg-create-next:
http://example.com/queues/jms.queue.bar/create/003</programlisting>If
+ there ever is a network problem, just repost to the URL provided in
+ the <literal>msg-create-next</literal> header.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>How can this work? As you can see, with each successful response,
+ the HornetQ REST server returns a uniquely generated URL within the
+ msg-create-next header. This URL is dedicated to the next new message
+ you want to post. Behind the scenes, the code extracts an identify from
+ the URL and uses HornetQ's duplicate detection mechanism by setting the
+ <literal>DUPLICATE_DETECTION_ID</literal> property of the JMS message
+ that is actually posted to the system.</para>
+
+ <para>An alternative to this approach is to use the
+ <literal>msg-create-with-id</literal> header. This is not an invokable
+ URL, but a URL template. The idea is that the client provides the
+ <literal>DUPLICATE_DETECTION_ID</literal> and creates it's own
+ <literal>create-next</literal> URL. The
+ <literal>msg-create-with-id</literal> header looks like this
(you've see
+ it in previous examples, but we haven't used it):</para>
+
+ <programlisting>msg-create-with-id:
http://example.com/queues/jms.queue.bar/create/{id}</programlisting>
+
+ <para>You see that it is a regular URL appended with a
+ <literal>{id}</literal>. This <literal>{id}</literal> is a
pattern
+ matching substring. A client would generate its
+ <literal>DUPLICATE_DETECTION_ID</literal> and replace
+ <literal>{id}</literal> with that generated id, then POST to the new
+ URL. The URL the client creates works exactly like a
+ <literal>create-next</literal> URL described earlier. The response of
+ this POST would also return a new <literal>msg-create-next</literal>
+ header. The client can continue to generate its own
+ DUPLICATE_DETECTION_ID, or use the new URL returned via the
+ <literal>msg-create-nex</literal>t header.</para>
+
+ <para>The advantage of this approach is that the client does not have to
+ repost the message. It also only has to come up with a unique
+ <literal>DUPLICATE_DETECTION_ID</literal> once.</para>
+ </sect1>
+
+ <sect1>
+ <title>Persistent Messages</title>
+
+ <para>By default, posted messages are not durable and will not be
+ persisted in HornetQ's journal. You can create durable messages by
+ modifying the default configuration as expressed in Chapter 2 so that
+ all messages are persisted when sent. Alternatively, you can set a URL
+ query parameter called <literal>durable</literal> to true when you
post
+ your messages to the URLs returned in the
<literal>msg-create</literal>,
+ <literal>msg-create-with-id</literal>, or
+ <literal>msg-create-next</literal> headers. here's an example of
+ that.</para>
+
+ <programlisting>POST /queues/jms.queue.bar/create?durable=true
+Host:
example.com
+Content-Type: application/xml
+
+<order>
+ <name>Bill</name>
+ <item>iPhone4</item>
+ <cost>$199.99</cost>
+</order>
+</programlisting>
+ </sect1>
+
+ <sect1>
+ <title>TTL, Expiration and Priority</title>
+
+ <para>You can set the time to live, expiration, and/or the priority of
+ the message in the queue or topic by setting an additional query
+ parameter. The <literal>expiration</literal> query parameter is an
long
+ specify the time in milliseconds since epoch (a long date). The
+ <literal>ttl</literal> query parameter is a time in milliseconds you
+ want the message active. The <literal>priority</literal> is another
+ query parameter with an integer value between 0 and 9 expressing the
+ priority of the message. i.e.:</para>
+
+ <programlisting>POST
/queues/jms.queue.bar/create?expiration=30000&priority=3
+Host:
example.com
+Content-Type: application/xml
+
+<order>
+ <name>Bill</name>
+ <item>iPhone4</item>
+ <cost>$199.99</cost>
+</order>
+</programlisting>
+ </sect1>
+ </chapter>
\ No newline at end of file
Added: trunk/docs/rest-manual/en/pushing-messages.xml
===================================================================
--- trunk/docs/rest-manual/en/pushing-messages.xml (rev 0)
+++ trunk/docs/rest-manual/en/pushing-messages.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+
+<chapter>
+ <title>Pushing Messages</title>
+
+ <para>You can configure the HornetQ REST server to push messages to a
+ registered URL either remotely through the REST interface, or by creating
+ a pre-configured XML file for the HornetQ REST server to load at boot
+ time.</para>
+
+ <sect1>
+ <title>The Queue Push Subscription XML</title>
+
+ <para>Creating a push consumer for a queue first involves creating a
+ very simple XML document. This document tells the server if the push
+ subscription should survive server reboots (is it durable). It must
+ provide a URL to ship the forwarded message to. Finally, you have to
+ provide authentication information if the final endpoint requires
+ authentication. Here's a simple example:</para>
+
+ <programlisting><push-registration>
+<durable>false</durable>
+<selector><![CDATA[
+ SomeAttribute > 1
+ ]]>
+</selector>
+<link rel="push" href="http://somewhere.com"
type="application/json" method="PUT"/>
+<maxRetries>5</maxRetries>
+<retryWaitMillis>1000</retryWaitMillis>
+<disableOnFailure>true</disableOnFailure>
+</push-registration>
+</programlisting>
+
+ <para>The <literal>durable</literal> element specifies whether the
+ registration should be saved to disk so that if there is a server
+ restart, the push subscription will still work. This element is not
+ required. If left out it defaults to <literal>false</literal>. If
+ durable is set to true, an XML file for the push subscription will be
+ created within the directory specified by the
+ <literal>queue-push-store-dir</literal> config variable defined in
+ Chapter 2. (<literal>topic-push-store-dir</literal> for
topics).</para>
+
+ <para>The <literal>selector</literal> element is optional and
defines a
+ JMS message selector. You should enclose it within CDATA blocks as some
+ of the selector characters are illegal XML.</para>
+
+ <para>The <literal>maxRetries</literal> element specifies how many
times
+ a the server will try to push a message to a URL if there is a
+ connection failure.</para>
+
+ <para>The <literal>retryWaitMillis</literal> element specifies how
long
+ to wait before performing a retry.</para>
+
+ <para>The <literal>disableOnFailure</literal> element, if set to
true,
+ will disable the registration if all retries have failed. It will not
+ disable the connection on non-connection-failure issues (like a bad
+ request for instance). In these cases, the dead letter queue logic of
+ HornetQ will take over.</para>
+
+ <para>The <literal>link</literal> element specifies the basis of
the
+ interaction. The <literal>href</literal> attribute contains the URL you
+ want to interact with. It is the only required attribute. The
+ <literal>type</literal> attribute specifies the content-type ofwhat the
+ push URL is expecting. The <literal>method</literal> attribute defines
+ what HTTP method the server will use when it sends the message to the
+ server. If it is not provided it defaults to POST. The
+ <literal>rel</literal> attribute is very important and the value of it
+ triggers different behavior. Here's the values a rel attribute can
+ have:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>destination</term>
+
+ <listitem>
+ <para>The href URL is assumed to be a queue or topic resource of
+ another HornetQ REST server. The push registration will initially
+ do a HEAD request to this URL to obtain a msg-create-with-id
+ header. It will use this header to push new messages to the
+ HornetQ REST endpoint reliably. Here's an example:</para>
+
+ <programlisting><push-registration>
+<link rel="destination"
href="http://somewhere.com/queues/jms.queue.foo"/>
+</push-registration> </programlisting>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>template</term>
+
+ <listitem>
+ <para>In this case, the server is expecting the link element's
+ href attribute to be a URL expression. The URL expression must
+ have one and only one URL parameter within it. The server will use
+ a unique value to create the endpoint URL. Here's an
+ example:</para>
+
+ <programlisting><push-registration>
+<link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="PUT"/>
+</push-registration>
+</programlisting>
+
+ <para>In this example, the {id} sub-string is the one and only one
+ URL parameter.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>user defined</term>
+
+ <listitem>
+ <para>If the rel attributes is not destination or template (or is
+ empty or missing), then the server will send an HTTP message to
+ the href URL using the HTTP method defined in the method
+ attribute. Here's an example:</para>
+
+ <programlisting><push-registration>
+<link href="http://somewhere.com" type="application/json"
method="PUT"/>
+</push-registration></programlisting>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <sect1>
+ <title>The Topic Push Subscription XML</title>
+
+ <para>The push XML for a topic is the same except the root element is
+ push-topic-registration. (Also remember the <literal>selector</literal>
+ element is optional). The rest of the document is the same. Here's an
+ example of a template registration:</para>
+
+ <programlisting><push-topic-registration>
+<durable>true</durable>
+<selector><![CDATA[
+ SomeAttribute > 1
+ ]]>
+</selector>
+<link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="POST"/>
+</push-topic registration></programlisting>
+ </sect1>
+
+ <sect1>
+ <title>Creating a Push Subscription at Runtime</title>
+
+ <para>Creating a push subscription at runtime involves getting the
+ factory resource URL from the msg-push-consumers header, if the
+ destination is a queue, or msg-push-subscriptions header, if the
+ destination is a topic. Here's an example of creating a push
+ registration for a queue:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>First do a HEAD request to the queue resource:</para>
+
+ <programlisting>HEAD /queues/jms.queue.bar HTTP/1.1
+Host:
example.com
+
+--- Response ---
+HTTP/1.1 200 Ok
+msg-create:
http://example.com/queues/jms.queue.bar/create
+msg-pull-consumers:
http://example.com/queues/jms.queue.bar/pull-consumers
+msg-push-consumers:
http://example.com/queues/jms.queue.bar/push-consumers</programlisting...
+ </listitem>
+
+ <listitem>
+ <para>Next POST your subscription XML to the URL returned from
+ msg-push-consumers header</para>
+
+ <programlisting>POST /queues/jms.queue.bar/push-consumers
+Host:
example.com
+Content-Type: application/xml
+
+<push-registration>
+<link rel="destination"
href="http://somewhere.com/queues/jms.queue.foo"/>
+</push-registration>
+
+--- Response ---
+HTTP/1.1 201 Created
+Location:
http://example.com/queues/jms.queue.bar/push-consumers/1-333-1212
+</programlisting>
+
+ <para>The Location header contains the URL for the created resource.
+ If you want to unregister this, then do a HTTP DELETE on this
+ URL.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>Here's an example of creating a push registration for a
+ topic:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>First do a HEAD request to the topic resource:</para>
+
+ <programlisting>HEAD /topics/jms.topic.bar HTTP/1.1
+Host:
example.com
+
+--- Response ---
+HTTP/1.1 200 Ok
+msg-create:
http://example.com/topics/jms.topic.bar/create
+msg-pull-subscriptions:
http://example.com/topics/jms.topic.bar/pull-subscriptions
+msg-push-subscriptions:
http://example.com/topics/jms.topic.bar/push-subscriptions</programlis...
+ </listitem>
+
+ <listitem>
+ <para>Next POST your subscription XML to the URL returned from
+ msg-push-subscriptions header</para>
+
+ <programlisting>POST /topics/jms.topic.bar/push-subscriptions
+Host:
example.com
+Content-Type: application/xml
+
+<push-registration>
+<link rel="template"
href="http://somewhere.com/resources/{id}"/>
+</push-registration>
+
+--- Response ---
+HTTP/1.1 201 Created
+Location:
http://example.com/topics/jms.topic.bar/push-subscriptions/1-333-1212
+</programlisting>
+
+ <para>The Location header contains the URL for the created resource.
+ If you want to unregister this, then do a HTTP DELETE on this
+ URL.</para>
+ </listitem>
+ </orderedlist>
+ </sect1>
+
+ <sect1>
+ <title>Creating a Push Subscription by Hand</title>
+
+ <para>You can create a push XML file yourself if you do not want to go
+ through the REST interface to create a push subscription. There is some
+ additional information you need to provide though. First, in the root
+ element, you must define a unique id attribute. You must also define a
+ destination element to specify the queue you should register a consumer
+ with. For a topic, the destination element is the name of the
+ subscription that will be reated. For a topic, you must also specify the
+ topic name within the topic element.</para>
+
+ <para>Here's an example of a hand-created queue registration. This file
+ must go in the directory specified by the queue-push-store-dir config
+ variable defined in Chapter 2:</para>
+
+ <programlisting><push-registration id="111">
+<destination>jms.queue.bar</destination>
+<durable>true>
+<link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="PUT"/>
+</push-registration></programlisting>
+
+ <para>Here's an example of a hand-created topic registration. This file
+ must go in the directory specified by the topic-push-store-dir config
+ variable defined in Chapter 2:</para>
+
+ <programlisting><push-topic-registration id="112">
+<destination>my-subscription-1</destination
+<durable>true</durable>
+<link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="PUT"/>
+<topic>jms.topic.foo</topic>
+</push-topic-registration></programlisting>
+ </sect1>
+
+ <sect1>
+ <title>Pushing to Authenticated Servers</title>
+
+ <para>Push subscriptions only support BASIC and DIGEST authentication
+ out of the box. Here is an example of adding BASIC
+ authentication:</para>
+
+ <programlisting><push-topic-registration>
+<durable>true</durable>
+<link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="POST"/>
+<authentication>
+ <basic-auth>
+ <username>guest</username>
+ <password>geheim</password>
+ </basic-auth>
+</authentication>
+</push-topic registration></programlisting>
+
+ <para>For DIGEST, just replace basic-auth with digest-auth.</para>
+
+ <para>For other authentication mechanisms, you can register headers you
+ want transmitted with each request. Use the header element with the name
+ attribute representing the name of the header. Here's what custom
+ headers might look like:</para>
+
+ <programlisting><push-topic-registration>
+<durable>true</durable>
+<link rel="template"
href="http://somewhere.com/resources/{id}/messages"
method="POST"/>
+<header name="secret-header">jfdiwe3321</header>
+</push-topic registration></programlisting>
+ </sect1>
+</chapter>
\ No newline at end of file
Added: trunk/docs/rest-manual/en/security.xml
===================================================================
--- trunk/docs/rest-manual/en/security.xml (rev 0)
+++ trunk/docs/rest-manual/en/security.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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 chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Rest_Manual.ent">
+%BOOK_ENTITIES;
+]>
+<chapter>
+ <title>Securing the HornetQ REST Interface</title>
+
+ <para></para>
+
+ <sect1>
+ <title>Within JBoss Application server</title>
+
+ <para>Securing the HornetQ REST interface is very simple with the JBoss
+ Application Server. You turn on authentication for all URLs within your
+ WAR's web.xml, and let the user Principal to propagate to HornetQ. This
+ only works if you are using the JBossSecurityManager with HornetQ. See
+ the HornetQ documentation for more details.</para>
+ </sect1>
+
+ <sect1>
+ <title>Security in other environments</title>
+
+ <para>To secure the HornetQ REST interface in other environments you
+ must role your own security by specifying security constraints with your
+ web.xml for every path of every queue and topic you have deployed. Here
+ is a list of URI patterns:</para>
+
+ <table>
+ <title></title>
+
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>/queues</entry>
+
+ <entry>secure the POST operation to secure queue
+ creation</entry>
+ </row>
+
+ <row>
+ <entry>/queues/{queue-name}</entry>
+
+ <entry>secure the GET HEAD operation to getting information
+ about the queue.</entry>
+ </row>
+
+ <row>
+ <entry>/queues/{queue-name}/create/*</entry>
+
+ <entry>secure this URL pattern for producing messages.</entry>
+ </row>
+
+ <row>
+ <entry>/queues/{queue-name}/pull-consumers/*</entry>
+
+ <entry>secure this URL pattern for pulling messages
+ messages.</entry>
+ </row>
+
+ <row>
+ <entry>/queues/{queue-name}/push-consumers/*</entry>
+
+ <entry>secure this URL pattern for pushing messages.</entry>
+ </row>
+
+ <row>
+ <entry>/topics</entry>
+
+ <entry>secure the POST operation to secure topic
+ creation</entry>
+ </row>
+
+ <row>
+ <entry>/topics/{topic-name}</entry>
+
+ <entry>secure the GET HEAD operation to getting information
+ about the topic.</entry>
+ </row>
+
+ <row>
+ <entry>/topics/{topic-name}/create/*</entry>
+
+ <entry>secure this URL pattern for producing messages.</entry>
+ </row>
+
+ <row>
+ <entry>/topics/{topic-name}/pull-subscriptions/*</entry>
+
+ <entry>secure this URL pattern for pulling messages
+ messages.</entry>
+ </row>
+
+ <row>
+ <entry>/topics/{topic-name}/push-subscriptions/*</entry>
+
+ <entry>secure this URL pattern for pushing messages.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+</chapter>
\ No newline at end of file
Copied: trunk/docs/rest-manual/pom.xml (from rev 10511,
trunk/hornetq-rest/docbook/pom.xml)
===================================================================
--- trunk/docs/rest-manual/pom.xml (rev 0)
+++ trunk/docs/rest-manual/pom.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2009 Red Hat, Inc.
+ ~ Red Hat 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.
+ -->
+
+<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>
+
+ <parent>
+ <groupId>org.hornetq.docs</groupId>
+ <artifactId>hornetq-docs</artifactId>
+ <version>2.2.3-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.hornetq.docs</groupId>
+ <artifactId>${docname}-${translation}</artifactId>
+ <version>1.0</version>
+ <packaging>jdocbook</packaging>
+ <name>${bookname}-(${translation})</name>
+
+ <properties>
+ <translation>en</translation>
+ <docname>HornetQ_Rest_Manual</docname>
+ <bookname>HornetQ Rest Manual</bookname>
+ </properties>
+
+ <repositories>
+ <repository>
+ <id>jboss-public-repository-group</id>
+ <name>JBoss Public Maven Repository Group</name>
+
<
url>https://repository.jboss.org/nexus/content/groups/public/</url>
+ <layout>default</layout>
+ <releases>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </snapshots>
+ </repository>
+ </repositories>
+ <pluginRepositories>
+ <pluginRepository>
+ <id>jboss-public-repository-group</id>
+ <name>JBoss Public Maven Repository Group</name>
+
<
url>https://repository.jboss.org/nexus/content/groups/public/</url>
+ <layout>default</layout>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </pluginRepository>
+ <!--pluginRepository>
+ <id>jboss-snapshot-repository-group</id>
+ <name>JBoss Snapshot Maven Repository Group</name>
+
<
url>https://repository.jboss.org/nexus/content/groups/snapshot/</ur...
+ <layout>default</layout>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </pluginRepository-->
+ </pluginRepositories>
+
+ <profiles>
+
+ <!-- mvn compile -->
+ <profile>
+ <id>all</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.jboss.maven.plugins</groupId>
+ <artifactId>maven-jdocbook-plugin</artifactId>
+ <version>2.2.1</version>
+ <extensions>true</extensions>
+ <configuration>
+ <formats>
+ <format>
+ <formatName>pdf</formatName>
+
<stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
+ <finalName>${docname}.pdf</finalName>
+ </format>
+ <format>
+ <formatName>html</formatName>
+
<stylesheetResource>classpath:/xslt/org/jboss/xhtml.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ <format>
+ <formatName>html_single</formatName>
+
<stylesheetResource>classpath:/xslt/org/jboss/xhtml-single.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ </formats>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+
+ <!-- mvn compile -Phtml -->
+ <profile>
+ <id>html</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.jboss.maven.plugins</groupId>
+ <artifactId>maven-jdocbook-plugin</artifactId>
+ <version>2.2.1</version>
+ <extensions>true</extensions>
+ <configuration>
+ <formats>
+ <format>
+ <formatName>html</formatName>
+
<stylesheetResource>classpath:/xslt/org/jboss/xhtml.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ </formats>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+
+ <!-- mvn compile -Phtml-single -->
+ <profile>
+ <id>html-single</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.jboss.maven.plugins</groupId>
+ <artifactId>maven-jdocbook-plugin</artifactId>
+ <version>2.2.1</version>
+ <extensions>true</extensions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+
+ <!-- mvn compile -Ppdf -->
+ <profile>
+ <id>pdf</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.jboss.maven.plugins</groupId>
+ <artifactId>maven-jdocbook-plugin</artifactId>
+ <version>2.1.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <formats>
+ <format>
+ <formatName>pdf</formatName>
+
<stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
+ <finalName>${docname}.pdf</finalName>
+ </format>
+ </formats>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.jboss.maven.plugins</groupId>
+ <artifactId>maven-jdocbook-plugin</artifactId>
+ <version>2.2.1</version>
+ <extensions>true</extensions>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.pressgang</groupId>
+ <artifactId>pressgang-xslt</artifactId>
+ <version>1.2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss</groupId>
+ <artifactId>jbossorg-jdocbook-style</artifactId>
+ <version>1.1.1</version>
+ <type>jdocbook-style</type>
+ </dependency>
+ </dependencies>
+ <configuration>
+ <sourceDirectory>${project.basedir}</sourceDirectory>
+ <sourceDocumentName>${docname}.xml</sourceDocumentName>
+ <masterTranslation>en</masterTranslation>
+ <imageResource>
+ <directory>${project.basedir}/en</directory>
+ <includes>
+ <include>images/*.png</include>
+ </includes>
+ </imageResource>
+ <formats>
+ <format>
+ <formatName>pdf</formatName>
+
<stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
+ <finalName>${pdf.name}</finalName>
+ </format>
+ <format>
+ <formatName>html</formatName>
+
<stylesheetResource>classpath:/xslt/org/jboss/xhtml.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ <format>
+ <formatName>html_single</formatName>
+
<stylesheetResource>classpath:/xslt/org/jboss/xhtml-single.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ </formats>
+ <options>
+ <xincludeSupported>true</xincludeSupported>
+ <xmlTransformerType>saxon</xmlTransformerType>
+ <docbookVersion>1.72.0</docbookVersion>
+ <localeSeparator>-</localeSeparator>
+ <transformerParameters>
+ <property>
+ <name>javax.xml.parsers.DocumentBuilderFactory</name>
+ <value>org.apache.xerces.jaxp.DocumentBuilderFactoryImpl</value>
+ </property>
+ <property>
+ <name>javax.xml.parsers.SAXParserFactory</name>
+ <value>org.apache.xerces.jaxp.SAXParserFactoryImpl</value>
+ </property>
+ </transformerParameters>
+ </options>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+ <!--<build>
+ <plugins>
+ <plugin>
+ <groupId>org.jboss.maven.plugins</groupId>
+ <artifactId>maven-jdocbook-plugin</artifactId>
+ <version>2.2.1</version>
+ <extensions>true</extensions>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.pressgang</groupId>
+ <artifactId>pressgang-xslt</artifactId>
+ <version>1.2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss</groupId>
+ <artifactId>jbossorg-jdocbook-style</artifactId>
+ <version>1.1.1</version>
+ <type>jdocbook-style</type>
+ </dependency>
+ </dependencies>
+ <configuration>
+ <sourceDocumentName>${docname}.xml</sourceDocumentName>
+ <sourceDirectory>.</sourceDirectory>
+ <imageResource>
+ <directory>${translation}</directory>
+ <includes>
+ <include>images/*</include>
+ </includes>
+ </imageResource>
+ <options>
+ <xincludeSupported>true</xincludeSupported>
+ <xmlTransformerType>saxon</xmlTransformerType>
+ <transformerParameters>
+ <property>
+ <name>javax.xml.parsers.DocumentBuilderFactory</name>
+ <value>org.apache.xerces.jaxp.DocumentBuilderFactoryImpl</value>
+ </property>
+ <property>
+ <name>javax.xml.parsers.SAXParserFactory</name>
+ <value>org.apache.xerces.jaxp.SAXParserFactoryImpl</value>
+ </property>
+ </transformerParameters>
+ </options>
+ </configuration>
+ </plugin>
+
+ </plugins>
+ </build>-->
+
+</project>
Deleted: trunk/hornetq-rest/docbook/pom.xml
===================================================================
--- trunk/hornetq-rest/docbook/pom.xml 2011-04-19 03:31:49 UTC (rev 10528)
+++ trunk/hornetq-rest/docbook/pom.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -1,128 +0,0 @@
-<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>org.hornetq.rest</groupId>
- <artifactId>hornetq-rest-reference-guide-${translation}</artifactId>
- <version>2.2.2.Final</version>
- <packaging>jdocbook</packaging>
- <name>HornetQ REST Interface Reference Guide (${translation})</name>
- <repositories>
- <repository>
- <id>jboss</id>
-
<
url>http://repository.jboss.org/nexus/content/groups/public/</url>
- </repository>
- </repositories>
- <pluginRepositories>
- <pluginRepository>
- <id>jboss</id>
-
<
url>http://repository.jboss.org/nexus/content/groups/public/</url>
- </pluginRepository>
- <!--
- <pluginRepository>
- <id>maven2-repository.dev.java.net</id>
- <
url>http://download.java.net/maven/2</url>
- </pluginRepository>
- <pluginRepository>
- <id>maven-repository.dev.java.net</id>
- <
name>Java.net Maven 1 Repository (legacy)</name>
- <
url>http://download.java.net/maven/1</url>
- <layout>legacy</layout>
- </pluginRepository>
- -->
- </pluginRepositories>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.jboss.maven.plugins</groupId>
- <artifactId>maven-jdocbook-plugin</artifactId>
- <version>2.1.2</version>
- <extensions>true</extensions>
- <dependencies>
- <dependency>
- <groupId>org.jboss</groupId>
- <artifactId>jbossorg-docbook-xslt</artifactId>
- <version>1.1.0</version>
- </dependency>
- <dependency>
- <groupId>org.jboss</groupId>
- <artifactId>jbossorg-jdocbook-style</artifactId>
- <version>1.0.0</version>
- <type>jdocbook-style</type>
- </dependency>
- </dependencies>
- <configuration>
- <!--minmemory>1024m</minmemory>
- <maxmemory>1024m</maxmemory -->
- <sourceDocumentName>master.xml</sourceDocumentName>
- <sourceDirectory>reference/en</sourceDirectory>
- <imageResource>
- <directory>reference/en</directory>
- <includes>
- <include>images/*</include>
- </includes>
- </imageResource>
- <!-- <cssResource>
- <directory>src/main/css</directory>
- </cssResource> -->
- <!--put back css -->
-
- <formats>
- <format>
- <formatName>html</formatName>
-
<stylesheetResource>classpath:/xslt/org/jboss/xhtml.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>
- <format>
- <formatName>html_single</formatName>
-
<stylesheetResource>classpath:/xslt/org/jboss/xhtml-single.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>
-
- <format>
- <formatName>pdf</formatName>
-
<stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
-
<finalName>HornetQ_REST_Interface_Guide.pdf</finalName>
- <profilingTypeName>two_pass</profilingTypeName>
- </format>
-
-
- <!--<format>
- <formatName>eclipse</formatName>
-
<stylesheetResource>classpath:/xslt/main-eclipse.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>-->
- </formats>
- <options>
- <xincludeSupported>true</xincludeSupported>
- <xmlTransformerType>saxon</xmlTransformerType>
- <!-- needed for uri-resolvers; can be ommitted if using
'current' uri scheme -->
- <!-- could also locate the docbook dependency and inspect
its version... -->
- <!--docbookVersion>1.72.0</docbookVersion -->
- <docbookVersion>1.72.0</docbookVersion>
- <transformerParameters>
- <property>
-
<name>javax.xml.parsers.DocumentBuilderFactory</name>
-
<value>org.apache.xerces.jaxp.DocumentBuilderFactoryImpl</value>
- </property>
- <property>
-
<name>javax.xml.parsers.SAXParserFactory</name>
-
<value>org.apache.xerces.jaxp.SAXParserFactoryImpl</value>
- </property>
-
<!--<javax.xml.parsers.DocumentBuilderFactory>org.apache.xerces.jaxp.DocumentBuilderFactoryImpl</javax.xml.parsers.DocumentBuilderFactory>
-
<javax.xml.parsers.SAXParserFactory>org.apache.xerces.jaxp.SAXParserFactoryImpl</javax.xml.parsers.SAXParserFactory>
-
<
javax.xml.validation.SchemaFactory:http\://www.w3.org/2001/XMLSchema>o...
- </transformerParameters>
- </options>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
- <properties>
- <translation>en-US</translation>
- </properties>
-</project>
Added: trunk/hornetq-rest/hornetq-rest/hornetq-rest.iml
===================================================================
--- trunk/hornetq-rest/hornetq-rest/hornetq-rest.iml (rev 0)
+++ trunk/hornetq-rest/hornetq-rest/hornetq-rest.iml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module
org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true"
type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6"
inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java"
isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/java"
isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/resources"
isTestSource="true" />
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="hornetq-core"
scope="PROVIDED" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
org.jboss.netty:netty:3.2.3.Final" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
org.jboss.resteasy:resteasy-jaxrs:2.1.0.GA" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
org.jboss.resteasy:jaxrs-api:2.1.0.GA" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
org.scannotation:scannotation:1.0.2" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
javassist:javassist:3.6.0.GA" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
javax.annotation:jsr250-api:1.0" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
javax.activation:activation:1.1" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
commons-httpclient:commons-httpclient:3.1" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
commons-logging:commons-logging:1.0.4" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
commons-codec:commons-codec:1.2" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
net.jcip:jcip-annotations:1.0" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
org.jboss.resteasy:resteasy-jaxb-provider:2.1.0.GA" level="project" />
+ <orderEntry type="library" scope="TEST" name="Maven:
org.jboss.resteasy:resteasy-jackson-provider:2.1.0.GA" level="project"
/>
+ <orderEntry type="library" scope="TEST" name="Maven:
org.codehaus.jackson:jackson-core-asl:1.6.3" level="project" />
+ <orderEntry type="library" scope="TEST" name="Maven:
org.codehaus.jackson:jackson-mapper-asl:1.6.3" level="project" />
+ <orderEntry type="library" scope="TEST" name="Maven:
org.codehaus.jackson:jackson-jaxrs:1.6.3" level="project" />
+ <orderEntry type="library" scope="TEST" name="Maven:
org.codehaus.jackson:jackson-xc:1.6.3" level="project" />
+ <orderEntry type="module" module-name="hornetq-jms"
scope="PROVIDED" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
org.jboss.javaee:jboss-jms-api:1.1.0.GA" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
org.jboss.javaee:jboss-transaction-api:1.0.1.GA" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
jboss.jbossts:jbossjts:4.6.1.GA" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
org.jboss.spec.javax.jms:jboss-jms-api_1.1_spec:1.0.0.Beta1"
level="project" />
+ <orderEntry type="library" name="Maven: junit:junit:4.1"
level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven:
javax.servlet:servlet-api:2.5" level="project" />
+ <orderEntry type="library" scope="TEST" name="Maven:
org.jboss.resteasy:tjws:2.1.0.GA" level="project" />
+ </component>
+</module>
+
Modified: trunk/hornetq-rest/hornetq-rest/pom.xml
===================================================================
--- trunk/hornetq-rest/hornetq-rest/pom.xml 2011-04-19 03:31:49 UTC (rev 10528)
+++ trunk/hornetq-rest/hornetq-rest/pom.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -4,7 +4,7 @@
<parent>
<groupId>org.hornetq.rest</groupId>
<artifactId>hornetq-rest-all</artifactId>
- <version>2.2.2.Final</version>
+ <version>2.2.3-SNAPSHOT</version>
</parent>
<groupId>org.hornetq.rest</groupId>
Added: trunk/hornetq-rest/hornetq-rest-all.iml
===================================================================
--- trunk/hornetq-rest/hornetq-rest-all.iml (rev 0)
+++ trunk/hornetq-rest/hornetq-rest-all.iml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module
org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true"
type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5"
inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder
url="file://$MODULE_DIR$/${project.build.directory}/classes" />
+ <excludeFolder
url="file://$MODULE_DIR$/${project.build.directory}/test-classes" />
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
+
Modified: trunk/hornetq-rest/pom.xml
===================================================================
--- trunk/hornetq-rest/pom.xml 2011-04-19 03:31:49 UTC (rev 10528)
+++ trunk/hornetq-rest/pom.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -2,16 +2,21 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.hornetq</groupId>
+ <artifactId>hornetq-pom</artifactId>
+ <version>2.2.3-SNAPSHOT</version>
+ </parent>
+
<name>HornetQ REST Interface Parent POM</name>
<groupId>org.hornetq.rest</groupId>
<artifactId>hornetq-rest-all</artifactId>
- <version>2.2.3.-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<resteasy.version>2.1.0.GA</resteasy.version>
- <hornetq.version>2.2.2.Final</hornetq.version>
+ <hornetq.version>${project.version}</hornetq.version>
</properties>
<licenses>
@@ -31,7 +36,7 @@
</distributionManagement>
<modules>
- <module>hornetq-rest</module>
+ <module>hornetq-rest</module>
</modules>
<dependencyManagement>
Modified: trunk/hornetq.ipr
===================================================================
--- trunk/hornetq.ipr 2011-04-19 03:31:49 UTC (rev 10528)
+++ trunk/hornetq.ipr 2011-04-19 10:32:50 UTC (rev 10529)
@@ -382,6 +382,7 @@
<component name="ProjectModuleManager">
<modules>
<module
fileurl="file://$PROJECT_DIR$/docs/quickstart-guide/HornetQ_QuickStart_Guide-en.iml"
filepath="$PROJECT_DIR$/docs/quickstart-guide/HornetQ_QuickStart_Guide-en.iml"
/>
+ <module
fileurl="file://$PROJECT_DIR$/docs/rest-manual/HornetQ_Rest_Manual-en.iml"
filepath="$PROJECT_DIR$/docs/rest-manual/HornetQ_Rest_Manual-en.iml" />
<module
fileurl="file://$PROJECT_DIR$/docs/user-manual/HornetQ_User_Manual-en.iml"
filepath="$PROJECT_DIR$/docs/user-manual/HornetQ_User_Manual-en.iml" />
<module
fileurl="file://$PROJECT_DIR$/tests/concurrent-tests/concurrent-tests.iml"
filepath="$PROJECT_DIR$/tests/concurrent-tests/concurrent-tests.iml" />
<module fileurl="file://$PROJECT_DIR$/hornetq.iml"
filepath="$PROJECT_DIR$/hornetq.iml" />
@@ -399,6 +400,8 @@
<module
fileurl="file://$PROJECT_DIR$/hornetq-ra/hornetq-ra-jar/hornetq-ra.iml"
filepath="$PROJECT_DIR$/hornetq-ra/hornetq-ra-jar/hornetq-ra.iml" />
<module
fileurl="file://$PROJECT_DIR$/hornetq-ra/hornetq-ra-rar/hornetq-rar.iml"
filepath="$PROJECT_DIR$/hornetq-ra/hornetq-ra-rar/hornetq-rar.iml" />
<module fileurl="file://$PROJECT_DIR$/hornetq-ra/hornetq-rar-pom.iml"
filepath="$PROJECT_DIR$/hornetq-ra/hornetq-rar-pom.iml" />
+ <module
fileurl="file://$PROJECT_DIR$/hornetq-rest/hornetq-rest/hornetq-rest.iml"
filepath="$PROJECT_DIR$/hornetq-rest/hornetq-rest/hornetq-rest.iml" />
+ <module
fileurl="file://$PROJECT_DIR$/hornetq-rest/hornetq-rest-all.iml"
filepath="$PROJECT_DIR$/hornetq-rest/hornetq-rest-all.iml" />
<module
fileurl="file://$PROJECT_DIR$/hornetq-service-sar/hornetq-service-sar.iml"
filepath="$PROJECT_DIR$/hornetq-service-sar/hornetq-service-sar.iml" />
<module
fileurl="file://$PROJECT_DIR$/hornetq-spring-integration/hornetq-spring-integration.iml"
filepath="$PROJECT_DIR$/hornetq-spring-integration/hornetq-spring-integration.iml"
/>
<module fileurl="file://$PROJECT_DIR$/tests/hornetq-tests-pom.iml"
filepath="$PROJECT_DIR$/tests/hornetq-tests-pom.iml" />
@@ -532,6 +535,39 @@
<root
url="jar://$MAVEN_REPOSITORY$/apache-xerces/xml-apis/2.9.1/xml-apis-2.9.1-sources.jar!/"
/>
</SOURCES>
</library>
+ <library name="Maven: commons-codec:commons-codec:1.2">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.2/commons-codec-1.2.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.2/commons-codec-1.2-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.2/commons-codec-1.2-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: commons-httpclient:commons-httpclient:3.1">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: commons-logging:commons-logging:1.0.4">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-sources.jar!/"
/>
+ </SOURCES>
+ </library>
<library name="Maven: commons-logging:commons-logging:1.1.1">
<CLASSES>
<root
url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar!/"
/>
@@ -543,6 +579,28 @@
<root
url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar!/"
/>
</SOURCES>
</library>
+ <library name="Maven: javassist:javassist:3.6.0.GA">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/javassist/javassist/3.6.0.GA/javassist-3.6.0.GA.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/javassist/javassist/3.6.0.GA/javassist-3.6.0.GA-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/javassist/javassist/3.6.0.GA/javassist-3.6.0.GA-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: javax.activation:activation:1.1">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1-sources.jar!/"
/>
+ </SOURCES>
+ </library>
<library name="Maven: javax.activation:activation:1.1.1">
<CLASSES>
<root
url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1.1/activation-1.1.1.jar!/"
/>
@@ -554,6 +612,28 @@
<root
url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1.1/activation-1.1.1-sources.jar!/"
/>
</SOURCES>
</library>
+ <library name="Maven: javax.annotation:jsr250-api:1.0">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: javax.servlet:servlet-api:2.5">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/servlet/servlet-api/2.5/servlet-api-2.5-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/javax/servlet/servlet-api/2.5/servlet-api-2.5-sources.jar!/"
/>
+ </SOURCES>
+ </library>
<library name="Maven: jboss.jbossts:jbossjts:4.6.1.GA">
<CLASSES>
<root
url="jar://$MAVEN_REPOSITORY$/jboss/jbossts/jbossjts/4.6.1.GA/jbossjts-4.6.1.GA.jar!/"
/>
@@ -587,6 +667,17 @@
<root
url="jar://$MAVEN_REPOSITORY$/junit/junit/3.8.2/junit-3.8.2-sources.jar!/"
/>
</SOURCES>
</library>
+ <library name="Maven: junit:junit:4.1">
+ <CLASSES>
+ <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.1/junit-4.1.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/junit/junit/4.1/junit-4.1-javadoc.jar!/" />
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/junit/junit/4.1/junit-4.1-sources.jar!/" />
+ </SOURCES>
+ </library>
<library name="Maven: log4j:log4j:1.2.14">
<CLASSES>
<root
url="jar://$MAVEN_REPOSITORY$/log4j/log4j/1.2.14/log4j-1.2.14.jar!/" />
@@ -598,6 +689,61 @@
<root
url="jar://$MAVEN_REPOSITORY$/log4j/log4j/1.2.14/log4j-1.2.14-sources.jar!/"
/>
</SOURCES>
</library>
+ <library name="Maven: net.jcip:jcip-annotations:1.0">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/net/jcip/jcip-annotations/1.0/jcip-annotations-1.0.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/net/jcip/jcip-annotations/1.0/jcip-annotations-1.0-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/net/jcip/jcip-annotations/1.0/jcip-annotations-1.0-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: org.codehaus.jackson:jackson-core-asl:1.6.3">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-core-asl/1.6.3/jackson-core-asl-1.6.3.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-core-asl/1.6.3/jackson-core-asl-1.6.3-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-core-asl/1.6.3/jackson-core-asl-1.6.3-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: org.codehaus.jackson:jackson-jaxrs:1.6.3">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-jaxrs/1.6.3/jackson-jaxrs-1.6.3.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-jaxrs/1.6.3/jackson-jaxrs-1.6.3-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-jaxrs/1.6.3/jackson-jaxrs-1.6.3-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven:
org.codehaus.jackson:jackson-mapper-asl:1.6.3">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-mapper-asl/1.6.3/jackson-mapper-asl-1.6.3.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-mapper-asl/1.6.3/jackson-mapper-asl-1.6.3-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-mapper-asl/1.6.3/jackson-mapper-asl-1.6.3-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: org.codehaus.jackson:jackson-xc:1.6.3">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-xc/1.6.3/jackson-xc-1.6.3.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-xc/1.6.3/jackson-xc-1.6.3-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/codehaus/jackson/jackson-xc/1.6.3/jackson-xc-1.6.3-sources.jar!/"
/>
+ </SOURCES>
+ </library>
<library name="Maven:
org.jboss.integration:jboss-transaction-spi:5.1.0.GA">
<CLASSES>
<root
url="jar://$MAVEN_REPOSITORY$/org/jboss/integration/jboss-transaction-spi/5.1.0.GA/jboss-transaction-spi-5.1.0.GA.jar!/"
/>
@@ -719,6 +865,61 @@
<root
url="jar://$MAVEN_REPOSITORY$/org/jboss/netty/netty/3.2.3.Final/netty-3.2.3.Final-sources.jar!/"
/>
</SOURCES>
</library>
+ <library name="Maven: org.jboss.resteasy:jaxrs-api:2.1.0.GA">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/jaxrs-api/2.1.0.GA/jaxrs-api-2.1.0.GA.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/jaxrs-api/2.1.0.GA/jaxrs-api-2.1.0.GA-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/jaxrs-api/2.1.0.GA/jaxrs-api-2.1.0.GA-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven:
org.jboss.resteasy:resteasy-jackson-provider:2.1.0.GA">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jackson-provider/2.1.0.GA/resteasy-jackson-provider-2.1.0.GA.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jackson-provider/2.1.0.GA/resteasy-jackson-provider-2.1.0.GA-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jackson-provider/2.1.0.GA/resteasy-jackson-provider-2.1.0.GA-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven:
org.jboss.resteasy:resteasy-jaxb-provider:2.1.0.GA">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jaxb-provider/2.1.0.GA/resteasy-jaxb-provider-2.1.0.GA.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jaxb-provider/2.1.0.GA/resteasy-jaxb-provider-2.1.0.GA-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jaxb-provider/2.1.0.GA/resteasy-jaxb-provider-2.1.0.GA-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: org.jboss.resteasy:resteasy-jaxrs:2.1.0.GA">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jaxrs/2.1.0.GA/resteasy-jaxrs-2.1.0.GA.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jaxrs/2.1.0.GA/resteasy-jaxrs-2.1.0.GA-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/resteasy-jaxrs/2.1.0.GA/resteasy-jaxrs-2.1.0.GA-sources.jar!/"
/>
+ </SOURCES>
+ </library>
+ <library name="Maven: org.jboss.resteasy:tjws:2.1.0.GA">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/tjws/2.1.0.GA/tjws-2.1.0.GA.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/tjws/2.1.0.GA/tjws-2.1.0.GA-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/resteasy/tjws/2.1.0.GA/tjws-2.1.0.GA-sources.jar!/"
/>
+ </SOURCES>
+ </library>
<library name="Maven:
org.jboss.security:jboss-security-spi:2.0.3.SP1">
<CLASSES>
<root
url="jar://$MAVEN_REPOSITORY$/org/jboss/security/jboss-security-spi/2.0.3.SP1/jboss-security-spi-2.0.3.SP1.jar!/"
/>
@@ -741,6 +942,17 @@
<root
url="jar://$MAVEN_REPOSITORY$/org/jboss/security/jbosssx/2.0.3.SP1/jbosssx-2.0.3.SP1-sources.jar!/"
/>
</SOURCES>
</library>
+ <library name="Maven:
org.jboss.spec.javax.jms:jboss-jms-api_1.1_spec:1.0.0.Beta1">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/spec/javax/jms/jboss-jms-api_1.1_spec/1.0.0.Beta1/jboss-jms-api_1.1_spec-1.0.0.Beta1.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/spec/javax/jms/jboss-jms-api_1.1_spec/1.0.0.Beta1/jboss-jms-api_1.1_spec-1.0.0.Beta1-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/jboss/spec/javax/jms/jboss-jms-api_1.1_spec/1.0.0.Beta1/jboss-jms-api_1.1_spec-1.0.0.Beta1-sources.jar!/"
/>
+ </SOURCES>
+ </library>
<library name="Maven: org.jboss:jboss-common-core:2.2.14.GA">
<CLASSES>
<root
url="jar://$MAVEN_REPOSITORY$/org/jboss/jboss-common-core/2.2.14.GA/jboss-common-core-2.2.14.GA.jar!/"
/>
@@ -785,6 +997,17 @@
<root
url="jar://$MAVEN_REPOSITORY$/org/jboss/jbossxb/2.0.1.GA/jbossxb-2.0.1.GA-sources.jar!/"
/>
</SOURCES>
</library>
+ <library name="Maven: org.scannotation:scannotation:1.0.2">
+ <CLASSES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/scannotation/scannotation/1.0.2/scannotation-1.0.2.jar!/"
/>
+ </CLASSES>
+ <JAVADOC>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/scannotation/scannotation/1.0.2/scannotation-1.0.2-javadoc.jar!/"
/>
+ </JAVADOC>
+ <SOURCES>
+ <root
url="jar://$MAVEN_REPOSITORY$/org/scannotation/scannotation/1.0.2/scannotation-1.0.2-sources.jar!/"
/>
+ </SOURCES>
+ </library>
<library name="Maven: org.springframework:spring-aop:3.0.3.RELEASE">
<CLASSES>
<root
url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/3.0.3.RELEASE/spring-aop-3.0.3.RELEASE.jar!/"
/>
Modified: trunk/hornetq.iws
===================================================================
--- trunk/hornetq.iws 2011-04-19 03:31:49 UTC (rev 10528)
+++ trunk/hornetq.iws 2011-04-19 10:32:50 UTC (rev 10529)
@@ -2,8 +2,36 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" readonly="true"
id="a2aae645-dbcd-4d6e-9c99-efa05d93589a" name="Default"
comment="">
- <change type="MODIFICATION"
beforePath="$PROJECT_DIR$/distribution/hornetq/pom.xml"
afterPath="$PROJECT_DIR$/distribution/hornetq/pom.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/HornetQ_Rest_Manual-en.iml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/Author_Group.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/Book_Info.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/HornetQ_Rest_Manual.ent" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/HornetQ_Rest_Manual.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/about.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/basics.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/consuming-messages.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/creating-destinations.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/installation.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/introduction.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/jms-and-rest.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/notice.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/posting-messages.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/pushing-messages.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/docs/rest-manual/en/security.xml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/hornetq-rest/hornetq-rest-all.iml" />
+ <change type="NEW" beforePath=""
afterPath="$PROJECT_DIR$/hornetq-rest/hornetq-rest/hornetq-rest.iml" />
+ <change type="MOVED"
beforePath="$PROJECT_DIR$/hornetq-rest/docbook/pom.xml"
afterPath="$PROJECT_DIR$/docs/rest-manual/pom.xml" />
+ <change type="MOVED"
beforePath="$PROJECT_DIR$/hornetq-rest/docbook/reference/en/master.xml"
afterPath="$PROJECT_DIR$/docs/rest-manual/en/master.xml" />
+ <change type="MODIFICATION"
beforePath="$PROJECT_DIR$/docs/pom.xml"
afterPath="$PROJECT_DIR$/docs/pom.xml" />
+ <change type="MODIFICATION"
beforePath="$PROJECT_DIR$/hornetq-rest/hornetq-rest/pom.xml"
afterPath="$PROJECT_DIR$/hornetq-rest/hornetq-rest/pom.xml" />
+ <change type="MODIFICATION"
beforePath="$PROJECT_DIR$/hornetq-rest/pom.xml"
afterPath="$PROJECT_DIR$/hornetq-rest/pom.xml" />
+ <change type="MODIFICATION"
beforePath="$PROJECT_DIR$/hornetq.ipr"
afterPath="$PROJECT_DIR$/hornetq.ipr" />
<change type="MODIFICATION"
beforePath="$PROJECT_DIR$/hornetq.iws"
afterPath="$PROJECT_DIR$/hornetq.iws" />
+ <change type="MODIFICATION"
beforePath="$PROJECT_DIR$/pom.xml" afterPath="$PROJECT_DIR$/pom.xml"
/>
+ <change type="MOVED"
beforePath="$PROJECT_DIR$/hornetq-rest/docbook/reference/en/images"
afterPath="$PROJECT_DIR$/docs/rest-manual/en/images" />
+ <change type="MOVED"
beforePath="$PROJECT_DIR$/hornetq-rest/docbook/reference/en/modules"
afterPath="$PROJECT_DIR$/docs/rest-manual/en/modules" />
+ <change type="MOVED"
beforePath="$PROJECT_DIR$/hornetq-rest/docbook/reference/en"
afterPath="$PROJECT_DIR$/docs/rest-manual/en" />
</list>
<ignored path=".idea/workspace.xml" />
<ignored path="$USER_HOME_GRAILS$/" />
@@ -81,86 +109,95 @@
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="pom.xml" pinned="false"
current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/tests/timing-tests/pom.xml">
+ <entry file="file://$PROJECT_DIR$/hornetq-rest/pom.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="28" column="27"
selection-start="1237" selection-end="1237"
vertical-scroll-proportion="0.0">
+ <state line="38" column="36"
selection-start="1283" selection-end="1283"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
- <file leaf-file-name="pom.xml" pinned="false"
current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/tests/joram-tests/pom.xml">
+ <file leaf-file-name="master.xml" pinned="false"
current="false" current-in-tab="false">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/master.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="28" column="26"
selection-start="1234" selection-end="1234"
vertical-scroll-proportion="0.0">
+ <state line="0" column="0"
selection-start="0" selection-end="0"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
- <file leaf-file-name="pom.xml" pinned="false"
current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/tests/jms-tests/pom.xml">
+ <file leaf-file-name="introduction.xml" pinned="false"
current="false" current-in-tab="false">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/introduction.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="129" column="40"
selection-start="4633" selection-end="4633"
vertical-scroll-proportion="0.0">
+ <state line="15" column="52"
selection-start="850" selection-end="850"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
- <file leaf-file-name="pom.xml" pinned="false"
current="false" current-in-tab="false">
- <entry
file="file://$PROJECT_DIR$/tests/integration-tests/pom.xml">
+ <file leaf-file-name="about.xml" pinned="false"
current="false" current-in-tab="false">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/about.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="15" column="32"
selection-start="614" selection-end="614"
vertical-scroll-proportion="0.0">
+ <state line="0" column="0"
selection-start="0" selection-end="0"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
- <file leaf-file-name="pom.xml" pinned="false"
current="false" current-in-tab="false">
- <entry
file="file://$PROJECT_DIR$/tests/concurrent-tests/pom.xml">
+ <file leaf-file-name="basics.xml" pinned="false"
current="false" current-in-tab="false">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/basics.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="103" column="74"
selection-start="3735" selection-end="3735"
vertical-scroll-proportion="0.0">
+ <state line="0" column="0"
selection-start="0" selection-end="0"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
- <file leaf-file-name="pom.xml" pinned="false"
current="true" current-in-tab="true">
- <entry file="file://$PROJECT_DIR$/distribution/hornetq/pom.xml">
+ <file leaf-file-name="Book_Info.xml" pinned="false"
current="true" current-in-tab="true">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/Book_Info.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="200" column="107"
selection-start="9822" selection-end="9822"
vertical-scroll-proportion="0.89221555">
+ <state line="37" column="33"
selection-start="1595" selection-end="1595"
vertical-scroll-proportion="0.7997118">
<folding />
</state>
</provider>
</entry>
</file>
- <file leaf-file-name="dep.xml" pinned="false"
current="false" current-in-tab="false">
- <entry
file="file://$PROJECT_DIR$/distribution/hornetq/src/main/assembly/dep.xml">
+ <file leaf-file-name="posting-messages.xml" pinned="false"
current="false" current-in-tab="false">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/posting-messages.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="103" column="44"
selection-start="4228" selection-end="4228"
vertical-scroll-proportion="0.0">
+ <state line="15" column="52"
selection-start="850" selection-end="850"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
- <file leaf-file-name="hornetq-configuration.xml"
pinned="false" current="false" current-in-tab="false">
- <entry
file="file://$PROJECT_DIR$/distribution/hornetq/src/main/resources/config/jboss-as-6/non-clustered/hornetq-configuration.xml">
+ <file leaf-file-name="pushing-messages.xml" pinned="false"
current="false" current-in-tab="false">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/pushing-messages.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="46" column="129"
selection-start="2249" selection-end="2249"
vertical-scroll-proportion="0.0">
+ <state line="15" column="52"
selection-start="850" selection-end="850"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
- <file leaf-file-name="hornetq-configuration.xsd"
pinned="false" current="false" current-in-tab="false">
- <entry
file="file://$PROJECT_DIR$/hornetq-core/src/main/resources/schema/hornetq-configuration.xsd">
+ <file leaf-file-name="security.xml" pinned="false"
current="false" current-in-tab="false">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/security.xml">
<provider selected="true"
editor-type-id="text-editor">
- <state line="0" column="0"
selection-start="0" selection-end="0"
vertical-scroll-proportion="0.0">
+ <state line="21" column="33"
selection-start="953" selection-end="953"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
+ <file leaf-file-name="HornetQ_Rest_Manual.ent"
pinned="false" current="false" current-in-tab="false">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/HornetQ_Rest_Manual.ent">
+ <provider selected="true"
editor-type-id="text-editor">
+ <state line="18" column="0"
selection-start="778" selection-end="778"
vertical-scroll-proportion="0.0">
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ </file>
</leaf>
</component>
<component name="FindManager">
@@ -174,22 +211,22 @@
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
- <option value="$PROJECT_DIR$/pom.xml" />
- <option value="$PROJECT_DIR$/tests/pom.xml" />
- <option value="$PROJECT_DIR$/tests/timing-tests/pom.xml" />
- <option value="$PROJECT_DIR$/tests/stress-tests/pom.xml" />
- <option value="$PROJECT_DIR$/tests/soak-tests/pom.xml" />
- <option value="$PROJECT_DIR$/tests/performance-tests/pom.xml" />
- <option value="$PROJECT_DIR$/tests/joram-tests/pom.xml" />
- <option value="$PROJECT_DIR$/tests/jms-tests/pom.xml" />
- <option value="$PROJECT_DIR$/tests/integration-tests/pom.xml" />
- <option value="$PROJECT_DIR$/tests/concurrent-tests/pom.xml" />
- <option
value="$PROJECT_DIR$/distribution/hornetq/src/main/resources/config/stand-alone/clustered/hornetq-configuration.xml"
/>
- <option
value="$PROJECT_DIR$/distribution/hornetq/src/main/resources/catalog.xml" />
- <option
value="$PROJECT_DIR$/distribution/hornetq/src/main/resources/config/stand-alone/clustered/hornetq-jms.xml"
/>
- <option
value="$PROJECT_DIR$/distribution/hornetq/src/main/resources/config/jboss-as-6/non-clustered/hornetq-configuration.xml"
/>
- <option
value="$PROJECT_DIR$/distribution/hornetq/src/main/assembly/dep.xml" />
- <option value="$PROJECT_DIR$/distribution/hornetq/pom.xml" />
+ <option value="$PROJECT_DIR$/docs/rest-manual/en/Author_Group.xml"
/>
+ <option value="$PROJECT_DIR$/docs/rest-manual/en/basics.xml" />
+ <option
value="$PROJECT_DIR$/docs/rest-manual/en/consuming-messages.xml" />
+ <option
value="$PROJECT_DIR$/docs/rest-manual/en/creating-destinations.xml" />
+ <option value="$PROJECT_DIR$/docs/rest-manual/en/installation.xml"
/>
+ <option value="$PROJECT_DIR$/docs/rest-manual/en/introduction.xml"
/>
+ <option value="$PROJECT_DIR$/docs/rest-manual/en/jms-and-rest.xml"
/>
+ <option value="$PROJECT_DIR$/docs/rest-manual/en/notice.xml" />
+ <option
value="$PROJECT_DIR$/docs/rest-manual/en/posting-messages.xml" />
+ <option
value="$PROJECT_DIR$/docs/rest-manual/en/pushing-messages.xml" />
+ <option value="$PROJECT_DIR$/docs/rest-manual/en/security.xml"
/>
+ <option
value="$PROJECT_DIR$/docs/rest-manual/en/HornetQ_Rest_Manual.ent" />
+ <option
value="$PROJECT_DIR$/docs/rest-manual/en/HornetQ_Rest_Manual.xml" />
+ <option value="$PROJECT_DIR$/docs/rest-manual/pom.xml" />
+ <option value="$PROJECT_DIR$/hornetq-rest/pom.xml" />
+ <option value="$PROJECT_DIR$/docs/rest-manual/en/Book_Info.xml"
/>
</list>
</option>
</component>
@@ -1121,7 +1158,7 @@
</subPane>
</component>
<component name="ProjectReloadState">
- <option name="STATE" value="2" />
+ <option name="STATE" value="0" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions=""
version="1" splitterProportion="0.5">
@@ -1138,6 +1175,7 @@
<panes>
<pane id="Favorites" />
<pane id="PackagesPane" />
+ <pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<PATH>
@@ -1145,10 +1183,6 @@
<option name="myItemId" value="hornetq" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="External Libraries"
/>
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ExternalLibrariesNode" />
- </PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
@@ -1156,86 +1190,6 @@
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
- <option name="myItemId" value="External Libraries"
/>
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ExternalLibrariesNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="< 1.6
>" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="External Libraries"
/>
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ExternalLibrariesNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="< 1.6
>" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="rt.jar" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="External Libraries"
/>
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ExternalLibrariesNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="< 1.6
>" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="rt.jar" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="javax" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="External Libraries"
/>
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ExternalLibrariesNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="< 1.6
>" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="rt.jar" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="javax" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="naming" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
<option name="myItemId" value="hornetq2" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
@@ -1250,7 +1204,7 @@
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
- <option name="myItemId" value="tests" />
+ <option name="myItemId" value="hornetq-rest" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
@@ -1264,13 +1218,9 @@
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
- <option name="myItemId" value="tests" />
+ <option name="myItemId" value="docs" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="timing-tests" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
@@ -1282,11 +1232,11 @@
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
- <option name="myItemId" value="tests" />
+ <option name="myItemId" value="docs" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
- <option name="myItemId" value="concurrent-tests"
/>
+ <option name="myItemId" value="rest-manual" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
@@ -1300,179 +1250,20 @@
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
- <option name="myItemId" value="hornetq-core" />
+ <option name="myItemId" value="docs" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
- </PATH>
- <PATH>
<PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq2" />
+ <option name="myItemId" value="rest-manual" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
- <option name="myItemId" value="hornetq-core" />
+ <option name="myItemId" value="en" />
<option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="src" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="main" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="resources" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
</PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq2" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq-core" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="src" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="main" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="resources" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="schema" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq2" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq-core" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="src" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="main" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq2" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="distribution" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq2" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="distribution" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq2" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="distribution" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="src" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="main" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq2" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="distribution" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="hornetq" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="src" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="main" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="assembly" />
- <option name="myItemType"
value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
</subPane>
</pane>
- <pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
@@ -1522,11 +1313,11 @@
<recent name="org.hornetq.jms.example" />
</key>
<key name="CopyFile.RECENT_KEYS">
+ <recent name="$PROJECT_DIR$/docs/rest-manual/en" />
<recent name="$PROJECT_DIR$/docs" />
<recent name="$PROJECT_DIR$/distribution/hornetq" />
<recent name="$PROJECT_DIR$/examples/src/main/assembly" />
<recent name="$PROJECT_DIR$/tests/performance-tests" />
- <recent name="$PROJECT_DIR$/tests/concurrent-tests" />
</key>
<key name="MoveMembersDialog.RECENTS_KEY">
<recent name="org.hornetq.api.core.client.HornetQClient" />
@@ -2069,10 +1860,10 @@
</todo-panel>
</component>
<component name="ToolWindowManager">
- <frame x="0" y="24" width="1920"
height="1152" extended-state="1" />
+ <frame x="0" y="24" width="1920"
height="1152" extended-state="6" />
<editor active="false" />
<layout>
- <window_info id="Changes" active="true"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="true" weight="0.11888112"
sideWeight="0.0" order="7" side_tool="false"
content_ui="tabs" />
+ <window_info id="Changes" active="true"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="true" weight="0.2656095"
sideWeight="0.0" order="7" side_tool="false"
content_ui="tabs" />
<window_info id="Palette" active="false"
anchor="right" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.33"
sideWeight="0.5" order="4" side_tool="false"
content_ui="tabs" />
<window_info id="Ant Build" active="false"
anchor="right" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.25"
sideWeight="0.5" order="2" side_tool="false"
content_ui="tabs" />
<window_info id="Debug" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.16749257"
sideWeight="0.0" order="3" side_tool="false"
content_ui="tabs" />
@@ -2080,19 +1871,19 @@
<window_info id="IDEtalk" active="false"
anchor="right" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.33"
sideWeight="0.5" order="5" side_tool="false"
content_ui="tabs" />
<window_info id="Version Control" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.12687312"
sideWeight="0.0" order="7" side_tool="false"
content_ui="tabs" />
<window_info id="simpleUML" active="false"
anchor="left" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.33"
sideWeight="0.5" order="2" side_tool="false"
content_ui="tabs" />
- <window_info id="Messages" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.22398414"
sideWeight="0.5" order="7" side_tool="false"
content_ui="tabs" />
<window_info id="TODO" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.33"
sideWeight="0.5" order="6" side_tool="false"
content_ui="tabs" />
<window_info id="Structure" active="false"
anchor="left" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.24959914"
sideWeight="0.7006937" order="1" side_tool="false"
content_ui="tabs" />
- <window_info id="Maven Projects" active="false"
anchor="right" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="true" weight="0.0987055"
sideWeight="0.8811189" order="0" side_tool="false"
content_ui="tabs" />
+ <window_info id="Maven Projects" active="false"
anchor="right" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="true" weight="0.09828142"
sideWeight="0.7343905" order="0" side_tool="false"
content_ui="tabs" />
<window_info id="Commander" active="false"
anchor="right" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.4"
sideWeight="0.5" order="1" side_tool="false"
content_ui="tabs" />
<window_info id="Dependency Viewer" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.33"
sideWeight="0.5" order="7" side_tool="false"
content_ui="tabs" />
- <window_info id="Project" active="false"
anchor="left" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="true" weight="0.24325782"
sideWeight="0.8811189" order="0" side_tool="false"
content_ui="tabs" />
+ <window_info id="Project" active="false"
anchor="left" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="true" weight="0.24221267"
sideWeight="0.7343905" order="0" side_tool="false"
content_ui="tabs" />
<window_info id="Run" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.23609756"
sideWeight="0.5" order="2" side_tool="false"
content_ui="tabs" />
<window_info id="Cvs" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.25"
sideWeight="0.5" order="4" side_tool="false"
content_ui="tabs" />
<window_info id="Message" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.33"
sideWeight="0.5" order="0" side_tool="false"
content_ui="tabs" />
- <window_info id="Find" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.5174825"
sideWeight="0.5" order="1" side_tool="false"
content_ui="tabs" />
+ <window_info id="Find" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="true" weight="0.23984143"
sideWeight="0.5" order="1" side_tool="false"
content_ui="tabs" />
<window_info id="IntelliHeap" active="false"
anchor="bottom" auto_hide="true" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.33"
sideWeight="0.5" order="7" side_tool="false"
content_ui="tabs" />
<window_info id="Dataflow to this" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.33"
sideWeight="0.5" order="7" side_tool="false"
content_ui="tabs" />
+ <window_info id="Messages" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.22398414"
sideWeight="0.5" order="7" side_tool="false"
content_ui="tabs" />
<window_info id="Hierarchy" active="false"
anchor="right" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.25"
sideWeight="0.5" order="3" side_tool="false"
content_ui="tabs" />
<window_info id="Inspection" active="false"
anchor="bottom" auto_hide="false" internal_type="DOCKED"
type="DOCKED" visible="false" weight="0.4"
sideWeight="0.5" order="5" side_tool="false"
content_ui="tabs" />
</layout>
@@ -2112,7 +1903,7 @@
<option name="SHOW_ONLY_CHANGED_IN_SELECTION_DIFF"
value="true" />
<option name="CHECK_COMMIT_MESSAGE_SPELLING" value="true"
/>
<option name="FORCE_NON_EMPTY_COMMENT" value="false" />
- <option name="LAST_COMMIT_MESSAGE" value="added validation for jms
users config" />
+ <option name="LAST_COMMIT_MESSAGE" value="added rest jar and
integrated docs" />
<option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT"
value="false" />
<option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT"
value="false" />
@@ -2125,7 +1916,6 @@
<option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
<option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
<option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6"
/>
- <MESSAGE value="removed empty dirs" />
<MESSAGE value="added schemas to distro" />
<MESSAGE value="removed intellij projects for examples " />
<MESSAGE value="removed eap examples " />
@@ -2150,6 +1940,7 @@
<MESSAGE value="add validation for core configuration" />
<MESSAGE value="added validation for jms config" />
<MESSAGE value="added validation for jms users config" />
+ <MESSAGE value="added rest jar and integrated docs" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
@@ -2227,114 +2018,92 @@
</buildFile>
</component>
<component name="editorHistoryManager">
- <entry file="file://$PROJECT_DIR$/pom.xml">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/jms-and-rest.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="39" column="53"
selection-start="1939" selection-end="1939"
vertical-scroll-proportion="-10.0">
- <folding />
- </state>
+ <state line="15" column="52"
selection-start="850" selection-end="850"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/stress-tests/pom.xml">
+ <entry file="file://$PROJECT_DIR$/docs/rest-manual/en/notice.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="28" column="39"
selection-start="1249" selection-end="1249"
vertical-scroll-proportion="0.0">
- <folding />
- </state>
+ <state line="14" column="52"
selection-start="811" selection-end="811"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/soak-tests/pom.xml">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/HornetQ_Rest_Manual.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="28" column="25"
selection-start="1231" selection-end="1231"
vertical-scroll-proportion="0.0">
- <folding />
- </state>
+ <state line="7" column="71"
selection-start="338" selection-end="338"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/performance-tests/pom.xml">
+ <entry file="file://$PROJECT_DIR$/docs/pom.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="28" column="32"
selection-start="1252" selection-end="1252"
vertical-scroll-proportion="0.0">
- <folding />
- </state>
+ <state line="32" column="23"
selection-start="1295" selection-end="1295"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/pom.xml">
+ <entry file="file://$PROJECT_DIR$/docs/user-manual/pom.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="25" column="28"
selection-start="447" selection-end="687"
vertical-scroll-proportion="0.47953963">
- <folding />
- </state>
+ <state line="30" column="43"
selection-start="1264" selection-end="1264"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry
file="jar://$USER_HOME$/devtools/apache-maven-2.2.1/lib/maven-2.2.1-uber.jar!/org/apache/maven/project/pom-4.0.0.xml">
+ <entry file="file://$PROJECT_DIR$/docs/rest-manual/pom.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="52" column="15"
selection-start="1587" selection-end="1587"
vertical-scroll-proportion="0.33248082">
- <folding />
- </state>
+ <state line="22" column="49"
selection-start="1022" selection-end="1022"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/timing-tests/pom.xml">
+ <entry file="file://$PROJECT_DIR$/hornetq-rest/pom.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="28" column="27"
selection-start="1237" selection-end="1237"
vertical-scroll-proportion="0.0">
+ <state line="38" column="36"
selection-start="1283" selection-end="1283"
vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/joram-tests/pom.xml">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/posting-messages.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="28" column="26"
selection-start="1234" selection-end="1234"
vertical-scroll-proportion="0.0">
- <folding />
- </state>
+ <state line="15" column="52"
selection-start="850" selection-end="850"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/jms-tests/pom.xml">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/pushing-messages.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="129" column="40"
selection-start="4633" selection-end="4633"
vertical-scroll-proportion="0.0">
- <folding />
- </state>
+ <state line="15" column="52"
selection-start="850" selection-end="850"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/integration-tests/pom.xml">
+ <entry file="file://$PROJECT_DIR$/docs/rest-manual/en/security.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="15" column="32"
selection-start="614" selection-end="614"
vertical-scroll-proportion="0.0">
- <folding />
- </state>
+ <state line="21" column="33"
selection-start="953" selection-end="953"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/tests/concurrent-tests/pom.xml">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/HornetQ_Rest_Manual.ent">
<provider selected="true" editor-type-id="text-editor">
- <state line="103" column="74"
selection-start="3735" selection-end="3735"
vertical-scroll-proportion="0.0">
- <folding />
- </state>
+ <state line="18" column="0"
selection-start="778" selection-end="778"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry
file="file://$PROJECT_DIR$/distribution/hornetq/src/main/resources/config/jboss-as-6/non-clustered/hornetq-configuration.xml">
+ <entry file="file://$PROJECT_DIR$/docs/rest-manual/en/master.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="46" column="129"
selection-start="2249" selection-end="2249"
vertical-scroll-proportion="0.0">
+ <state line="0" column="0" selection-start="0"
selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
- <entry
file="file://$PROJECT_DIR$/hornetq-core/src/main/resources/schema/hornetq-configuration.xsd">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/introduction.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="0" column="0" selection-start="0"
selection-end="0" vertical-scroll-proportion="0.0">
- <folding />
- </state>
+ <state line="15" column="52"
selection-start="850" selection-end="850"
vertical-scroll-proportion="0.0" />
</provider>
</entry>
- <entry
file="jar://$USER_HOME$/devtools/jdk1.6.0_21/src.zip!/javax/naming/InitialContext.java">
+ <entry file="file://$PROJECT_DIR$/docs/rest-manual/en/about.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="94" column="85"
selection-start="4440" selection-end="4440"
vertical-scroll-proportion="0.14371258">
+ <state line="0" column="0" selection-start="0"
selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
- <entry
file="file://$PROJECT_DIR$/distribution/hornetq/src/main/assembly/dep.xml">
+ <entry file="file://$PROJECT_DIR$/docs/rest-manual/en/basics.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="103" column="44"
selection-start="4228" selection-end="4228"
vertical-scroll-proportion="0.0">
+ <state line="0" column="0" selection-start="0"
selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/distribution/hornetq/pom.xml">
+ <entry
file="file://$PROJECT_DIR$/docs/rest-manual/en/Book_Info.xml">
<provider selected="true" editor-type-id="text-editor">
- <state line="200" column="107"
selection-start="9822" selection-end="9822"
vertical-scroll-proportion="0.89221555">
+ <state line="37" column="33"
selection-start="1595" selection-end="1595"
vertical-scroll-proportion="0.7997118">
<folding />
</state>
</provider>
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-04-19 03:31:49 UTC (rev 10528)
+++ trunk/pom.xml 2011-04-19 10:32:50 UTC (rev 10529)
@@ -106,6 +106,7 @@
<module>hornetq-twitter-integration</module>
<module>hornetq-spring-integration</module>
<module>hornetq-service-sar</module>
+ <module>hornetq-rest</module>
<module>tests</module>
<module>examples</module>
<module>docs</module>