[jboss-user] [jBPM Users] - Exeception Handeling problem in JBPM

prajatna do-not-reply at jboss.com
Wed Sep 16 04:16:55 EDT 2009


Hi All,
In my JBPM approval process, I have a requirement that, if at any point of time JBPM exception happens during the process work flow., the control should delegate to a separate TaskNode called Admin node, and the normal process flow should stop. Inside Admin node the admin user decides , from which task node now the process should continue, and accordingly the flow continues

Taking into consideration this requirement I designed a admin node and a exception handler as follows..

  | <task-node name="Moduladministrator">
  | 		<task name="AdministratorInteraction" description="Moduladministrator-Interaction">
  | 			<assignment class="com.sample.action.AssignAdminAction"></assignment>
  | 		</task>
  | 	</task-node>
  | <exception-handler>
  | 		<action name="TravelExceptionHandler" class="com.sample.action.TravelExecptionHandler" ></action>
  | 	</exception-handler>
  | 
  | 
The Exception action handler is ass follows , which transfer the flow to Admin node and creates the Taskinstance at Admin node

  | public class TravelExecptionHandler implements ActionHandler {
  | 
  |     private static Log log = LogFactory.getLog(TravelExecptionHandler.class);
  |     private static final long serialVersionUID = 1L;
  | 
  |     public void execute(ExecutionContext executionContext) throws Exception {
  | 
  |         log.debug("####################  ERROR HANDELING ##################");
  |         log.debug("========================================================");
  |         log.debug("####################  ERROR HANDELING ##################");
  |         try {
  |             
  |             
  |             log.debug("Error comes from --" + executionContext.getNode().getName());
  |             log.debug("Error is -- -- --" + executionContext.getException().getMessage());
  | 
  |             Node targetNode = executionContext.getProcessDefinition().findNode("Moduladministrator");
  |             log.debug("Admin node is--" + targetNode.getName());
  | 
  |             TaskInstance faultyTaskInstance = executionContext.getTaskInstance();
  | 
  |             if (faultyTaskInstance != null) {
  |                 faultyTaskInstance.setEnd(new Date());
  |             }
  |             TaskNode targetTaskNode = (TaskNode) targetNode;
  |             targetTaskNode.enter(executionContext);
  |             TaskMgmtInstance taskManagementInstance = executionContext.getTaskMgmtInstance();
  | 
  |             taskManagementInstance.getTaskMgmtDefinition().setStartTask((Task) targetTaskNode.getTasks().iterator().next());
  | 
  |             log.info("Now Controll is with " + targetTaskNode.getName() + " node");   
  |             
  | 
  |         } catch (Exception e) {
  |             log.debug("Error---" + e.getCause());
  |             e.printStackTrace();
  |         }
  | 
  |     }
  | }
  | 
This above code part is working find with creating the taskinstance at admin task node.
Now after the task is assigned to a admin user, the admin take decision from which task node the process should start, again.

The code i am using to delegate the flow from admin node to any desired task node is-- 

  |  String faultNode = (String) contextInstance.getVariable("ErrorOriginatingNode");
  |                 Node faultyNode = processInstance.getProcessDefinition().findNode(faultNode);
  |                 Collection col = processInstance.getTaskMgmtInstance().getTaskInstances();
  |                 int cnt = 0;
  |                 ArrayList arrayLst = new ArrayList(col);
  |                 log.debug("Total task is- " + arrayLst.size());
  | 
  |                 for (int i = 0; i < arrayLst.size(); i++) {
  |                     TaskInstance taskInstance = (TaskInstance) arrayLst.get(i);
  |                     log.debug("-----TaskName = " + taskInstance.getName() + "----TaskId = " + taskInstance.getId()
  |                             + "----Is task active-- " + !taskInstance.hasEnded());
  |                     if (!taskInstance.getName().equalsIgnoreCase("AdministratorInteraction") && !taskInstance.hasEnded()) {
  | 
  |                         log.debug("-----Task = " + taskInstance.getName() + " is ending ");
  |                         taskInstance.setEnd(new Date());
  |                         cnt++;
  |                     }
  |                 }
  |                 log.debug("Total "+cnt+"tasks got ended");
  |                 List nodes = processInstance.getProcessDefinition().getNodes();
  |                 for (int i = 0; i < nodes.size(); i++) {
  |                     Node tempNode = (Node) nodes.get(i);
  |                     if(tempNode instanceof TaskNode)
  |                          log.debug("TaskNode " + i + "---" + tempNode.getName());
  |                 }
  |                 log.info("Error Occurred in work flow.Entering Admin Node -- -- --");
  |                 log.info("*********Please provide any of the above Node you want to proceed with**************");
  | 
  |                 String node = conInput.getConsoleInput();
  |                 log.debug("Selected for TaskNode--" + node);
  |                 TaskNode targetNode = (TaskNode)processInstance.getProcessDefinition().findNode(node);
  |                 Transition errorTransition = new Transition("to" + targetNode.getName());
  | 
  |                 targetNode.addArrivingTransition(errorTransition);
  |                 faultyNode.addLeavingTransition(errorTransition);
  |                 
  |                 errorTransition.setTo(targetNode);
  |                 TaskMgmtInstance taskManagementInstance = processInstance.getTaskMgmtInstance();
  |                 taskManagementInstance.getTaskMgmtDefinition().setStartTask((Task) targetNode.getTasks().iterator().next());
  | 
  |                 adminTaskInstance.end(errorTransition);
  | 
  |                 
Unfortunately, I am not able to achieve my requirement. The problem I am facing is even the control is delegating to admin node, still the process continues to move forward with the selected transition from the node where exception occurs..

So basically , I am not able to stop and resume the work flow from a desired Tasknode, as a admin.

Please suggest how to achieve this ..

As per the JBPM document 10.7. Exception handling 
anonymous wrote : 
  | Note that the exception handling mechanism of jBPM is not completely similar to the java exception handling. In
  | java, a caught exception can have an influence on the control flow. In the case of jBPM, control flow cannot be
  | changed by the jBPM exception handling mechanism.

So then , how to achieve my requirement ..Any work around is there?


Please suggest..

Thanks in advance for your valuable reply..

Prajatna Mahunta
prajatna.mahunta at daimler.com


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

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4255458



More information about the jboss-user mailing list