Qpid Network Layer Update 2010Page edited by Andrew KennedyChanges (2)
Full ContentIntroductionThis page covers analysis and design work for the work to refactor and improve the network layer code of the Qpid Java client and broker. The purpos this is to rationalise the network layer interfaces across all AMQP protocol versions, all network transport types and to allow the same network code to be used in both the client and the broker if required. Additionally, it allows for future changes to the network code in a manner that is independent of the protocols or transports. Further improvements to the broker have also be included in the scope of this work, including making the ApplicationRegistry object a singleton, and collecting broker startup code in a single class to allow various use cases, such as OSGi modularisation or system testing to be simplified. On the client side, 0-10 VM protocol support is added, as well as better failover and exception handling in the 0-10 code paths. In general, the coupling between different parts of the system is reduced and the responsibilities of individual classes are reduced and better defined. Test coverage is also improved across all supported AMQP protocols, and many test cases that are currently failing under 0-10 are fixed. A Presentation is available describing the status as of September 2010, when the bulk of this work was initiated and carried out. More recently, in February 2011 the code has been revisited and merged with the trunk in preparation for being committed as part of the 0.11 development stream and with the intention of the inclusion in the 0.12 release.. Original Transport Code0-8 and 0-9 Client
0-10 Client
Broker
DesignNew set of interfaces to define a 0-10 (and maybe 1-0 too) transport interface. Note that this means MINA, Grizzly, NII etc. rather than TCP/IP, UDP, Unix Sockets, Pipes or whatever. It should be possible to have different underlying transport mechanism, however, so when MINA is specified, we can further implement the Socket, VmPipe etc. connectors.
Classes and Interfaces
The intention of the work is to simplify the interface hierarchy, and in particular get rid of situations such as the ProtocolEngine_0_10 interface, where A implements B which extends C, and also A extends B' which implements C, this being rather redundant. Additional issues with interfaces include duplicate method declarations, where a method is defined in interface A, B extends A but still declares the same method. These should be removed where possible. Ideally, ProtocolEngine will be replaced by Receiver<ByteBuffer> everywhere, and the extra methods moved to a transport layer interface. I came across the following snippet in AMQConnectionDelegate_8_0#makeBrokerConnection() and wondered what the UseTransportIo property was for: // TODO: use system property thingy for this if (System.getProperty("UseTransportIo", "false").equals("false")) { TransportConnection.getInstance(brokerDetail).connect(_conn._protocolHandler, brokerDetail); } else { _conn.getProtocolHandler().createIoTransportSession(brokerDetail); }
Test ProfilesTest profiles are created by adding a file named profile.testprofile to the qpid/java/test-profiles directory. This file is parsed as a series of properties, adding to and overriding any set in the default.testprofile file. The default test profile has now been deprecated, in favour of using this file as simply a repository for the default values for test properties.
Network Layer ResponsibilitiesThe responsibilities for the network layer are split between four classes, which are described below, along with the interfaces (if any) they must implement. NetworkTransport, IncomingNetworkTransport and OutgoingNetworkTransportThis class represents the network transport mechanism and is used to make or receive connections using that mechanism. It will create NetworkConnection objects that represent an active connection using this mechanism.
NetworkConnectionThis is a representation of a network connection, and is responsible for creating the Sender<ByteBuffer> implementation specific to the particular network transport. It may also be responsible for the creation of the receiver or network handler, or this may be left as the reposnsibility of the connect method of the NetworkConnection in circumstances where both objects must be created at the same time. It is, however, always responsible for closing both the sender and receiver when it is closed.
Sender<ByteBuffer>This class sends bytes to the network interface. Network HandlerThis class receives bytes from the network interface and passes them on to a Receiver<ByteBuffer implementation that can handle and decode them. Also responsible for closing down the receiver when the underlying network interface is closed, or signalling an exception to the receiver when an error occurs. WorkflowRationalise 0-10 Transport InterfaceQPID-2811 0.11 In Progress Create or modify current transport mechanism classes and interfaces to make them more generic and allow for other mechanisms and protocols to be added in a modular way. Update 0-10 connection configuration mechanism and propertiesQPID-2812 0.11 In Progress Update the 0-10 connection settings and system properties to rationalise the configuration of the connection mechanism/transport/protocol. This may depend on how different transport mechanisms are loaded, e.g. if we use OSGi plugins or not. It would be nice to make things consistent across all protocols, so that broker addressing does not change. Note that some transports may not support all types of broker addressing,and this has to fail gracefully. This will also include removal of some classes and options, such as the IoTransport configuration property. This property is present as an apparently untested 0-9 protocol only option, and uses an entirely new mechanism to connect the transport layer to the MINA mechanism. Since the intent of the preceding JIRA is to harmonise the transport layer interfaces between protocols, I believe this is an unnecessary complication. Update current 0-10 socket connection to conform to new mechanismQPID-2813 0.11 In Progress Make any additional changes to the existing transport to allow it to conform fully to the changes made in QPID-2811 and QPID-2812 Create TCP based 0-10 MINA transportQPID-2816 0.11 In Progress Create a 0-10 MINA transport that implements the tcp:// protocol for broker communication Create MINA InVM 0-10 TransportQPID-2814 0.11 In Progress Create a MINA transport that implements the vm:// VmPipe protocol, to allow for in-vm communication with the 0-10 protocol Make InVM broker startup protocol independentQPID-2815 0.11 In Progress Update the way the in-vm broker is started to decouple it from any particular protocol version Make Transport mechanisms into OSGi pluginsQPID-2818 TODO Make the transport mechanism pluggable using OSGi on both the broker and the client Add additional pluggable transport mechanismsQPID-2819 TODO Add additional transport mechanisms such as Netty or Grizzly Make ApplicationRegistry a SingletonQPID-3026 0.11 In Progress There can only be a singlr instance of the ApplicationRegistry in a particular JVM
Change Notification Preferences
View Online
|
View Changes
|
Add Comment
|
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
- [CONF] Apache Qpid > Qpid Network Layer Update 2010 confluence
