Ok, the initial interfaces and base implementation of the new Axis
Internal Message Exchange interfaces have been checked in and are ready
for review. Over time (following the phased plan I posted previously),
Transport, Provider, and AxisEngine impl's will all change from being
Handlers to being MessageExchangeProviders (impl's of the abstract class
org.apache.axis.ime.internal.MessageExchangeProvider).
The MessageExchangeProvider based class handles all of the basic thread
and lifecycle management, and invocation of request/response (called
send/receive) handlers. The MessageExchangeProvider is capable of
Send-Only, Send-and-Receive and Receive-Only message exchanges. Impl's of
the base class need only to provide 4 pieces of information to the
MessageExchangeProvider to function:
1. The Send (Request) handler
2. The Receive (Response) handler
3. The MessageExchangeSendListener ==> the class that tells the
threads monitoring outbound (send) message flow how to process messages.
For example, in a JMS Transport, the MessageExchangeSendListener impl
would be responsible for putting messages onto the JMS Queue's or Topics.
4. The ReceivedMessageDispatchPolicy ==> the class that tells the
threads monitoring inbound (receive) message flow how to dispatch messages
to waiting consumers. For example, if using the
FirstComeFirstServeDispatchPolicy provided in the code, if two application
threads call the MessageExchange.receive operation, both passing in the
same MessageExchangeCorrelator, the thread whose request is received first
will get the received message. The thread whose request is received
second will be queued until another matching message is received.
ReceiveMessageDispatchPolicy is designed to be a pluggable and extensible
mechanism to allow implementations of MessageExchangeProvider to customize
how messages are dispatched.
See org.apache.axis.ime.internal.util.handler.HandlerMessageExchange to
see an example of a MessageExchangeProvider implementation. This one
wraps the async MessageExchange interfaces around the synchronous handler
interface. All MessageExchangeProvider implementations will follow this
same basic pattern.
One very important thing to note. MessageExchange interface
implementations ARE NOT REQUIRED to use the base implementation provided
by the MessageExchangeProvider class. Nor are they required to use ANY of
the utility classes located in and under the org.apache.axis.ime.internal
package. In cases where a MessageExchange implementation requires unique
thread management, handler flow control, etc, implementations can build
new MessageExchange implementations from the ground up. The
org.apache.axis.ime.internal package is provided to make things easier for
implementors who do not have special requirements.
I have little doubt that the org.apache.axis.ime.internal base impl is
going to need a bit of tweaking as we begin to migrate the various
subsystems within Axis over to the new interfaces. These tweaks are only
going to become apparent as we start the migration. As according to the
development plan I posted previously, we'll start migrating the client
side transports first. The goal is to get the transports completely over
to the new model without breaking any of the existing tests or affecting
any other part of Axis.
As usual, feel free to start complaining/sending praise about this effort
:-)
- James Snell
IBM Emerging Technologies
[EMAIL PROTECTED]
(559) 587-1233 (office)
(700) 544-9035 (t/l)
Programming Web Services With SOAP
O'Reilly & Associates, ISBN 0596000952
Have I not commanded you? Be strong and courageous.
Do not be terrified, do not be discouraged, for the Lord your
God will be with you whereever you go. - Joshua 1:9