You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2012/11/19 13:48:08 UTC
svn commit: r1411155 [5/6] - in
/qpid/branches/java-broker-config-qpid-4390/qpid: ./ cpp/ cpp/bindings/
cpp/bindings/qpid/dotnet/
cpp/bindings/qpid/dotnet/examples/csharp.map.callback.receiver/
cpp/bindings/qpid/dotnet/msvc9/ cpp/bindings/qpid/dotnet/s...
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/cpp/src/tests/ha_tests.py
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/cpp/src/tests/ha_tests.py?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/cpp/src/tests/ha_tests.py (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/cpp/src/tests/ha_tests.py Mon Nov 19 12:47:53 2012
@@ -26,10 +26,24 @@ from brokertest import *
from ha_test import *
from threading import Thread, Lock, Condition
from logging import getLogger, WARN, ERROR, DEBUG, INFO
-from qpidtoollibs import BrokerAgent
+from qpidtoollibs import BrokerAgent, EventHelper
from uuid import UUID
-class ReplicationTests(BrokerTest):
+log = getLogger(__name__)
+
+def grep(filename, regexp):
+ for line in open(filename).readlines():
+ if (regexp.search(line)): return True
+ return False
+
+class HaBrokerTest(BrokerTest):
+ """Base class for HA broker tests"""
+ def assert_log_no_errors(self, broker):
+ log = broker.get_log()
+ if grep(log, re.compile("] error|] critical")):
+ self.fail("Errors in log file %s"%(log))
+
+class ReplicationTests(HaBrokerTest):
"""Correctness tests for HA replication."""
def test_replication(self):
@@ -256,6 +270,7 @@ class ReplicationTests(BrokerTest):
def test_qpid_config_replication(self):
"""Set up replication via qpid-config"""
brokers = HaCluster(self,2)
+ brokers[0].wait_status("active")
brokers[0].config_declare("q","all")
brokers[0].connect().session().sender("q").send("foo")
brokers[1].assert_browse_backup("q", ["foo"])
@@ -739,11 +754,16 @@ acl deny all all
def test_auto_delete_timeout(self):
cluster = HaCluster(self, 2)
- s = cluster[0].connect().session().receiver("q;{create:always,node:{x-declare:{auto-delete:True,arguments:{'qpid.auto_delete_timeout':1}}}}")
- cluster[1].wait_queue("q")
+ # Test timeout
+ r1 = cluster[0].connect().session().receiver("q1;{create:always,node:{x-declare:{auto-delete:True,arguments:{'qpid.auto_delete_timeout':1}}}}")
+ # Test special case of timeout = 0
+ r0 = cluster[0].connect().session().receiver("q0;{create:always,node:{x-declare:{auto-delete:True,arguments:{'qpid.auto_delete_timeout':0}}}}")
+ cluster[1].wait_queue("q0")
+ cluster[1].wait_queue("q1")
cluster[0].kill()
- cluster[1].wait_queue("q") # Not timed out yet
- cluster[1].wait_no_queue("q") # Wait for timeout
+ cluster[1].wait_queue("q1") # Not timed out yet
+ cluster[1].wait_no_queue("q1", timeout=2) # Wait for timeout
+ cluster[1].wait_no_queue("q0", timeout=2)
def test_alt_exchange_dup(self):
"""QPID-4349: if a queue has an alterante exchange and is deleted the
@@ -774,6 +794,54 @@ acl deny all all
cluster.start()
send_ttl_messages()
+ def test_stale_response(self):
+ """Check for race condition where a stale response is processed after an
+ event for the same queue/exchange """
+ cluster = HaCluster(self, 2)
+ s = cluster[0].connect().session()
+ s.sender("keep;{create:always}") # Leave this queue in place.
+ for i in xrange(100): # FIXME aconway 2012-10-23: ??? IS this an issue?
+ s.sender("deleteme%s;{create:always,delete:always}"%(i)).close()
+ # It is possible for the backup to attempt to subscribe after the queue
+ # is deleted. This is not an error, but is logged as an error on the primary.
+ # The backup does not log this as an error so we only check the backup log for errors.
+ self.assert_log_no_errors(cluster[1])
+
+ def test_missed_recreate(self):
+ """If a queue or exchange is destroyed and one with the same name re-created
+ while a backup is disconnected, the backup should also delete/recreate
+ the object when it re-connects"""
+ cluster = HaCluster(self, 3)
+ sn = cluster[0].connect().session()
+ # Create a queue with messages
+ s = sn.sender("qq;{create:always}")
+ msgs = [str(i) for i in xrange(3)]
+ for m in msgs: s.send(m)
+ cluster[1].assert_browse_backup("qq", msgs)
+ cluster[2].assert_browse_backup("qq", msgs)
+ # Set up an exchange with a binding.
+ sn.sender("xx;{create:always,node:{type:topic}}")
+ sn.sender("xxq;{create:always,node:{x-bindings:[{exchange:'xx',queue:'xxq',key:xxq}]}}")
+ cluster[1].wait_address("xx")
+ self.assertEqual(cluster[1].agent().getExchange("xx").values["bindingCount"], 1)
+ cluster[2].wait_address("xx")
+ self.assertEqual(cluster[2].agent().getExchange("xx").values["bindingCount"], 1)
+
+ # Simulate the race by re-creating the objects before promoting the new primary
+ cluster.kill(0, False)
+ sn = cluster[1].connect_admin().session()
+ sn.sender("qq;{delete:always}").close()
+ s = sn.sender("qq;{create:always}")
+ s.send("foo")
+ sn.sender("xx;{delete:always}").close()
+ sn.sender("xx;{create:always,node:{type:topic}}")
+ cluster[1].promote()
+ cluster[1].wait_status("active")
+ # Verify we are not still using the old objects on cluster[2]
+ cluster[2].assert_browse_backup("qq", ["foo"])
+ cluster[2].wait_address("xx")
+ self.assertEqual(cluster[2].agent().getExchange("xx").values["bindingCount"], 0)
+
def fairshare(msgs, limit, levels):
"""
Generator to return prioritised messages in expected order for a given fairshare limit
@@ -808,7 +876,7 @@ def priority_level(value, levels):
offset = 5-math.ceil(levels/2.0)
return min(max(value - offset, 0), levels-1)
-class LongTests(BrokerTest):
+class LongTests(HaBrokerTest):
"""Tests that can run for a long time if -DDURATION=<minutes> is set"""
def duration(self):
@@ -891,7 +959,64 @@ class LongTests(BrokerTest):
if unexpected_dead:
raise Exception("Brokers not running: %s"%unexpected_dead)
-class RecoveryTests(BrokerTest):
+ def test_qmf_order(self):
+ """QPID 4402: HA QMF events can be out of order.
+ This test mimics the test described in the JIRA. Two threads repeatedly
+ declare the same auto-delete queue and close their connection.
+ """
+ broker = Broker(self)
+ class Receiver(Thread):
+ def __init__(self, qname):
+ Thread.__init__(self)
+ self.qname = qname
+ self.stopped = False
+
+ def run(self):
+ while not self.stopped:
+ self.connection = broker.connect()
+ try:
+ self.connection.session().receiver(
+ self.qname+";{create:always,node:{x-declare:{auto-delete:True}}}")
+ except NotFound: pass # Can occur occasionally, not an error.
+ try: self.connection.close()
+ except: pass
+
+ class QmfObject(object):
+ """Track existance of an object and validate QMF events"""
+ def __init__(self, type_name, name_field, name):
+ self.type_name, self.name_field, self.name = type_name, name_field, name
+ self.exists = False
+
+ def qmf_event(self, event):
+ content = event.content[0]
+ event_type = content['_schema_id']['_class_name']
+ values = content['_values']
+ if event_type == self.type_name+"Declare" and values[self.name_field] == self.name:
+ disp = values['disp']
+ log.debug("Event %s: disp=%s exists=%s"%(
+ event_type, values['disp'], self.exists))
+ if self.exists: assert values['disp'] == 'existing'
+ else: assert values['disp'] == 'created'
+ self.exists = True
+ elif event_type == self.type_name+"Delete" and values[self.name_field] == self.name:
+ log.debug("Event %s: exists=%s"%(event_type, self.exists))
+ assert self.exists
+ self.exists = False
+
+ # Verify order of QMF events.
+ helper = EventHelper()
+ r = broker.connect().session().receiver(helper.eventAddress())
+ threads = [Receiver("qq"), Receiver("qq")]
+ for t in threads: t.start()
+ queue = QmfObject("queue", "qName", "qq")
+ finish = time.time() + self.duration()
+ try:
+ while time.time() < finish:
+ queue.qmf_event(r.fetch())
+ finally:
+ for t in threads: t.stopped = True; t.join()
+
+class RecoveryTests(HaBrokerTest):
"""Tests for recovery after a failure."""
def test_queue_hold(self):
@@ -909,6 +1034,7 @@ class RecoveryTests(BrokerTest):
for b in cluster: b.wait_backup("q1")
for i in xrange(100): s1.send(str(i))
# Kill primary and 2 backups
+ cluster[3].wait_status("ready")
for i in [0,1,2]: cluster.kill(i, False)
cluster[3].promote() # New primary, backups will be 1 and 2
cluster[3].wait_status("recovering")
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/cpp-broker/Active-Passive-Cluster.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/cpp-broker/Active-Passive-Cluster.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/cpp-broker/Active-Passive-Cluster.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/cpp-broker/Active-Passive-Cluster.xml Mon Nov 19 12:47:53 2012
@@ -594,9 +594,14 @@ NOTE: fencing is not shown, you must con
<para>
There are some built-in exchanges created automatically by the broker, these
exchangs are never replicated. The built-in exchanges are the default (nameless)
- exchange, the AMQP standard exchanges (amq.direct, amq.topic, amq.fanout and
- amq.match) and the management exchanges (qpid.management, qmf.default.direct and
- qmf.default.topic)
+ exchange, the AMQP standard exchanges (<literal>amq.direct, amq.topic, amq.fanout</literal> and
+ <literal>amq.match</literal>) and the management exchanges (<literal>qpid.management, qmf.default.direct</literal> and
+ <literal>qmf.default.topic</literal>)
+ </para>
+ <para>
+ Note that if you bind a replicated queue to one of these exchanges, the
+ binding wil <emphasis>not</emphasis> be replicated, so the queue will not
+ have the binding after a fail-over.
</para>
</section>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml Mon Nov 19 12:47:53 2012
@@ -20,10 +20,10 @@
-->
-<book>
+<book xmlns:xi="http://www.w3.org/2001/XInclude">
<title>AMQP Messaging Broker (Java)</title>
-<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Introduction.xml"/>
+<xi:include href="Java-Broker-Introduction.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Installation.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Getting-Started.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Concepts.xml"/>
@@ -35,5 +35,6 @@
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Security.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Runtime.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-High-Availability.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Miscellaneous.xml"/>
</book>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Getting-Started.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Getting-Started.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Getting-Started.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Getting-Started.xml Mon Nov 19 12:47:53 2012
@@ -1,4 +1,8 @@
<?xml version="1.0"?>
+<!DOCTYPE entities [
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
<!--
Licensed to the Apache Software Foundation (ASF) under one
@@ -22,4 +26,109 @@
<chapter id="Java-Broker-Getting-Started">
<title>Getting Started</title>
+ <para>This section describes how to start the Java Broker for the first time.</para>
+ <section role="h2" id="Java-Broker-Getting-Started-Starting">
+ <title>Starting/Stopping the Broker</title>
+ <para>To start the Broker, use the <command>qpid-server</command> script (UNIX) or <command>qpid-server.bat</command> (Windows)
+ provided within distribution.</para>
+ </section>
+ <section role="h2" id="Java-Broker-Getting-Started-Starting-Stopping-Windows">
+ <title>Starting/Stopping on Windows</title>
+ <para>Firstly change to the installation directory used during the <link linkend="Java-Broker-Installation-InstallationWindows">installation</link>
+ and ensure that the <link linkend="Java-Broker-Installation-InstallationWindows-SettingQPIDWORK">QPID_WORK environment variable is set</link>.</para>
+ <para>Now use the qpid-server.bat to start the server</para>
+ <programlisting><![CDATA[bin\qpid-server.bat]]></programlisting>
+ <para>Output similar to the following will be seen:</para>
+ <screen>[Broker] BRK-1006 : Using configuration : C:\qpid\qpid-broker-&qpidCurrentRelease;\etc\config.xml
+[Broker] BRK-1007 : Using logging configuration : C:\qpid\qpid-broker-&qpidCurrentRelease;\etc\log4j.xml
+[Broker] MNG-1001 : Startup
+[Broker] MNG-1002 : Starting : RMI Registry : Listening on port 8999
+[Broker] MNG-1002 : Starting : JMX RMIConnectorServer : Listening on port 9099
+[Broker] MNG-1004 : Ready
+[Broker] BRK-1001 : Startup : Version: &qpidCurrentRelease; Build: 1363863
+[Broker] BRK-1010 : Platform : JVM : Sun Microsystems Inc. version: 1.6.0_24-b07 OS : Windows 7 version: 6.1 arch: amd64
+[Broker] BRK-1011 : Maximum Memory : 1,069,416,448 bytes
+[Broker] BRK-1002 : Starting : Listening on TCP port 5672
+[Broker] BRK-1004 : Qpid Broker Ready</screen>
+ <para>The BRK-1004 message confirms that the Broker is ready for work. The MNG-1002 and BRK-1004 confirm the ports to
+ which the Broker is listening (for JMX management and AMQP respectively).</para>
+ <para>To stop the Broker, use Control-C or use the Shutdown MBean made from the <xref
+ linkend="Java-Broker-Configuring-And-Managing-JMX"/></para>
+ </section>
+ <section role="h2" id="Java-Broker-Getting-Started-Starting-Stopping-Unix">
+ <title>Starting/Stopping on Unix</title>
+ <para>Firstly change to the installation directory used during the <link linkend="Java-Broker-Installation-InstallationUnix">installation</link>
+ and ensure that the <link linkend="Java-Broker-Installation-InstallationUnix-SettingQPIDWORK">QPID_WORK environment variable is set</link>.</para>
+ <para>Now use the <command>qpid-server</command> script to start the server:</para>
+ <programlisting><![CDATA[bin\qpid-server]]></programlisting>
+ <para>Output similar to the following will be seen:</para>
+ <screen>[Broker] BRK-1006 : Using configuration : /usr/local/qpid/qpid-broker-&qpidCurrentRelease;/etc/config.xml
+[Broker] BRK-1007 : Using logging configuration : /usr/local/qpid/qpid-broker-&qpidCurrentRelease;/etc/log4j.xml
+[Broker] MNG-1001 : Startup
+[Broker] MNG-1002 : Starting : RMI Registry : Listening on port 8999
+[Broker] MNG-1002 : Starting : JMX RMIConnectorServer : Listening on port 9099
+[Broker] MNG-1004 : Ready
+[Broker] BRK-1001 : Startup : Version: &qpidCurrentRelease; Build: 1363863
+[Broker] BRK-1010 : Platform : JVM : Apple Inc. version: 1.6.0_35-b10-428-11M3811 OS : Mac OS X version: 10.8.2 arch: x86_64
+[Broker] BRK-1011 : Maximum Memory : 1,069,416,448 bytes
+[Broker] BRK-1002 : Starting : Listening on TCP port 5672
+[Broker] BRK-1004 : Qpid Broker Ready</screen>
+ <para>The BRK-1004 message confirms that the Broker is ready for work. The MNG-1002 and BRK-1004 confirm the ports to
+ which the Broker is listening (for JMX management and AMQP respectively).</para>
+ <para>To stop the Broker, use Control-C from the controlling shell, use the
+ <command>bin/qpid.stop</command> script, or use <command>kill -TERM <pid></command> or
+ the Shutdown MBean from <xref linkend="Java-Broker-Configuring-And-Managing-JMX"/></para>
+ </section>
+ <section role="h2" id="Java-Broker-Getting-Started-LogFile">
+ <title>Log file</title>
+ <para>The Java Broker writes a log file to record both details of its normal operation and any exceptional
+ conditions. By default the log file is written within the log subdirectory beneath the work directory
+ - <computeroutput>$QPID_WORK/log/qpid.log</computeroutput> (UNIX) and
+ <computeroutput>%QPID_WORK%\log\qpid.log</computeroutput> (Windows).</para>
+ <para>For details of how to control the logging, see <xref linkend="Java-Broker-Runtime-Log-Files"/></para>
+ </section>
+ <section role="h2" id="Java-Broker-Getting-Started-CommandLine">
+ <title>Using the command line</title>
+ <para>The Java Broker understands a number of command line options which may be used to override the configuration.</para>
+ <para>To see usage information for all command line options, use the option <option>--help</option></para>
+ <programlisting><![CDATA[bin/qpid-server --help]]></programlisting>
+ <screen><![CDATA[usage: Qpid [-b address>] [-c <file>] [--exclude-0-10 <port>] [--exclude-0-8 <port>] [--exclude-0-9 <port>] [--exclude-0-9-1
+ <port>] [--exclude-1-0 <port>] [-h] [--include-0-10 <port>] [--include-0-8 <port>] [--include-0-9 <port>] [--include-0-9-1
+ <port>] [--include-1-0 <port>] [--jmxconnectorport <port>] [-l <file>] [-m <port>] [-p <port>] [-s <port>] [-v] [-w <period>]
+ -b,--bind <address> bind to the specified address. Overrides any value in the config file
+ -c,--config <file> use given configuration file
+ --exclude-0-10 <port> when listening on the specified port do not accept AMQP0-10 connections. The
+ specified port must be one specified on the command line
+ --exclude-0-8 <port> when listening on the specified port do not accept AMQP0-8 connections. The
+ specified port must be one specified on the command line
+ --exclude-0-9 <port> when listening on the specified port do not accept AMQP0-9 connections. The
+ specified port must be one specified on the command line
+ --exclude-0-9-1 <port> when listening on the specified port do not accept AMQP0-9-1 connections. The
+ specified port must be one specified on the command line
+ --exclude-1-0 <port> when listening on the specified port do not accept AMQP1-0 connections. The
+ specified port must be one specified on the command line
+ -h,--help print this message
+ --include-0-10 <port> accept AMQP0-10 connections on this port, overriding configuration to the contrary.
+ The specified port must be one specified on the command line
+ --include-0-8 <port> accept AMQP0-8 connections on this port, overriding configuration to the contrary.
+ The specified port must be one specified on the command line
+ --include-0-9 <port> accept AMQP0-9 connections on this port, overriding configuration to the contrary.
+ The specified port must be one specified on the command line
+ --include-0-9-1 <port> accept AMQP0-9-1 connections on this port, overriding configuration to the contrary.
+ The specified port must be one specified on the command line
+ --include-1-0 <port> accept AMQP1-0 connections on this port, overriding configuration to the contrary.
+ The specified port must be one specified on the command line
+ --jmxconnectorport <port> listen on the specified management (connector server) port. Overrides any
+ value in the config file
+ -l,--logconfig <file> use the specified log4j xml configuration file. By default looks for a file named
+ etc/log4j.xml in the same directory as the configuration file
+ -m,--jmxregistryport <port> listen on the specified management (registry server) port. Overrides any
+ value in the config file
+ -p,--port <port> listen on the specified port. Overrides any value in the config file
+ -s,--sslport <port> SSL port. Overrides any value in the config file
+ -v,--version print the version information and exit
+ -w,--logwatch <period> monitor the log file configuration file for changes. Units are seconds. Zero means
+ do not check for changes.]]></screen>
+ </section>
+
</chapter>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-High-Availability.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-High-Availability.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-High-Availability.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-High-Availability.xml Mon Nov 19 12:47:53 2012
@@ -1,10 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE urls [
-<!ENTITY oracleBdbProductOverviewUrl "http://www.oracle.com/technetwork/products/berkeleydb/overview/index-093405.html">
-<!ENTITY oracleBdbProductVersion "5.0.58">
-<!ENTITY oracleBdbRepGuideUrl "http://oracle.com/cd/E17277_02/html/ReplicationGuide/">
-<!ENTITY oracleBdbJavaDocUrl "http://docs.oracle.com/cd/E17277_02/html/java/">
-<!ENTITY oracleJdkDocUrl "http://oracle.com/javase/6/docs/api/">
+<!DOCTYPE entities [
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
]>
<!--
@@ -297,6 +294,9 @@
<title>Configuring a Virtual Host to be a node</title>
<para>To configure a virtualhost as a cluster node, configure the virtualhost.xml in the following manner:</para>
<para>
+
+ <example>
+ <title>Configuring a VirtualHost to use the BDBHAMessageStore</title>
<programlisting language="xml"><![CDATA[
<virtualhost>
<name>myhost</name>
@@ -317,6 +317,7 @@
...
</myvhost>
</virtualhost>]]></programlisting>
+ </example>
</para>
<para>The <varname>groupName</varname> is the name of logical name of the cluster. All nodes within the
cluster must use the same <varname>groupName</varname> in order to be considered part of the cluster.</para>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Installation.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Installation.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Installation.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Installation.xml Mon Nov 19 12:47:53 2012
@@ -1,4 +1,8 @@
<?xml version="1.0"?>
+<!DOCTYPE entities [
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
<!--
Licensed to the Apache Software Foundation (ASF) under one
@@ -22,4 +26,160 @@
<chapter id="Java-Broker-Installation">
<title>Installation</title>
+ <section role="h2" id="Java-Broker-Installation-Introduction">
+ <title>Introduction</title>
+ <para>This document describes how to install the Java Broker on both Windows and UNIX
+ platforms.</para>
+ </section>
+ <section role="h2" id="Java-Broker-Installation-Prerequistes">
+ <title>Prerequisites</title>
+ <section role="h3" id="Java-Broker-Installation-Prerequistes-Java">
+ <title>Java Platform</title>
+ <para>
+ The Java Broker is an 100% Java implementation and as such it can be used on any operating
+ system supporting Java 1.6 or higher. This includes Linux, Solaris, Mac OS X, and Windows XP/Vista/7/8.</para>
+ <para>
+ The broker has been tested with Java implementations from both Oracle and IBM. Whatever
+ platform you chose, it is recommended that you ensure it is patched with any critical updates made
+ available from the vendor.
+ </para>
+ <para>
+ Verify that your JVM is installed properly by following <link linkend="Java-Broker-Miscellaneous-JVM-Verification">these instructions.</link>
+ </para>
+ </section>
+ <section role="h3" id="Java-Broker-Installation-Prerequistes-Disk">
+ <title>Disk</title>
+ <para>The Java Broker installation requires approximately 20MB of free disk space.</para>
+ <para>The Java Broker also requires a working directory. The working directory is used for
+ the message store, that is, the area of the file-system used to record persistent messages whilst they
+ are passing through the Broker. The working directory is also used for the default location of the log file.
+ The size of the working directory will depend on the how the Broker is used.</para>
+ <para>The performance of the file system hosting the work directory is key to the performance of Broker as
+ a whole. For best performance, choose a device that has low latency and one that is uncontended by other
+ applications.</para>
+ <para>Be aware that there are additional considerations if you are considering hosting the working directory on NFS. See
+ <xref linkend="Java-Broker-Stores"/> for further details.</para>
+ </section>
+ <section role="h3" id="Java-Broker-Installation-Prerequistes-Memory">
+ <title>Memory</title>
+ <para>Qpid caches messages on the heap for performance reasons, so in general, the Broker will
+ benefit from as much heap as possible. However, on a 32bit JVM, the maximum addressable memory range
+ for a process is 4GB, after leaving space for the JVM's own use this will give a maximum heap size
+ of approximately ~3.7GB.</para>
+ </section>
+ <section role="h3" id="Java-Broker-Installation-Prerequistes-OperatingSystemAccount">
+ <title>Operating System Account</title>
+ <para>Installation or operation of Qpid does <emphasis>not</emphasis> require a privileged account (i.e. root
+ on UNIX platforms or Administrator on Windows). However it is suggested that you use an dedicated account
+ (e.g. qpid) for the installation and operation of the Java Broker.</para>
+ </section>
+ </section>
+
+ <section role="h2" id="Java-Broker-Installation-Download">
+ <title>Download</title>
+ <section role="h3" id="Java-Broker-Installation-Download-Release">
+ <title>Broker Release</title>
+ <para>You can download the latest qpid-java-broker-&qpidCurrentRelease;.tar.gz package from the <ulink
+ url="&qpidDownloadUrl;">Download Page</ulink>.
+ </para>
+ <para> It is recommended that you confirm the integrity of the download by verifying the PGP signature
+ matches that available on the site. Instrutions are given on the download page.
+ </para>
+ </section>
+ <section role="h3" id="Java-Broker-Installation-Download-OptionalDependencies">
+ <title>Optional Dependencies</title>
+ <para>The broker has an optional message store implementations backed by Oracle BDB JE. If you wish to use these
+ stores you will need to provide the optional Oracle BDB JE dependency. For more details, see <xref linkend="Java-Broker-Stores-BDB-Store"></xref>
+ </para>
+ </section>
+ </section>
+
+ <section role="h2" id="Java-Broker-Installation-InstallationWindows">
+ <title>Installation on Windows</title>
+ <para>
+ Firstly, verify that your JVM is installed properly by following
+ <link linkend="Java-Broker-Miscellaneous-JVM-Verification-Windows">these instructions.</link>
+ </para>
+ <para>Now chose a directory for Qpid broker installation. This directory will be used for the Qpid JARs and configuration files.
+ It need not be the same location as the store used for the persistent messages or the log file (you will chose this
+ location later). For the remainder this example we will assumed that location c:\qpid has been chosen.</para>
+ <para>Now using WinZip<footnote><para>WinZip is a Registered Trademark of WinZip International LLC</para></footnote> (or similar)
+ extract the Qpid package qpid-java-broker-&qpidCurrentRelease;.tar.gz into the directory.</para>
+ <para>The extraction of the Qpid package will have created a directory qpid-broker-&qpidCurrentRelease; within c:\qpid</para>
+ <screen>Volume in drive C has no label
+
+ Directory of c:\qpid\qpid-broker-&qpidCurrentRelease;
+
+07/25/2012 11:22 PM .
+09/30/2012 10:51 AM ..
+09/30/2012 12:24 AM bin
+08/21/2012 11:17 PM etc
+07/25/2012 11:22 PM lib
+07/20/2012 08:10 PM 65,925 LICENSE
+07/20/2012 08:10 PM 3,858 NOTICE
+07/20/2012 08:10 PM 1,346 README.txt
+ 3 File(s) 71,129 bytes
+ 5 Dir(s) 743,228,796,928 bytes free</screen>
+ <section role="h3" id="Java-Broker-Installation-InstallationWindows-SettingQPIDWORK">
+ <title>Setting the working directory</title>
+ <para>Qpid requires a work directory. This directory is used for the default location of the Qpid log
+ file and is used for the storage of persistent messages. The work directory can be set on the
+ command-line (for the lifetime of the command interpreter), but you will normally want to set
+ the environment variable permanently via the Advanced System Settings in the Control Panel.</para>
+ <screen>set QPID_WORK=S:\qpidwork</screen>
+ <para>If the directory referred to by QPID_WORK does not exist, the Java Broker will attempt to create it
+ on start-up.</para>
+ </section>
+ <section role="h3" id="Java-Broker-Installation-InstallationWindows-OptionalDependencies">
+ <title>Optional Dependencies</title>
+ <para>The broker has an optional message store implementations backed by Oracle BDB JE. If you wish to use these
+ stores you will need to provide the optional Oracle BDB JE dependency. For more details, see <xref linkend="Java-Broker-Stores-BDB-Store"></xref>
+ </para>
+ </section>
+ </section>
+
+ <section role="h2" id="Java-Broker-Installation-InstallationUnix">
+ <title>Installation on UNIX platforms</title>
+ <para>
+ Firstly, verify that your JVM is installed properly by following
+ <link linkend="Java-Broker-Miscellaneous-JVM-Verification-Unix">these instructions.</link>
+ </para>
+ <para>Now chose a directory for Qpid broker installation. This directory will be used for the Qpid JARs and configuration files.
+ It need not be the same location as the store used for the persistent messages or the log file (you will chose this
+ location later). For the remainder this example we will assumed that location /usr/local/qpid has been chosen.</para>
+ <para>Extract the Qpid package qpid-java-broker-&qpidCurrentRelease;.tar.gz into the directory.</para>
+ <programlisting>mkdir /usr/local/qpid
+cd /usr/local/qpid
+tar xvzf qpid-java-broker-&qpidCurrentRelease;.tar.gz></programlisting>
+ <para>The extraction of the Qpid package will have created a directory qpid-broker-x.x</para>
+ <screen>ls -la qpid-broker-&qpidCurrentRelease;/
+total 152
+drwxr-xr-x 8 qpid qpid 272 25 Jul 23:22 .
+drwxr-xr-x 45 qpid qpid 1530 30 Sep 10:51 ..
+-rw-r--r--@ 1 qpid qpid 65925 20 Jul 20:10 LICENSE
+-rw-r--r--@ 1 qpid qpid 3858 20 Jul 20:10 NOTICE
+-rw-r--r--@ 1 qpid qpid 1346 20 Jul 20:10 README.txt
+drwxr-xr-x 10 qpid qpid 340 30 Sep 00:24 bin
+drwxr-xr-x 9 qpid qpid 306 21 Aug 23:17 etc
+drwxr-xr-x 34 qpid qpid 1156 25 Jul 23:22 lib
+ </screen>
+ <section role="h3" id="Java-Broker-Installation-InstallationUnix-SettingQPIDWORK">
+ <title>Setting the working directory</title>
+ <para>Qpid requires a work directory. This directory is used for the default location of the Qpid log
+ file and is used for the storage of persistent messages. The work directory can be set on the
+ command-line (for the lifetime of the current shell), but you will normally want to set
+ the environment variable permanently the user's shell profile file (~/.bash_profile for Bash etc).</para>
+ <screen><![CDATA[export QPID_WORK=/var/qpidwork]]>
+ </screen>
+ <para>If the directory referred to by QPID_WORK does not exist, the Java Broker will attempt to create it
+ on start-up.
+ </para>
+ </section>
+ <section role="h3" id="Java-Broker-Installation-InstallationUnix-OptionalDependencies">
+ <title>Optional Dependencies</title>
+ <para>The broker has an optional message store implementations backed by Oracle BDB JE. If you wish to use these
+ stores you will need to provide the optional Oracle BDB JE dependency. For more details, see <xref linkend="Java-Broker-Stores-BDB-Store"></xref>
+ </para>
+ </section>
+ </section>
</chapter>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Introduction.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Introduction.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Introduction.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Introduction.xml Mon Nov 19 12:47:53 2012
@@ -1,4 +1,8 @@
<?xml version="1.0"?>
+<!DOCTYPE chapter[
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
<!--
Licensed to the Apache Software Foundation (ASF) under one
@@ -22,4 +26,64 @@
<chapter id="Java-Broker-Introduction">
<title>Introduction</title>
+ <para>The Java Broker is a powerful open-source message broker that implements all versions of the
+ <ulink url="http://www.amqp.org"> Advanced Message Queuing Protocol (AMQP)</ulink>. The Java
+ Broker is actually one of two message brokers provided by the <ulink
+ url="http://qpid.apache.org">Apache Qpid project</ulink>: the Java Broker and the C++
+ Broker.</para>
+ <para>This document relates to the Java Broker. The <ulink url="&qpidCppBook;">C++ Broker is
+ described separately</ulink>.</para>
+ <para><emphasis>Headline features</emphasis></para>
+ <itemizedlist mark="circle">
+ <listitem>
+ <para>100% Java implementation - runs on any platform supporting Java 1.6 or higher</para>
+ </listitem>
+ <listitem>
+ <para>Messaging clients support in Java, C++, Python.</para>
+ </listitem>
+ <listitem>
+ <para>JMS 1.1 compliance (Java client).</para>
+ </listitem>
+ <listitem>
+ <para>Persistent and non-persistent (transient) message support</para>
+ </listitem>
+ <listitem>
+ <para>Supports for all common messaging patterns (point-to-point, publish/subscribe, fan-out
+ etc).</para>
+ </listitem>
+ <listitem>
+ <para>Transaction support including XA<footnote>
+ <para>XA provided when using AMQP 0-10</para>
+ </footnote></para>
+ </listitem>
+ <listitem>
+ <para>Supports for all versions of the AMQP protocol</para>
+ </listitem>
+ <listitem>
+ <para>Automatic message translation, allowing clients using different AMQP versions to communicate with each other.</para>
+ </listitem>
+ <listitem>
+ <para>Pluggable authentication architecture with out-of-the-box support for Kerberos, LDAP,
+ External, and file-based authentication mechanisms.</para>
+ </listitem>
+ <listitem>
+ <para>Pluggable message store architecture with implementations based on <ulink
+ url="http://db.apache.org/derby/">Apache Derby</ulink>, <ulink
+ url="&oracleBdbProductOverviewUrl;">Oracle BDB JE</ulink><footnote>
+ <para>Oracle BDB JE must be downloaded separately.</para>
+ </footnote>, and Memory Store</para>
+ </listitem>
+ <listitem>
+ <para>Web based management interface and programmatic management interfaces via REST and JMX
+ APIs.</para>
+ </listitem>
+ <listitem>
+ <para>SSL support</para>
+ </listitem>
+ <listitem>
+ <para>High availability (HA) support.<footnote>
+ <para>HA currently only available to users of the optional BDB JE HA based message store.</para>
+ </footnote></para>
+ </listitem>
+ </itemizedlist>
</chapter>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Queues-OtherTypes.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Queues-OtherTypes.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Queues-OtherTypes.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Queues-OtherTypes.xml Mon Nov 19 12:47:53 2012
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE urls [
-<!ENTITY oracleJeeDocUrl "http://docs.oracle.com/javaee/6/api/">
+<!DOCTYPE entities [
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
]>
<!--
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Security-Authentication-Providers.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Security-Authentication-Providers.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Security-Authentication-Providers.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Security-Authentication-Providers.xml Mon Nov 19 12:47:53 2012
@@ -26,55 +26,22 @@
<para>
In order to successfully establish a connection to the Java Broker, the connection must be
authenticated. The Java Broker supports a number of different authentication schemes, each
- with its own "authentication manager". Different managers may be used on different ports.
- Each manager has its own configuration element, the presence of which within the
- <security> section denotes the use of that authentication provider. Where only one
- such manager is configured, that manager will be used on all ports (including JMX). Where
- more than one authentication manager is configured the configuration must define which
- manager is the "default", and (if required) the mapping of non-default authentication
- managers to other ports.
- </para>
- <para>
- The following configuration sets up three authentication managers, using a password file as
- the default (e.g. for the JMX port), Kerberos on port 5672 and Anonymous on 5673.
+ with its own "authentication manager". Each of these are outlined below, along with details
+ of <link linkend="MultipleAuthProviders"> using more than one at a time</link>.
</para>
- <example>
- <title>Configuring different authentication schemes on different ports</title>
- <programlisting><![CDATA[
-<security>
- <pd-auth-manager>
- <principal-database>
- <class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>
- <attributes>
- <attribute>
- <name>passwordFile</name>
- <value>${conf}/passwd</value>
- </attribute>
- </attributes>
- </principal-database>
- </pd-auth-manager>
- <kerberos-auth-manager><auth-name>sib</auth-name></kerberos-auth-manager>
- <anonymous-auth-manager></anonymous-auth-manager>
- <default-auth-manager>PrincipalDatabaseAuthenticationManager</default-auth-manager>
- <port-mappings>
- <port-mapping>
- <port>5672</port>
- <auth-manager>KerberosAuthenticationManager</auth-manager>
- </port-mapping>
- <port-mapping>
- <port>5673</port>
- <auth-manager>AnonymousAuthenticationManager</auth-manager>
- </port-mapping>
- </port-mappings>
-</security>]]>
- </programlisting>
- </example>
+ <section>
+ <title>Password File</title>
+ <para>
+ TODO
+ </para>
- <section><title>Password File</title></section>
- <section><title>LDAP</title>
+ </section>
+
+ <section>
+ <title>LDAP</title>
<example>
- <title>Configuring a LDAP authentication</title>
+ <title>Configuring LDAP authentication</title>
<programlisting><![CDATA[
<security>
<simple-ldap-auth-manager>
@@ -82,8 +49,8 @@
<search-context>dc=example\,dc=com</search-context>
<search-filter>(uid={0})</search-filter>
</simple-ldap-auth-manager>
-</security>]]>
- </programlisting>
+ ...
+</security>]]></programlisting>
</example>
<para>
@@ -111,9 +78,10 @@
By default com.sun.jndi.ldap.LdapCtxFactory is used to create the context, however this can be
overridden by specifying <ldap-context-factory> in the configuration.
</para>
-
</section>
- <section><title>Kerberos</title>
+
+ <section>
+ <title>Kerberos</title>
<para>
Kereberos Authentication is configured using the <kerberos-auth-manager> element within
@@ -128,30 +96,30 @@
</para>
<example>
- <title>Configuring a Kerberos authentication</title>
+ <title>Configuring Kerberos authentication</title>
<programlisting><![CDATA[
<security>
- <pd-auth-manager>
- <principal-database>
- <class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>
- <attributes>
- <attribute>
- <name>passwordFile</name>
- <value>${conf}/passwd</value>
- </attribute>
- </attributes>
- </principal-database>
- </pd-auth-manager>
- <kerberos-auth-manager></kerberos-auth-manager>
- <default-auth-manager>PrincipalDatabaseAuthenticationManager</default-auth-manager>
- <port-mappings>
- <port-mapping>
- <port>5672</port>
- <auth-manager>KerberosAuthenticationManager</auth-manager>
- </port-mapping>
- </port-mappings>
-</security>]]>
- </programlisting>
+ <pd-auth-manager>
+ <principal-database>
+ <class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>
+ <attributes>
+ <attribute>
+ <name>passwordFile</name>
+ <value>${conf}/passwd</value>
+ </attribute>
+ </attributes>
+ </principal-database>
+ </pd-auth-manager>
+ <kerberos-auth-manager/>
+ <default-auth-manager>PrincipalDatabaseAuthenticationManager</default-auth-manager>
+ <port-mappings>
+ <port-mapping>
+ <port>5672</port>
+ <auth-manager>KerberosAuthenticationManager</auth-manager>
+ </port-mapping>
+ </port-mappings>
+ ...
+</security>]]></programlisting>
</example>
<para>
@@ -177,8 +145,7 @@ com.sun.security.jgss.accept {
kdc="kerberos.example.com"
keyTab="/path/to/keytab-file"
principal="<name>/<host>";
-};]]>
- </programlisting>
+};]]></programlisting>
<para>
Where realm, kdc, keyTab and principal should obviously be set correctly for the environment
@@ -191,7 +158,137 @@ com.sun.security.jgss.accept {
Jurisdiction Policy Files" appropriate for your JDK in order to get Kerberos support working.
</para>
</section>
- <section><title>SSL Client Certificates</title></section>
- <section><title>Anonymous</title></section>
+
+ <section id="ExternalAuthManager">
+ <title>External (SSL Client Certificates)</title>
+
+ <para>
+ When <link linkend="SSL-Truststore-ClientCertificate"> requiring SSL Client Certificates</link> be
+ presented the ExternalAuthenticationManager can be used, such that the user is authenticated based on
+ trust of their certificate alone, and the X500Principal from the SSL session is then used as the username
+ for the connection, instead of also requiring the user to present a valid username and password.
+ </para>
+
+ <para>
+ The ExternalAuthenticationManager may be enabled by adding an empty <external-auth-manager> element to
+ the <security> section, as shown below. When referencing it from the default-auth-manager or port-mapping
+ sections, its name is ExternalAuthenticationManager.
+ </para>
+
+ <para>
+ <emphasis role="bold">Note:</emphasis> The ExternalAuthenticationManager should typically only be used on the
+ AMQP ports, in conjunction with <link linkend="SSL-Truststore-ClientCertificate">SSL client certificate
+ authentication</link>. It is not intended for other uses such as the JMX management port and will treat any
+ non-sasl authentication processes on these ports as successfull with the given username. As such you should
+ <link linkend="MultipleAuthProviders">include another Authentication Manager for use on non-AMQP ports</link>,
+ as is done in the example below. Perhaps the only exception to this would be where the broker is embedded in a
+ container that is itself externally protecting the HTTP interface and then providing the remote users name.
+ </para>
+
+ <example>
+ <title>Configuring external authentication (SSL client auth)</title>
+ <programlisting><![CDATA[
+<security>
+ <pd-auth-manager>
+ <principal-database>
+ <class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>
+ <attributes>
+ <attribute>
+ <name>passwordFile</name>
+ <value>${conf}/passwd</value>
+ </attribute>
+ </attributes>
+ </principal-database>
+ </pd-auth-manager>
+ <external-auth-manager/>
+ <default-auth-manager>PrincipalDatabaseAuthenticationManager</default-auth-manager>
+ <port-mappings>
+ <port-mapping>
+ <port>5672</port>
+ <auth-manager>ExternalAuthenticationManager</auth-manager>
+ </port-mapping>
+ </port-mappings>
+ ...
+</security>]]></programlisting>
+ </example>
+
+ </section>
+
+ <section id="AnonymousAuthManager">
+ <title>Anonymous</title>
+
+ <para>
+ The AnonymousAuthenticationManager will allow users to connect with or without credentials and result
+ in their identification on the broker as the user ANONYMOUS. It may be enabled by adding an empty
+ anonymous-auth-manager element to the security configuration section, as shown below.
+ </para>
+
+ <example>
+ <title>Configuring anonymous authentication</title>
+
+ <programlisting><![CDATA[
+<security>
+ <anonymous-auth-manager/>
+ ...
+</security>]]></programlisting>
+ </example>
+
+ <para>
+ When referencing it from the default-auth-manager or port-mapping sections, its name is
+ AnonymousAuthenticationManager.
+ </para>
+ </section>
+
+ <section id="MultipleAuthProviders">
+ <title>Configuring multiple Authentication Providers</title>
+ <para>
+ Different managers may be used on different ports. Each manager has its own configuration element,
+ the presence of which within the <security> section denotes the use of that authentication
+ provider. Where only one such manager is configured, it will be used on all ports (including JMX
+ and HTTP). Where more than one authentication manager is configured the configuration must define
+ which is the "default", and (if required) the mapping of non-default authentication managers to
+ other ports.
+ </para>
+ <para>
+ The following configuration sets up three authentication managers, using a password file as the
+ default (e.g. for the JMX and HTTP ports), Kerberos on port 5672 (the regular AMQP port) and Anonymous
+ on port 5673 (e.g a second AMQP port the broker could have been configured with).
+ </para>
+
+ <example>
+ <title>Configuring multiple (per-port) authentication schemes</title>
+ <programlisting><![CDATA[
+<security>
+ <pd-auth-manager>
+ <principal-database>
+ <class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>
+ <attributes>
+ <attribute>
+ <name>passwordFile</name>
+ <value>${conf}/passwd</value>
+ </attribute>
+ </attributes>
+ </principal-database>
+ </pd-auth-manager>
+ <kerberos-auth-manager>
+ <auth-name>sib</auth-name>
+ </kerberos-auth-manager>
+ <anonymous-auth-manager/>
+ <default-auth-manager>PrincipalDatabaseAuthenticationManager</default-auth-manager>
+ <port-mappings>
+ <port-mapping>
+ <port>5672</port>
+ <auth-manager>KerberosAuthenticationManager</auth-manager>
+ </port-mapping>
+ <port-mapping>
+ <port>5673</port>
+ <auth-manager>AnonymousAuthenticationManager</auth-manager>
+ </port-mapping>
+ </port-mappings>
+ ...
+</security>]]></programlisting>
+ </example>
+ </section>
+
</section>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Security-SSL.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Security-SSL.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Security-SSL.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Security-SSL.xml Mon Nov 19 12:47:53 2012
@@ -21,6 +21,85 @@
-->
<section id="Java-Broker-Security-SSL">
-<title>SSL</title>
+ <title>SSL</title>
+ <para>
+ This section will show how to use SSL to enable secure
+ connections between an AMQP message client and the broker.
+ </para>
+ <section role="h2" id="SSL-Keystore">
+ <title>Keystore Configuration</title>
+ <para>
+ The broker configuration file (config.xml) needs to be updated to include the required SSL keystore
+ configuration, an example of which can be found below.
+ </para>
+
+ <example>
+ <title>Configuring an SSL Keystore</title>
+ <programlisting><![CDATA[
+<connector>
+ ...
+ <ssl>
+ <enabled>true</enabled>
+ <port>5671</port>
+ <sslOnly>false</sslOnly>
+ <keyStorePath>/path/to/keystore.ks</keyStorePath>
+ <keyStorePassword>keystorepass</keyStorePassword>
+ <certAlias>alias<certAlias>
+ </ssl>
+ ...
+<connector>]]></programlisting>
+ </example>
+
+ <para>
+ The certAlias element is an optional way of specifying which certificate the broker should use
+ if the keystore contains multiple entries.
+ </para>
+
+ <para>
+ The sslOnly element controls whether the broker will <emphasis role="bold">only</emphasis> bind
+ the configured SSL port(s) or will also bind the non-SSL port(s). Setting sslOnly to true will
+ disable the non-SSL ports.
+ </para>
+ </section>
+
+ <section role="h2" id="SSL-Truststore-ClientCertificate">
+ <title>Truststore / Client Certificate Authentication</title>
+ <para>
+ The SSL trustore and related Client Certificate Authentication behaviour can be configured with
+ additional configuration as shown in the example below, in which the broker requires client
+ certificate authentication.
+ </para>
+
+ <example>
+ <title>Configuring an SSL Truststore and client auth</title>
+ <programlisting><![CDATA[
+<connector>
+ ...
+ <ssl>
+ ...
+ <trustStorePath>/path/to/truststore.ks</trustStorePath>
+ <trustStorePassword>truststorepass</trustStorePassword>
+ <needClientAuth>true</needClientAuth>
+ <wantClientAuth>false</wantClientAuth>
+ ...
+ </ssl>
+ ...
+<connector>]]></programlisting>
+ </example>
+
+ <para>
+ The needClientAuth and wantClientAuth elements allow control of whether the client must present an
+ SSL certificate. Only one of these elements is needed but both may be used at the same time.
+ A socket's client authentication setting is one of three states: required (needClientAuth = true),
+ requested (wantClientAuth = true), or none desired (both false, the default). If both elements are
+ set to true, needClientAuth takes precedence.
+ </para>
+
+ <para>
+ When using Client Certificate Authentication it may be desirable to use the External Authentication
+ Manager, for details see <xref linkend="ExternalAuthManager"></xref>
+ </para>
+
+ </section>
</section>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-BDB-Store.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-BDB-Store.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-BDB-Store.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-BDB-Store.xml Mon Nov 19 12:47:53 2012
@@ -1,4 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE entities [
+<!ENTITY % entities SYSTEM "commonEntities.xml">
+%entities;
+]>
<!--
Licensed to the Apache Software Foundation (ASF) under one
@@ -21,6 +25,72 @@
-->
<section id="Java-Broker-Stores-BDB-Store">
-<title>BDB Store</title>
+ <title>BDB Store</title>
+ <para>
+ The Java broker has an <emphasis>optional</emphasis> message store implementation backed by Oracle BDB JE.
+ This section will detail where to download the optional dependency from, how to add it to the broker installation,
+ and provide an example configuration for using the BDBMessageStore.
+ </para>
+
+ <section role="h3" id="Java-Broker-Stores-BDB-Store-BDBJE-Download">
+ <title>Oracle BDB JE download</title>
+ <para>
+ The BDB based message store is optional due to its dependency on Oracle BDB JE, which is distributed under the Sleepycat
+ licence. As a result of this, the dependency cant be distributed by the Apache Qpid project as part of the broker release package.
+ </para>
+ <para>
+ If you wish to use the BDBMessageStore, then you must download the Oracle BDB JE &oracleBdbProductVersion; release
+ <ulink url="&oracleJeDownloadUrl;">from the Oracle website.</ulink>
+ </para>
+ <para>
+ The download has a name in the form je-&oracleBdbProductVersion;.tar.gz. It is recommended that you
+ confirm the integrity of the download by verifying the MD5.
+ </para>
+ </section>
+
+ <section role="h3" id="Java-Broker-Stores-BDB-Store-BDBJE-Installation">
+ <title>Oracle BDB JE jar installation</title>
+ <para>
+ If you wish to use the BDBMessageStore, copy the je-&oracleBdbProductVersion;.jar from within the release
+ downloaded <link linkend="Java-Broker-Stores-BDB-Store-BDBJE-Download">above</link> into an 'opt' sub-directory
+ of the brokers 'lib' directory.
+ </para>
+
+ <programlisting>Unix:
+mkdir qpid-broker-&qpidCurrentRelease;/lib/opt
+cp je-&oracleBdbProductVersion;.jar qpid-broker-&qpidCurrentRelease;/lib/opt</programlisting>
+
+ <programlisting>Windows:
+mkdir qpid-broker-&qpidCurrentRelease;\lib\opt
+copy je-&oracleBdbProductVersion;.jar qpid-broker-&qpidCurrentRelease;\lib\opt</programlisting>
+ </section>
+
+
+
+ <section role="h3" id="Java-Broker-Stores-BDB-Store-Configuration">
+ <title>Configuration</title>
+ <para>
+ In order to use the BDBMessageStore, you must configure it for each VirtualHost desired by updating the store element
+ to specify the associated store class and provide a directory location for the data to be written, as shown below.
+ </para>
+
+ <example>
+ <title>Configuring a VirtualHost to use the BDBMessageStore</title>
+ <programlisting><![CDATA[
+<virtualhosts>
+ <virtualhost>
+ <name>vhostname</name>
+ <vhostname>
+ <store>
+ <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <environment-path>${QPID_WORK}/bdbstore/vhostname</environment-path>
+ </store>
+ ...
+ </vhostname>
+ </virtualhost>
+</virtualhosts>
+]]></programlisting>
+ </example>
+ </section>
</section>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-Derby-Store.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-Derby-Store.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-Derby-Store.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-Derby-Store.xml Mon Nov 19 12:47:53 2012
@@ -22,5 +22,35 @@
<section id="Java-Broker-Stores-Derby-Store">
<title>Derby Store</title>
+ <para>
+ The Java broker has a message store implementation backed by Apache Derby.
+ This section will detail configuration for using the DerbyMessageStore.
+ </para>
+
+ <section role="h3" id="Java-Broker-Stores-Derby-Store-Configuration">
+ <title>Configuration</title>
+ <para>
+ In order to use the DerbyMessageStore, you must configure it for each VirtualHost desired by updating the store element
+ to specify the associated store class and provide a directory location for the data to be written, as shown below.
+ </para>
+
+ <example>
+ <title>Configuring a VirtualHost to use the DerbyMessageStore</title>
+ <programlisting><![CDATA[
+<virtualhosts>
+ <virtualhost>
+ <name>vhostname</name>
+ <vhostname>
+ <store>
+ <class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <environment-path>${QPID_WORK}/derbystore/vhostname</environment-path>
+ </store>
+ ...
+ </vhostname>
+ </virtualhost>
+</virtualhosts>
+]]></programlisting>
+ </example>
+ </section>
</section>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-HA-BDB-Store.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-HA-BDB-Store.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-HA-BDB-Store.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-HA-BDB-Store.xml Mon Nov 19 12:47:53 2012
@@ -21,6 +21,42 @@
-->
<section id="Java-Broker-Stores-HA-BDB-Store">
-<title>High Availability BDB Store</title>
+ <title>High Availability BDB Store</title>
+ <para>
+ The Java broker has an <emphasis>optional</emphasis> High Availability message store implementation backed by Oracle BDB JE HA.
+ This section references information on where to download the optional dependency from, how to add it to the broker
+ installation, and how to configure the BDBHAMessageStore.
+ </para>
+ <para>
+ For more detailed information about use of this store, see <xref linkend="Java-Broker-High-Availability"></xref>.
+ </para>
+
+ <section role="h3" id="Java-Broker-Stores-HA-BDB-Store-BDBJE-Download">
+ <title>Oracle BDB JE download</title>
+ <para>
+ For details, see <xref linkend="Java-Broker-Stores-BDB-Store-BDBJE-Download"></xref>.
+ </para>
+ </section>
+
+ <section role="h3" id="Java-Broker-Stores-HA-BDB-Store-BDBJE-Installation">
+ <title>Oracle BDB JE jar installation</title>
+ <para>
+ For details, see <xref linkend="Java-Broker-Stores-BDB-Store-BDBJE-Installation"></xref>.
+ </para>
+ </section>
+
+ <section role="h3" id="Java-Broker-Stores-HA-BDB-Store-Configuration">
+ <title>Configuration</title>
+ <para>
+ In order to use the BDBHAMessageStore, you must configure it for each VirtualHost desired by updating the store element
+ to specify the associated store class, provide a directory location for the data to be written, and configure the
+ replication group and policies used by BDB JA HA.
+ </para>
+ <para>
+ A general configuration example is shown <link linkend="Java-Broker-High-Availability-Configuration">here</link>, however it
+ is strongly recommended you examine the wider context of <xref linkend="Java-Broker-High-Availability"></xref> for a fuller
+ discussion of the various configuration options and how to use them.
+ </para>
+ </section>
</section>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-Memory-Store.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-Memory-Store.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-Memory-Store.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/doc/book/src/java-broker/Java-Broker-Stores-Memory-Store.xml Mon Nov 19 12:47:53 2012
@@ -21,6 +21,41 @@
-->
<section id="Java-Broker-Stores-Memory-Store">
-<title>Memory Store</title>
+ <title>Memory Store</title>
+ <para>
+ The Java broker has an in-memory message store implementation.
+ This section will detail configuration for using the MemoryMessageStore.
+ </para>
+ <para>
+ Note: when using this store, the broker will store both persistent and non-persistent messages
+ in memory, which is to say that neither will be available following a broker restart, and the
+ ability to store new messages will be entirely constrained by the JVM heap size.
+ </para>
+
+ <section role="h3" id="Java-Broker-Stores-Derby-Store-Configuration">
+ <title>Configuration</title>
+ <para>
+ In order to use the MemoryMessageStore, you must configure it for each VirtualHost desired by updating the store element
+ to specify the associated store class, as shown below.
+ </para>
+
+ <example>
+ <title>Configuring a VirtualHost to use the MemoryMessageStore</title>
+ <programlisting><![CDATA[
+<virtualhosts>
+ <virtualhost>
+ <name>vhostname</name>
+ <vhostname>
+ <store>
+ <class>org.apache.qpid.server.store.MemoryMessageStore</class
+ </store>
+ ...
+ </vhostname>
+ </virtualhost>
+</virtualhosts>
+]]></programlisting>
+ </example>
+ </section>
+
</section>
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/amqp-1-0-client:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/amqp-1-0-client-jms:r1401294-1411033
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/build.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/build.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/build.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/build.xml Mon Nov 19 12:47:53 2012
@@ -24,6 +24,9 @@
<property name="module.depends" value="amqp-1-0-common amqp-1-0-client"/>
<property name="module.genpom.args" value="-Sgeronimo-jms_1.1_spec=provided"/>
+ <property name="example.src.dir" value="${project.root}/amqp-1-0-client-jms/example/src/main/java" />
+ <property name="example.jar.file" value="${build.lib}/qpid-amqp-1-0-client-jms-example-${project.version}.jar" />
+
<target name="release-bin-copy-readme">
<copy todir="${module.release}" overwrite="true" failonerror="true">
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java Mon Nov 19 12:47:53 2012
@@ -282,7 +282,7 @@ public class ConnectionImpl implements C
{
task.onClose();
}
- if(_state != State.UNCONNECTED ) {
+ if(_conn != null && _state != State.UNCONNECTED ) {
_conn.close();
}
_state = State.CLOSED;
@@ -331,6 +331,10 @@ public class ConnectionImpl implements C
final int i) throws JMSException
{
checkClosed();
+ if (_isQueueConnection)
+ {
+ throw new IllegalStateException("QueueConnection cannot be used to create Pub/Sub based resources.");
+ }
return null; //TODO
}
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java Mon Nov 19 12:47:53 2012
@@ -316,9 +316,9 @@ public class MessageConsumerImpl impleme
_lastUnackedMessage = deliveryTag;
}
- void preReceiveAction(final org.apache.qpid.amqp_1_0.client.Message msg) throws IllegalStateException
+ void preReceiveAction(final org.apache.qpid.amqp_1_0.client.Message msg)
{
- final int acknowledgeMode = _session.getAcknowledgeMode();
+ int acknowledgeMode = _session.getAckModeEnum().ordinal();
if(acknowledgeMode == Session.AUTO_ACKNOWLEDGE
|| acknowledgeMode == Session.DUPS_OK_ACKNOWLEDGE
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java Mon Nov 19 12:47:53 2012
@@ -18,9 +18,7 @@
*/
package org.apache.qpid.amqp_1_0.jms.impl;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Map;
+import java.util.*;
import javax.jms.InvalidSelectorException;
import javax.jms.JMSException;
import org.apache.qpid.amqp_1_0.client.AcknowledgeMode;
@@ -29,6 +27,7 @@ import org.apache.qpid.amqp_1_0.client.R
import org.apache.qpid.amqp_1_0.jms.QueueBrowser;
import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
import org.apache.qpid.amqp_1_0.type.messaging.Filter;
import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
@@ -39,49 +38,27 @@ public class QueueBrowserImpl implements
private static final String JMS_SELECTOR = "jms-selector";
private QueueImpl _queue;
private String _selector;
- private Receiver _receiver;
- private Message _nextElement;
- private MessageEnumeration _enumeration;
+ private final SessionImpl _session;
+ private Map<Symbol, Filter> _filters;
+ private HashSet<MessageEnumeration> _enumerations = new HashSet<MessageEnumeration>();
+ private boolean _closed;
QueueBrowserImpl(final QueueImpl queue, final String selector, SessionImpl session) throws JMSException
{
_queue = queue;
_selector = selector;
+ _session = session;
- Map<Symbol, Filter> filters;
if(selector == null || selector.trim().equals(""))
{
- filters = null;
+ _filters = null;
}
else
{
- filters = Collections.singletonMap(Symbol.valueOf(JMS_SELECTOR),(Filter) new JMSSelectorFilter(_selector));
- }
-
-
- try
- {
- _receiver = session.getClientSession().createReceiver(queue.getAddress(),
- StdDistMode.COPY,
- AcknowledgeMode.AMO,null,
- false,
- filters, null);
- _nextElement = _receiver.receive(0L);
- _enumeration = new MessageEnumeration();
- }
- catch(AmqpErrorException e)
- {
- org.apache.qpid.amqp_1_0.type.transport.Error error = e.getError();
- if(AmqpError.INVALID_FIELD.equals(error.getCondition()))
- {
- throw new InvalidSelectorException(e.getMessage());
- }
- else
- {
- throw new JMSException(e.getMessage(), error.getCondition().getValue().toString());
- }
-
+ _filters = Collections.singletonMap(Symbol.valueOf(JMS_SELECTOR),(Filter) new JMSSelectorFilter(_selector));
+ // We do this just to have the server validate the filter..
+ new MessageEnumeration().close();
}
}
@@ -97,42 +74,108 @@ public class QueueBrowserImpl implements
public Enumeration getEnumeration() throws JMSException
{
- if(_enumeration == null)
+ if(_closed)
{
throw new IllegalStateException("Browser has been closed");
}
- return _enumeration;
+ return new MessageEnumeration();
}
public void close() throws JMSException
{
- _receiver.close();
- _enumeration = null;
+ _closed = true;
+ for(MessageEnumeration me : new ArrayList<MessageEnumeration>(_enumerations))
+ {
+ me.close();
+ }
}
private final class MessageEnumeration implements Enumeration<Message>
{
+ private Receiver _receiver;
+ private Message _nextElement;
+ private boolean _needNext = true;
+
+ MessageEnumeration() throws JMSException
+ {
+ try
+ {
+ _receiver = _session.getClientSession().createReceiver(_queue.getAddress(),
+ StdDistMode.COPY,
+ AcknowledgeMode.AMO, null,
+ false,
+ _filters, null);
+ _receiver.setCredit(UnsignedInteger.valueOf(100), true);
+ }
+ catch(AmqpErrorException e)
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = e.getError();
+ if(AmqpError.INVALID_FIELD.equals(error.getCondition()))
+ {
+ throw new InvalidSelectorException(e.getMessage());
+ }
+ else
+ {
+ throw new JMSException(e.getMessage(), error.getCondition().getValue().toString());
+ }
+
+ }
+ _enumerations.add(this);
+
+ }
+
+ public void close()
+ {
+ _enumerations.remove(this);
+ _receiver.close();
+ _receiver = null;
+ }
@Override
public boolean hasMoreElements()
{
+ if( _receiver == null )
+ {
+ return false;
+ }
+ if( _needNext )
+ {
+ _needNext = false;
+ _nextElement = _receiver.receive(0L);
+ if( _nextElement == null )
+ {
+ // Drain to verify there really are no more messages.
+ _receiver.drain();
+ _receiver.drainWait();
+ _nextElement = _receiver.receive(0L);
+ if( _nextElement == null )
+ {
+ close();
+ }
+ else
+ {
+ // there are still more messages, open up the credit window again..
+ _receiver.clearDrain();
+ }
+ }
+ }
return _nextElement != null;
}
@Override
public Message nextElement()
{
-
- Message message = _nextElement;
- if(message == null)
+ if( hasMoreElements() )
{
- message = _receiver.receive(0l);
+ Message message = _nextElement;
+ _nextElement = null;
+ _needNext = true;
+ return message;
}
- if(message != null)
+ else
{
- _nextElement = _receiver.receive(0l);
+ throw new NoSuchElementException();
}
- return message;
}
}
}
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java Mon Nov 19 12:47:53 2012
@@ -804,6 +804,10 @@ public class SessionImpl implements Sess
if(message != null)
{
+ if(_acknowledgeMode == AcknowledgeMode.CLIENT_ACKNOWLEDGE)
+ {
+ consumer.setLastUnackedMessage(msg.getDeliveryTag());
+ }
_currentConsumer = consumer;
_currentMessage = msg;
try
@@ -816,11 +820,11 @@ public class SessionImpl implements Sess
_currentMessage = null;
}
- if((_recoveredMessage == null) && (_acknowledgeMode == AcknowledgeMode.AUTO_ACKNOWLEDGE
- || _acknowledgeMode == AcknowledgeMode.DUPS_OK_ACKNOWLEDGE))
+ if(_recoveredMessage == null)
{
- consumer.acknowledge(msg);
+ consumer.preReceiveAction(msg);
}
+
}
}
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/build.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/build.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/build.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/build.xml Mon Nov 19 12:47:53 2012
@@ -23,6 +23,9 @@
<property name="module.genpom" value="true"/>
<property name="module.depends" value="amqp-1-0-common"/>
+ <property name="example.src.dir" value="${project.root}/amqp-1-0-client/example/src/main/java" />
+ <property name="example.jar.file" value="${build.lib}/qpid-amqp-1-0-client-example-${project.version}.jar" />
+
<import file="../module.xml"/>
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java Mon Nov 19 12:47:53 2012
@@ -503,6 +503,37 @@ public class Receiver implements Deliver
_endpoint.drain();
}
+ /**
+ * Waits for the receiver to drain or a message to be available to be received.
+ * @return true if the receiver has been drained.
+ */
+ public boolean drainWait()
+ {
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ try
+ {
+ while( _prefetchQueue.peek()==null && !_endpoint.isDrained() && !_endpoint.isDetached() )
+ {
+ lock.wait();
+ }
+ }
+ catch (InterruptedException e)
+ {
+ }
+ }
+ return _prefetchQueue.peek()==null && _endpoint.isDrained();
+ }
+
+ /**
+ * Clears the receiver drain so that message delivery can resume.
+ */
+ public void clearDrain()
+ {
+ _endpoint.clearDrain();
+ }
+
public void setCreditWithTransaction(final UnsignedInteger credit, final Transaction txn)
{
_endpoint.setLinkCredit(credit);
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-common/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/amqp-1-0-common:r1401294-1411033
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java Mon Nov 19 12:47:53 2012
@@ -159,7 +159,7 @@ public class ReceivingLinkEndpoint exten
super.receiveFlow(flow);
_remoteDrain = Boolean.TRUE.equals((Boolean)flow.getDrain());
setAvailable(flow.getAvailable());
- _remoteTransferCount = flow.getDeliveryCount();
+ setDeliveryCount(flow.getDeliveryCount());
getLock().notifyAll();
}
}
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/broker:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/bin/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/broker/bin:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue:r1401294-1411033
Propchange: qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/
------------------------------------------------------------------------------
Merged /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost:r1401294-1411033
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/build.deps
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/build.deps?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/build.deps (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/build.deps Mon Nov 19 12:47:53 2012
@@ -68,7 +68,8 @@ commons-configuration.libs = ${commons-b
common.libs=${slf4j-api}
client.libs=${geronimo-jms}
amqp-1-0-common.libs=
-amqp-1-0-client.libs=${commons-cli}
+amqp-1-0-client.libs=
+amqp-1-0-client-example.libs=${commons-cli}
amqp-1-0-client-jms.libs=${geronimo-jms}
tools.libs=${commons-configuration.libs} ${log4j}
broker.libs=${commons-cli} ${commons-logging} ${log4j} ${slf4j-log4j} \
Modified: qpid/branches/java-broker-config-qpid-4390/qpid/java/build.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/build.xml?rev=1411155&r1=1411154&r2=1411155&view=diff
==============================================================================
--- qpid/branches/java-broker-config-qpid-4390/qpid/java/build.xml (original)
+++ qpid/branches/java-broker-config-qpid-4390/qpid/java/build.xml Mon Nov 19 12:47:53 2012
@@ -32,7 +32,7 @@
</condition>
<property name="modules.core" value="common management/common amqp-1-0-common broker client amqp-1-0-client amqp-1-0-client-jms tools"/>
- <property name="modules.examples" value="client/example management/example"/>
+ <property name="modules.examples" value="client/example management/example amqp-1-0-client/example amqp-1-0-client-jms/example"/>
<property name="modules.tests" value="systests perftests"/>
<property name="modules.plugin" value="${broker-plugins} ${client-plugins}"/>
<property name="modules.jca" value="jca"/>
@@ -77,6 +77,10 @@
<iterate target="release-mvn"/>
</target>
+ <target name="deploy-snapshot" description="deploy snapshot artifacts to nexus">
+ <iterate target="deploy-snapshot"/>
+ </target>
+
<target name="compile" description="compile sources">
<iterate target="compile"/>
</target>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org