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

Reply via email to