+1 On 10/9/06, Bill Nagy <[EMAIL PROTECTED]> wrote:
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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- ============================ Srinath Perera: Indiana University, Bloomington http://www.cs.indiana.edu/~hperera/ http://www.bloglines.com/blog/hemapani --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
