You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by jr...@apache.org on 2018/03/20 19:12:36 UTC
qpid-proton git commit: PROTON-1799: Remove obsolete docs and test
code
Repository: qpid-proton
Updated Branches:
refs/heads/master 0c9bb9ffc -> 9045f7596
PROTON-1799: Remove obsolete docs and test code
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/9045f759
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/9045f759
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/9045f759
Branch: refs/heads/master
Commit: 9045f75968df77198418ecff40fe4b9da1af01bf
Parents: 0c9bb9f
Author: Justin Ross <jr...@apache.org>
Authored: Tue Mar 20 12:12:14 2018 -0700
Committer: Justin Ross <jr...@apache.org>
Committed: Tue Mar 20 12:12:14 2018 -0700
----------------------------------------------------------------------
docs/markdown/engine/engine.md | 74 ---------------
docs/markdown/index.md | 24 -----
proton-c/CMakeLists.txt | 13 ---
proton-c/bindings/cpp/CMakeLists.txt | 1 -
proton-c/xproton.py | 20 ----
tests/perf/README.txt | 10 --
tests/perf/quick_perf.py | 78 ----------------
tests/tools/apps/cpp/CMakeLists.txt | 53 -----------
tests/tools/apps/cpp/reactor_send.cpp | 133 ---------------------------
tests/tools/apps/python/reactor-send.py | 85 -----------------
10 files changed, 491 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/docs/markdown/engine/engine.md
----------------------------------------------------------------------
diff --git a/docs/markdown/engine/engine.md b/docs/markdown/engine/engine.md
deleted file mode 100644
index b1a6f60..0000000
--- a/docs/markdown/engine/engine.md
+++ /dev/null
@@ -1,74 +0,0 @@
-Proton's Engine is a stateful component with a low-level API that allows an
-application to communicate using AMQP. This document gives a high level overview
-of the Engine's design, intended to be read by application developers intending
-to use it.
-
-The Engine is built around the concept of a protocol engine. The idea behind a
-protocol engine is to capture all the complex details of implementing a given
-protocol in a way that is as decoupled as possible from OS details such as I/O
-and threading models. The result is a highly portable and easily embedded
-component that provides a full protocol implementation.
-
-
-The Engine API
---------------
-
-The Engine contains in-memory representations of AMQP entities such as
-Connection, Session and Delivery. These are manipulated via its API, which
-consists of two main parts.
-
-- The *control and query API*, commonly referred to as *The Top Half*, which
- offers functions to directly create, modify and query the Connections,
- Sessions etc.
-
-- The *transport API*, commonly referred to as *The Bottom Half*, which contains
- a small set of functions to operate on the AMQP entities therein by accepting
- binary AMQP input and producing binary AMQP output. The Engine's transport
- layer can be thought of as transforming a *queue of bytes*, therefore the API
- is expressed in terms of input appended to the *tail* and output fetched from
- the *head*.
-
-
-Typical Engine usage
---------------------
-
-The diagram below shows how the Engine is typically used by an application. The
-socket's remote peer is serviced by another AMQP application, which may (or may
-not) use Proton.
-
-<pre>
-<![CDATA[
-
- +------------ + +---------------+
- | | | |
- | Application |--------->| Engine |
- | business | | "Top Half" |
- | logic | | Control and |
- | |<---------| query API |
- | | | |
- | | +---------------+
- | | |
- +-------------+ +-------------+ +---------------+
- | | Input | | Tail | Engine |
- | |--------->| |--------->| "Bottom half" |
- | Socket | | Application | | Transport API |
- | |<---------| I/O layer |<---------| |
- | | Output | | Head | |
- +-------------+ +-------------+ +---------------+
-]]>
-</pre>
-
-For maximum flexibility, the Engine is not multi-threaded. It is therefore
-typical for an application thread to loop continuously, repeatedly calling the
-Top Half and Bottom Half functions.
-
-
-Implementations
----------------
-
-Implementations of the Engine currently exist in C and Java. Bindings exist from
-several languages (e.g. Ruby, Python, Java Native Interface) to the C Engine.
-
-For more information see the documentation in the code.
-
-
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/docs/markdown/index.md
----------------------------------------------------------------------
diff --git a/docs/markdown/index.md b/docs/markdown/index.md
deleted file mode 100644
index 97ce4f2..0000000
--- a/docs/markdown/index.md
+++ /dev/null
@@ -1,24 +0,0 @@
-
-Proton is a library for speaking AMQP, including:
-
-- The [AMQP Protocol Engine](engine/engine.html), a succinct encapsulation of the full
- AMQP protocol machinery.
-
-Proton is designed for maximum embeddability:
-
-- minimal dependencies
-- minimal assumptions about application threading model
-
-Proton is designed to scale up and down:
-
-- transparently supports both simple peer to peer messaging and complex
-globally federated topologies
-
-Proton is multi-lingual:
-
-- Proton-C - a C implementation with language bindings in C++, Go, Python, and Ruby
-- Proton-J - a pure Java implementation
-
-Please see http://qpid.apache.org/proton for a more info.
-
-
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/proton-c/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/CMakeLists.txt b/proton-c/CMakeLists.txt
index a6c48ec..b3683be 100644
--- a/proton-c/CMakeLists.txt
+++ b/proton-c/CMakeLists.txt
@@ -795,17 +795,4 @@ if (BUILD_PYTHON)
endif ()
endif (ENABLE_TOX_TEST)
endif(NOT TOX_MODULE_FOUND)
-
- set (perf_pythonpath "${py_pythonpath}" "${CMAKE_SOURCE_DIR}/examples/cpp")
- to_native_path ("${perf_pythonpath}" perf_pythonpath)
- add_custom_target(quick_perf_c ${env_py} -- "PATH=${py_path}" "PYTHONPATH=${perf_pythonpath}"
- ${PYTHON_EXECUTABLE} "${CMAKE_SOURCE_DIR}/tests/perf/quick_perf.py" "C")
- add_dependencies(quick_perf_c reactor-send reactor-recv)
-
- add_custom_target(quick_perf_py COMMAND ${env_py} --
- "PATH=${py_path}" "PYTHONPATH=${perf_pythonpath}"
- ${PYTHON_EXECUTABLE} "${CMAKE_SOURCE_DIR}/tests/perf/quick_perf.py" "PYTHON"
- WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/tests/tools/apps/python")
- add_dependencies(quick_perf_py reactor-recv _cproton)
-
endif (BUILD_PYTHON)
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/proton-c/bindings/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/CMakeLists.txt b/proton-c/bindings/cpp/CMakeLists.txt
index 6555c4c..5d50558 100644
--- a/proton-c/bindings/cpp/CMakeLists.txt
+++ b/proton-c/bindings/cpp/CMakeLists.txt
@@ -186,7 +186,6 @@ install (DIRECTORY "include/proton" DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MAT
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/config_presets.hpp" DESTINATION "${INCLUDE_INSTALL_DIR}/proton/internal")
add_subdirectory(docs)
-add_subdirectory(${CMAKE_SOURCE_DIR}/tests/tools/apps/cpp ${CMAKE_BINARY_DIR}/tests/tools/apps/cpp)
# Pkg config file
configure_file(
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/proton-c/xproton.py
----------------------------------------------------------------------
diff --git a/proton-c/xproton.py b/proton-c/xproton.py
deleted file mode 100644
index 8d78660..0000000
--- a/proton-c/xproton.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-from cproton import *
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/tests/perf/README.txt
----------------------------------------------------------------------
diff --git a/tests/perf/README.txt b/tests/perf/README.txt
deleted file mode 100644
index 5f01ae9..0000000
--- a/tests/perf/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Simple performance tests.
-
-quick_perf coordinates two processes: a simple fast echo "server" and
-a client that sends and receives simple binary messages over a single
-connection on the loopback interface. The latter is timed. This
-provides a crude view of the overhead of the Proton library alone
-(CMake target "quick_perf_c") or with a language binding. It is most
-useful for verifying a lack of performance degradation on a large
-check-in or between releases. It probably says little about expected
-performance on a physical network or for a particular application.
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/tests/perf/quick_perf.py
----------------------------------------------------------------------
diff --git a/tests/perf/quick_perf.py b/tests/perf/quick_perf.py
deleted file mode 100644
index 4371fb4..0000000
--- a/tests/perf/quick_perf.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License
-#
-
-# For use with CMake to run simple performance tests in Proton.
-# Assumes that rector-recv and reactor-send can be found in PATH.
-# CMake's choice of python executable may be passed via PYTHON_EXE environment var.
-# Add any OS specific monitor helpers in PN_QPERF_MON: i.e.
-# PN_QPERF_MON="time taskset 0x2" make quick_perf_c
-
-
-import os, sys, socket, time
-from example_test import Proc, pick_addr
-from subprocess import Popen, PIPE, STDOUT
-
-
-NULL = open(os.devnull, 'w')
-
-connaddr = pick_addr()
-linkaddr = connaddr + "/perf_test"
-
-if 'PYTHON_EXE' in os.environ:
- python_exe = os.environ['PYTHON_EXE']
-else:
- python_exe = 'python'
-
-if 'PN_QPERF_MON' in os.environ:
- monitor_cmd = os.environ['PN_QPERF_MON'].split()
-else:
- monitor_cmd = []
-
-
-
-mcount = 5000000
-if 'PYTHON' in sys.argv:
- mcount /= 10
-
-perf_targets = {'C' : ['reactor-send', "-a", linkaddr, "-c", str(mcount), "-R"],
- 'CPP' : ['reactor_send_cpp', "-a", linkaddr, "-c", str(mcount), "-R", "1"],
- 'PYTHON' : [python_exe, 'reactor-send.py', "-a", linkaddr, "-c", str(mcount), "-R"] }
-try:
- perf_target = monitor_cmd + perf_targets[sys.argv[1]]
-except:
- print "Usage: python quick_perf [C|CPP|PYTHON]"
- raise
-
-
-# Use Proton-C reactor-recv as a relatively fast loopback "broker" for these tests
-server = Proc(["reactor-recv", "-X", "listening", "-a", linkaddr, "-c", str(mcount), "-R"], ready="listening", valgrind=False, timeout=300)
-try:
- start = time.time()
- client = Proc(perf_target, valgrind=False, timeout=300)
- print client.wait_exit()
- server.wait_exit()
- end = time.time()
-except Exception as e:
- if server: server.safe_kill()
- raise Exception("Error running %s: %s", server, e)
-
-
-secs = end - start
-print("%d loopback messages in %.1f secs" % (mcount * 2, secs) )
-print("%.0f msgs/sec" % (mcount * 2 / secs) )
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/tests/tools/apps/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/tests/tools/apps/cpp/CMakeLists.txt b/tests/tools/apps/cpp/CMakeLists.txt
deleted file mode 100644
index 2bc1bc5..0000000
--- a/tests/tools/apps/cpp/CMakeLists.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-include_directories("${CMAKE_SOURCE_DIR}/examples/cpp" "${CMAKE_SOURCE_DIR}/examples/cpp/lib")
-add_executable(reactor_send_cpp reactor_send.cpp)
-
-target_link_libraries(reactor_send_cpp qpid-proton qpid-proton-cpp)
-
-if (CMAKE_SYSTEM_NAME STREQUAL Windows)
- # No change needed for windows already use correct separator
- function(to_native_path path result)
- file (TO_NATIVE_PATH "${path}" path)
- set (${result} ${path} PARENT_SCOPE)
- endfunction()
-else (CMAKE_SYSTEM_NAME STREQUAL Windows)
- # Just change ';'->':'
- function(to_native_path path result)
- file (TO_NATIVE_PATH "${path}" path)
- string (REGEX REPLACE ";" ":" path "${path}")
- set (${result} ${path} PARENT_SCOPE)
- endfunction()
-endif (CMAKE_SYSTEM_NAME STREQUAL Windows)
-
-set (py_bld "$<TARGET_FILE_DIR:qpid-proton>" "$<TARGET_FILE_DIR:qpid-proton-cpp>") # For windows
-set (app_path $<TARGET_FILE_DIR:reactor-recv> $<TARGET_FILE_DIR:reactor_send_cpp>)
-set (py_path ${py_bld} ${app_path} $ENV{PATH})
-to_native_path("${py_path}" py_path)
-set (py_pythonpath "${CMAKE_SOURCE_DIR}/examples/cpp" $ENV{PYTHONPATH})
-to_native_path ("${py_pythonpath}" py_pythonpath)
-set (perf_pythonpath "${py_pythonpath}" "${CMAKE_SOURCE_DIR}/examples/cpp")
-to_native_path ("${perf_pythonpath}" perf_pythonpath)
-
-add_custom_target(quick_perf_cpp ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/proton-c/env.py --
- "PATH=${py_path}" "PYTHONPATH=${perf_pythonpath}"
- ${PYTHON_EXECUTABLE} "${CMAKE_SOURCE_DIR}/tests/perf/quick_perf.py" "CPP")
-
-add_dependencies(quick_perf_cpp reactor_send_cpp reactor-recv qpid-proton-cpp)
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/tests/tools/apps/cpp/reactor_send.cpp
----------------------------------------------------------------------
diff --git a/tests/tools/apps/cpp/reactor_send.cpp b/tests/tools/apps/cpp/reactor_send.cpp
deleted file mode 100644
index a80da6e..0000000
--- a/tests/tools/apps/cpp/reactor_send.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "options.hpp"
-
-#include "proton/binary.hpp"
-#include "proton/codec/decoder.hpp"
-#include "proton/connection.hpp"
-#include "proton/container.hpp"
-#include "proton/delivery.hpp"
-#include "proton/message.hpp"
-#include "proton/message_id.hpp"
-#include "proton/messaging_handler.hpp"
-#include "proton/receiver_options.hpp"
-#include "proton/sender.hpp"
-#include "proton/tracker.hpp"
-#include "proton/value.hpp"
-
-#include <iostream>
-#include <map>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-class reactor_send : public proton::messaging_handler {
- private:
- std::string url_;
- proton::message message_;
- std::string reply_to_;
- int sent_;
- int confirmed_;
- int total_;
- int received_;
- size_t received_bytes_;
- proton::binary received_content_;
- bool replying_;
- proton::message_id id_value_;
- public:
-
- reactor_send(const std::string &url, int c, int size, bool replying)
- : url_(url), sent_(0), confirmed_(0), total_(c),
- received_(0), received_bytes_(0), replying_(replying) {
- if (replying_)
- message_.reply_to("localhost/test");
- proton::binary content;
- content.assign((size_t) size, 'X');
- message_.body(content);
- }
-
- void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
- c.receiver_options(proton::receiver_options().credit_window(1024));
- c.open_sender(url_);
- }
-
- void on_sendable(proton::sender &sender) PN_CPP_OVERRIDE {
- while (sender.credit() && sent_ < total_) {
- id_value_ = sent_ + 1;
- message_.correlation_id(id_value_);
- message_.creation_time(proton::timestamp::now());
- sender.send(message_);
- sent_++;
- }
- }
-
- void on_tracker_accept(proton::tracker &t) PN_CPP_OVERRIDE {
- confirmed_++;
- t.settle();
- if (confirmed_ == total_) {
- std::cout << "all messages confirmed" << std::endl;
- if (!replying_)
- t.connection().close();
- }
- }
-
- void on_message(proton::delivery &d, proton::message &msg) PN_CPP_OVERRIDE {
- received_content_ = proton::get<proton::binary>(msg.body());
- received_bytes_ += received_content_.size();
- if (received_ < total_) {
- received_++;
- }
- d.settle();
- if (received_ == total_) {
- d.receiver().close();
- d.connection().close();
- }
- }
-
- void on_transport_close(proton::transport &) PN_CPP_OVERRIDE {
- sent_ = confirmed_;
- }
-};
-
-int main(int argc, char **argv) {
- // Command line options
- std::string address("127.0.0.1:5672/cpp_tests");
- int message_count = 10;
- int message_size = 100;
- bool replying = false;
- example::options opts(argc, argv);
- opts.add_value(address, 'a', "address", "connect and send to URL", "URL");
- opts.add_value(message_count, 'c', "messages", "send COUNT messages", "COUNT");
- opts.add_value(message_size, 'b', "bytes", "send binary messages BYTES long", "BYTES");
- opts.add_value(replying, 'R', "replying", "process reply messages", "REPLYING");
- try {
- opts.parse();
- reactor_send send(address, message_count, message_size, replying);
- proton::container(send).run();
- return 0;
- } catch (const example::bad_option& e) {
- std::cout << opts << std::endl << e.what() << std::endl;
- } catch (const std::exception& e) {
- std::cerr << e.what() << std::endl;
- }
- return 1;
-}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9045f759/tests/tools/apps/python/reactor-send.py
----------------------------------------------------------------------
diff --git a/tests/tools/apps/python/reactor-send.py b/tests/tools/apps/python/reactor-send.py
deleted file mode 100644
index 163015b..0000000
--- a/tests/tools/apps/python/reactor-send.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-from __future__ import print_function
-import optparse
-from proton import Message
-from proton.handlers import MessagingHandler
-from proton.reactor import Container
-
-class Send(MessagingHandler):
- def __init__(self, url, messages, size, replying):
- super(Send, self).__init__(prefetch=1024)
- self.url = url
- self.sent = 0
- self.confirmed = 0
- self.received = 0
- self.received_bytes = 0
- self.total = messages
- self.message_size = size;
- self.replying = replying;
- self.message = Message(body="X" * self.message_size)
- if replying:
- self.message.reply_to = "localhost/test"
-
- def on_start(self, event):
- event.container.sasl_enabled = False
- event.container.create_sender(self.url)
-
- def on_sendable(self, event):
- while event.sender.credit and self.sent < self.total:
- self.message.correlation_id = self.sent + 1
- event.sender.send(self.message)
- self.sent += 1
-
- def on_accepted(self, event):
- self.confirmed += 1
- if self.confirmed == self.total:
- print("all messages confirmed")
- if not self.replying:
- event.connection.close()
-
- def on_message(self, event):
- msg = event.message;
- if self.received < self.total:
- self.received += 1
- self.received_bytes += len(msg.body)
- if self.received == self.total:
- event.receiver.close()
- event.connection.close()
-
- def on_disconnected(self, event):
- self.sent = self.confirmed
-
-parser = optparse.OptionParser(usage="usage: %prog [options]",
- description="Send messages to the supplied address.")
-parser.add_option("-a", "--address", default="localhost:5672/examples",
- help="address to which messages are sent (default %default)")
-parser.add_option("-c", "--messages", type="int", default=100,
- help="number of messages to send (default %default)")
-parser.add_option("-b", "--bytes", type="int", default=100,
- help="size of each message body in bytes (default %default)")
-parser.add_option("-R", action="store_true", dest="replying", help="process reply messages")
-
-opts, args = parser.parse_args()
-
-try:
- Container(Send(opts.address, opts.messages, opts.bytes, opts.replying)).run()
-except KeyboardInterrupt: pass
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org