I recently battled this very issue.  Attached is the code for a custom join 
node that seems to work in all scenarios. (I edited out some of our specific 
code so as posted may not exactly work but you should get the gist.)


  | 
  | public class join implements ActionHandler
  | {
  |     private static final long serialVersionUID = 1L;
  |     private static final Log log = LogFactory.getLog(Join.class);
  | 
  |     public void execute(ExecutionContext executionContext)
  |     {
  |             Node ThisNode = executionContext.getNode();
  |             int tokenCount = 0;
  |             try
  |             {
  |                     tokenCount = (Integer) 
executionContext.getVariable(ThisNode.getName() + "tokenCount");
  |             }
  |             catch (Exception e)
  |             {
  |                     log.debug(e);
  |             }
  |             Token token = executionContext.getToken();
  |             if(token.isAbleToReactivateParent())
  |             {
  |                     log.debug("Set  token: "  + token.getFullName()+ " now 
unable to reactivate parent.");
  |                     token.setAbleToReactivateParent(false);
  |             }
  |             if(!token.hasEnded())
  |             {
  |                     token.end();
  |                     log.debug("Set token:" + token.getFullName()+ " now set 
to ended.");
  |             }
  |             //Sanity Check
  |             log.debug("Inbound token ended status=" + token.hasEnded());
  |             tokenCount++;
  |             
  |             int transitionCount = ThisNode.getArrivingTransitions().size();
  |             
  |             // If we have all of our tokens, then we can proceed.
  |             //But we need to see if our parent has all it needs done or not.
  |             // Decide if the parent fork is ready to go or not.
  | 
  |             ExecutionContext exitContext = 
CalculateCurrentExitContext(token);
  |             if(tokenCount >= transitionCount)
  |             {
  |                     log.debug("All tokens are here..keep going...");
  |                     ThisNode.leave(exitContext);
  |             }
  |             else
  |             {
  |                     log.debug("We received: " + token.getFullName()+ " and 
it is able to reactivate parent = " + token.isAbleToReactivateParent());
  |                     log.debug("Received: "  +  tokenCount  + " tokens out 
of: " + transitionCount + " paths.  Waiting for remaining");
  |             }
  |             executionContext.setVariable(ThisNode.getName() + "tokenCount", 
tokenCount);
  |             
executionContext.getJbpmContext().save(executionContext.getProcessInstance());
  |     }
  | 
  |     // Returns the current Execution Context to leave the current node with
  |     public ExecutionContext CalculateCurrentExitContext(Token Token)
  |     {
  |             // We need to work our way up the tree to find the lowest fork 
that all
  |             // paths are complete and use this to set our context.
  | 
  |             ExecutionContext exitContext = null;
  |             Token parentToken = Token.getParent();
  |             ExecutionContext currentContext = new ExecutionContext(Token);
  |             //      See if we have a parent token
  |             if ( parentToken != null )
  |             {
  |                     log.debug("Parent Token = "+parentToken.toString());
  |                     // See if that parent has any active children
  |                     if (!parentToken.hasActiveChildren())
  |                     {
  |                             // NO:
  |                             // Recursively call ourselves to see if the 
parent of
  |                             // the parent has active children
  |                             log.debug("No Active Children - Making 
Recursive Call");
  |                             exitContext = 
CalculateCurrentExitContext(parentToken);
  |                     }else{
  |                             // YES:
  |                             // Our parent has active children then
  |                             // our current context is this token, not the 
parent
  |                             log.debug("Active Children: 
"+parentToken.getActiveChildren().toString());
  |                             log.debug("Children - Setting to 
currentContext");
  |                             exitContext = currentContext;
  |                     }
  |             }else{
  |                     // If parentToken = null then we have no parent
  |                     exitContext = currentContext;
  |             }
  |             log.debug("Calculated Highest Possible execution context:"  + 
exitContext.toString());
  |             return exitContext;
  |     }
  | }
  | 

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3969801#3969801

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3969801
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to