This goes e.g. for the handling of exceptions, as described here, where an automatic retry is accomplished by adding a transition dynamically from a node in which an exception occurs to itself. You probably don't want to add such 'self-transitions' at design time (that's just butt-ugly).
When you add such a path, it may include a TaskNode at some point. It did for me, and this is how I solved that.
The following code needs to run inside a jBPM context (obviously):
private void createDynamicTaskNode(ProcessInstance procInst, Node originatingNode, Node targetNode) { // Add the dynamic task node. // - Create the task. Task task = new Task("Dynamic task name"); task.setProcessDefinition(procInst.getProcessDefinition()); procInst.getTaskMgmtInstance().getTaskMgmtDefinition().addTask(task); task.setPooledActorsExpression("Dynamic task executors"); // Or use an actor ID. // - Create the node. TaskNode taskNode = new TaskNode("Dynamic task node name"); taskNode.addTask(task); // Adds both ends of the association TaskNode <-> Task. procInst.getProcessDefinition().addNode(taskNode); // Adds both ends of the association ProcessDefinition <-> Node. // Create transition between originating node and dynamic task node. Transition transition = new Transition("Transition to dynamic task node"); originatingNode.addLeavingTransition(transition); taskNode.addArrivingTransition(transition); // Create transition between dynamic task node and target node. transition = new Transition(); taskNode.addLeavingTransition(transition); targetNode.addArrivingTransition(transition); }
Basically it follows the same scenario for creating the node and transitions as jBPM does when it parses the JPDL process definition, using a lot of the defaults involved (such as that the task is blocking and ending it will signal the process instance to continue).
If you needs any of the non-standard options, you may want to read the manual to see what these options can bring you.
Cool!!
ReplyDelete