axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bill Nagy <n...@watson.ibm.com>
Subject [Axis2] Proposal to add return type to Handler.invoke(...)
Date Tue, 10 Oct 2006 02:51:58 GMT
There is currently a race condition between code that pauses the message
flow within a handler and resumes it on another thread (e.g. Sandesha)
and the message flow processing chain (Phase.invoke(...),
AxisEngine.invoke(...), etc.)
(http://issues.apache.org/jira/browse/SANDESHA2-32)  This is caused
because the control of processing is keyed off of MessageContext.paused
and not through some other mechanism (return code, semaphore, etc.).  If
a handler pauses a message and returns, handing the message off to
another thread for execution, there is the possibility that the new
execution thread will resume processing of the message, unsetting
MessageContext.paused, before control returns to one of the invoke
methods.  If this happens, the logic in the invoke method, which looks
at the MessageContext.paused flag, will believe that it should continue
execution instead of halting.

Since the problem revolves around flow control logic, I suggest that we
use the return code from the method invocation to deal with it.  I would
like to add a return code to the Handler.invoke(...) which would
identify how processing of the message should proceed, e.g. :

/**
* This type encapsulates an enumeration of possible message processing
* instruction values that may be returned by a handler/phase within the
* runtime.
*/
public class InvocationProcessingInstruction
{
  public static InvocationProcessingInstruction CONTINUE_PROCESSING =
new InvocationProcessingInstruction(0);
  public static InvocationProcessingInstruction SUSPEND_PROCESSING = new
InvocationProcessingInstruction(1);
  public static InvocationProcessingInstruction ABORT_PROCESSING = new
InvocationProcessingInstruction(2);
  
  private int instructionID;
    
  private InvocationProcessingInstruction(int instructionID)
  {
    this.instructionID = instructionID;
  }
    
  public boolean equals(InvocationProcessingInstruction instruction)
  {
    return this.instructionID == instruction.instructionID;
  }
    
  public int hashCode()
  {
    return instructionID;
  }
}

Most handlers will return
InvocationProcessingInstruction.CONTINUE_PROCESSING; the RM handler may
return that, SUSPEND_PROCESSING (for a pause), or ABORT_PROCESSING (for
a duplicate msg.)

Comments?

-Bill



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


Mime
View raw message