;;
;; Licensed to the Apache Software Foundation (ASF) under one
;; or more contributor license agreements.  See the NOTICE file
;; distributed with this work for additional information
;; regarding copyright ownership.  The ASF licenses this file
;; to you under the Apache License, Version 2.0 (the
;; "License"); you may not use this file except in compliance
;; with the License.  You may obtain a copy of the License at
;; 
;;   http://www.apache.org/licenses/LICENSE-2.0
;; 
;; Unless required by applicable law or agreed to in writing,
;; software distributed under the License is distributed on an
;; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
;; KIND, either express or implied.  See the License for the
;; specific language governing permissions and limitations
;; under the License.
;;


  +----------+          +----------+          +----------+
  |QDR.X     |          |QDR.A     |          |QDR.C     |
  |port:     |          |port:     |          |port:     |
  | 5672     |--------->| 20001    |--------->| 20003    |
  |          |          |          |          |          |<------+
  |          |--+       |          |    +---->|          |       |
  +----------+  |       +----------+    |     +----------+       |
                |            |    |     |             |          |
                |            |    +--------------+    |          |
                |            |          |        |    |          |
                |            v          |        v    v          |
                |       +----------+    |     +----------+       |  +----------+
                |       |QDR.B     |----+     |QDR.D     |       +--|QDR.Y     |
                +------>|port:     |          |port:     |          |port:     |
                        | 20002    |--------->| 20004    |<---------| 20005    |
                        |          |          |          |          |          |
                        |          |          |          |          |          |
                        +----------+          +----------+          +----------+


 * The direction of the arrow shows the direction of the connection setup
   Connector --> Listener
