Apologies for the wrong subject prefix.
On Sun, 27 Feb 2005 17:05:31 -0500, Shawn Dahlen <[EMAIL PROTECTED]> wrote:
> Axis 2 Developers -
>
> I have spent the last month and a half lurking on the mailing list and
> perusing the code base for Axis 2. I recently posted a few comments
> in the "Dig Into Axis 2" thread, and I would like to expand upon some
> ideas in this email. In particular, I have a great interest in the
> creation of a web services framework that supports a low-level
> messaging model, and I have been looking at the Axis 2 project as the
> deliverer for this. In the rest of this email, I will present my
> areas of interest within the Axis 2 project, and some concepts that I
> have been brainstorming regarding the code base. Feedback is most
> welcomed by the developer community, and if the comments are favorable
> I would be happy to participate in the implementation. At the very
> least, I imagine that my concepts could provide a healthy debate
> leading towards a better product in the long-term.
>
> It is clear that the Axis developer community supports the notion that
> asynchronous messaging has vaulted to forefront of web services
> architecture. I believe I am correct in assuming that Axis 2 aims to
> be a web services framework supporting the asynchronous exchange of
> SOAP messages in which these messages may be combined into a variety
> of exchange patterns (some of which may be defined by a service
> description language such as WSDL). In addition to supporting the
> exchange of messages, Axis also offers a "Pipes and Filter"
> architecture implemented as the Axis Engine defining a configurable
> set of SOAP intermediaries (WS-RM, WS-Security, etc) for a specified
> endpoint.
>
> It is my intent to see that Axis 2 provides a simple and elegant
> programming model that may be leveraged by IT applications and systems
> requiring integration following service-oriented principles.
>
> It is my belief that Axis should support two programming models based
> off of the W3C Web Services Architecture Note. The first model should
> be a low-level messaging model solely focused on asynchronously
> sending or receiving a SOAP message. This model should make no
> assumptions regarding a particular topology (i.e. it should support
> peer-to-peer and a client/server). From my perspective, when systems
> integrate through messaging, they act as peers, switching between the
> roles of a producer and a consumer. With the creation of such a
> model, all other MEPs may be constructed on top of it. As such, I
> humbly request the introduction of a "messaging" package that would
> contain a "MessageProducer", a "MessageEndpoint", the SOAP envelope
> classes, and potentially the WS-Addressing implementation (since web
> service messaging is dependent on it). In addition to these low-level
> classes, another class, "MessageClient" may be introduced representing
> the interface currently adorning the Call class (built leveraging the
> MessageProducer and MessageEndpoint classes). This package should
> replace the current "clientapi" package that is closely tied to a
> client/server topology. A fine example of this low-level messaging
> approach has been implemented in Microsoft's WSE 2.0.
>
> The "MessageProducer" class would support a single operation, send(),
> that would accept a SOAP message and send it one way to a given
> EndpointReference (traversing through the engine pipeline first).
>
> The "MessageEndpoint" class would extend the "Endpoint" class (which I
> will discuss more about briefly), and provide a single operation
> called receive(), accepting a SOAP message. The application that
> creates such an endpoint must associate a URI and register it with the
> Axis framework so it in turn may listen on the appropriate port (for a
> given transport protocol).
>
> The "MessageClient" class extends "MessageProducer" offering a set of
> methods that capture basic MEPs. Its implementation is
> straightforward, leveraging the lower-level messaging model. I have
> provided some pseudo-code below implementing sendReceiveAsync() using
> an asynchronous transport:
>
> public class MessageClient extends MessageProducer
> {
> public void sendReceiveAsync(SOAPEnvelope env, Callback callback) {
> final long messageID = System.currentTimeMillis();
> final Correlator correlator = Correlator.getInstance();
>
> // this is only required if the transport is not bi-directional otherwise
> // we can listen on the 'back channel'; as such the replyTo header should
> // be set to anonymous --> use invoker to wait for results (note:
> not shown belown)
>
> // creates anonymous listener endpoint
> MessageEndpoint endpoint = new MessageEndpoint() {
> public void receive(SOAPEnvelope env) {
> RelatesTo relatesTo = env.getAddressingHeaders().getRelatesTo();
> Callback callback =
> correlator.getCorrelationInfo(relatesTo.getAddress(\
> ));
>
> AsyncResult result = new AsyncResult();
> result.setResult(env);
> callback.setComplete(true);
> callback.setResult(result);
> callback.doComplete();
>
> EndpointRegistry.remove(env.getAddressHeaders().getTo().getAddress());
> }
> };
>
> // registers endpoint listener
> // please note that the EndpointRegistry is a concept and could be
> implemented in the
> // Axis Engine itself
> EndpointReference replyTo = getAddressingHeaders().getReplyTo();
> EndpointRegistry.add(replyTo.getAddress(), endpoint);
>
> // add correlation info
> correlator.setCorrelationInfo(messageID, callback);
>
> send(env);
> }
>
> With the axis engine core, the object model, and the messaging package
> (along with some transport implementations), I could create a web
> services messaging system where each application embeds Axis for its
> SOAP communication stack for integration purposes.
>
> Once the messaging model has been established, we can introduce a
> higher-level service model. A service endpoint is self-describing
> (using a service description language such as WSDL or perhaps Savis'
> SSDL). It acts upon a set of actions (described within a message),
> and may return a result. As such, it differs from a message endpoint
> because it may have both a request and response channel (handler
> flow). However, this request/response viewpoint is purely artificial,
> and in fact may be built using the in-channel of an "endpoint" and the
> out-channel of a message producer.
>
> The service programming model should allow for the following features:
> - code generation of interface and messages through a service
> description (WSDL, SSDL)
> - provide an *event-driven* and/or blocking interface (i think this is BIG :)
> )
> - provide wrapped or unwrapped method signatures
> - support annontations to specify modules and runtime behavior
> (override in config files; this should be offered in generic message
> endpoints as well)
> - support pluggable OX binding technologies
>
> Instead of the current "Dispatcher", I recommend that we introduce a
> "EndpointRouter". This handler would be responsible for locating an
> "Endpoint" implementation based in the wsa:To property, adding its
> specific phases to the chain, as well as the implementation class.
>
> An "Endpoint" is a simple maker interface that extends Handler. There
> exists two types of endpoints, a "MessageEndpoint" and a
> "ServiceEndpoint", supporting both programming models. The
> "MessageEndpoint" provides an abstract receive() method that
> individuals can override if they want a low-level messaging solution.
> This low-level solution offers no support for action dispatching based
> on wsa:Action, therefore a switch statement might be needed. The
> "ServiceEndpoint" on the otherhand is represented by a service
> description document (WSDL or SSDL), and offers action dispatching to
> a particular method call. The "ServiceEndpoint" would enlist the help
> of a "Provider" implementation to actually invoke a piece of logic.
> If a response is required, the "ServiceEndpoint" would use a
> "MessageProducer" to send the message to the appropriate party.
>
> In the end, an endpoint consume messages, and a producer sends
> messages. We can build all of the MEPs on top of those two concepts.
>
> I apologize for the long-winded email. My intent was to introduce
> some of my brainstorming with regards to the two programming models,
> and elicit some feedback. I will start implementing the low-level
> messaging model (since a line of code is worth a thousand words), and
> would love to work in collaboration with all of you, if you find my
> comments favorable. I will be attending the ServerSide Symposium this
> week, and if any of you will be attending let me know.
>
> Thank you for your time,
>
> Shawn Dahlen
>