-
1. Re: how to implement co-sign a task by several person?
kukeltje Dec 3, 2008 4:55 AM (in response to aspider)By modelling that in your process. e.g. Make two parallel tasks, where a variable is set when one approves or disapproves and use that value somewhere in a decisionhandler and go either back to the initial tasks (e.g. if the co-signer disapproves) or continue the process if both approve.
Be a little creative... lots of things are possible -
2. Re: how to implement co-sign a task by several person?
aspider Dec 3, 2008 4:58 AM (in response to aspider)can you give a example?
-
3. Re: how to implement co-sign a task by several person?
pojomonkey Dec 3, 2008 6:01 AM (in response to aspider)I have an entity in my system that relates the the active process. As part of that entity, I can store a list of actors.
In a scenario where I have multiple approvers I simply keep track of who has approved, and don't leave the node until all approvers have approved.
Just one example of the creativity kukeltje mentioned. lol -
4. Re: how to implement co-sign a task by several person?
salaboy21 Dec 3, 2008 6:36 AM (in response to aspider)Yes, also you can create a task-node that contains multiple tasks for approval And make this taks-node wait for all the task complete to signal the process.
Also you can create a fork/join situation giving more flexibility! -
5. Re: how to implement co-sign a task by several person?
aspider Dec 3, 2008 8:25 PM (in response to aspider)I have made a example.
Process Definition like this, i want to co-sign in 'approval' task node. And define 2 action in it.
The dynamic task creation is ok, but sth wrong with CosignTaskEndHandler
could you give advice?
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="simple">
<start-state name="start">
</start-state>
<task-node name="create">
</task-node>
<task-node name="approval" create-tasks="false" signal="last-wait">
</task-node>
About to finish!
<end-state name="end"></end-state>
</process-definition>
CosignActionHandler.java
public class CosignActionHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(CosignActionHandler.class);
public void execute(ExecutionContext context) throws Exception {
List approveNameList = (List)context.getVariable("approvedName");
log.info(approveNameList.size());
Token token = context.getToken();
TaskMgmtInstance tmi = context.getTaskMgmtInstance();
TaskNode taskNode = (TaskNode) context.getNode();
Task task = taskNode.getTask("approvalTask");
for(int i=0; i<approveNameList.size(); i++){
String appName = (String)approveNameList.get(i);
tmi.createTaskInstance(task, token).setActorId(appName);
log.info("appName:" + appName +" task created");
}
}
}
CosignTaskEndHandler.java
public class CosignTaskEndHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(CosignTaskEndHandler.class);
public void execute(ExecutionContext context) throws Exception {
boolean isDisapprove = true;
log.info("isDisapprove:"+isDisapprove);
if (isDisapprove) {
TaskMgmtInstance tmi = context.getTaskMgmtInstance();
TaskInstance ti = context.getTaskInstance();
final String actorId = ti.getActorId();
Collection c = tmi.getSignallingTasks(context);
for (Iterator it = c.iterator(); it.hasNext();) {
TaskInstance task = (TaskInstance) it.next();
if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {
task.end("write");
}
}
}
}
} -
6. Re: how to implement co-sign a task by several person?
aspider Dec 3, 2008 8:32 PM (in response to aspider)sorry, the example as below.
to make the code clear for you , i post it again.
please help me to have a look, whats the problem.
especially in CosignTaskEndHandler.
Thanks a lot!<?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="simple"> <start-state name="start"> <transition to="create"> </transition> </start-state> <task-node name="create"> <task name="createTask"> <controller> <variable name="approvedName"></variable> </controller> <assignment class="com.sample.assignment.DealAssignment"> </assignment> </task> <transition to="message"></transition> </task-node> <state name="message"> <transition to="approval"></transition> </state> <task-node name="approval" create-tasks="false" signal="last-wait"> <event type="node-enter"> <action name="approvalAction" class="com.sample.action.CosignActionHandler"> </action> </event> <event type="task-end"> <action class="com.sample.action.CosignTaskEndHandler"> </action> </event> <task name="approvalTask"> </task> <transition to="write"></transition> </task-node> <node name="write"> <action name="action" class="com.sample.action.MessageActionHandler"> <message>About to finish!</message> </action> <transition to="end"></transition> </node> <end-state name="end"></end-state> </process-definition>
CosignActionHandler.javapublic class CosignActionHandler implements ActionHandler { private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(CosignActionHandler.class); public void execute(ExecutionContext context) throws Exception { List approveNameList = (List)context.getVariable("approvedName"); log.info(approveNameList.size()); Token token = context.getToken(); TaskMgmtInstance tmi = context.getTaskMgmtInstance(); TaskNode taskNode = (TaskNode) context.getNode(); Task task = taskNode.getTask("approvalTask"); for(int i=0; i<approveNameList.size(); i++){ String appName = (String)approveNameList.get(i); tmi.createTaskInstance(task, token).setActorId(appName); log.info("appName:" + appName +" task created"); } } }
CosignTaskEndHandler.javapublic class CosignTaskEndHandler implements ActionHandler { private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(CosignTaskEndHandler.class); public void execute(ExecutionContext context) throws Exception { boolean isDisapprove = true; log.info("isDisapprove:"+isDisapprove); if (isDisapprove) { TaskMgmtInstance tmi = context.getTaskMgmtInstance(); TaskInstance ti = context.getTaskInstance(); final String actorId = ti.getActorId(); Collection c = tmi.getSignallingTasks(context); for (Iterator it = c.iterator(); it.hasNext();) { TaskInstance task = (TaskInstance) it.next(); if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) { task.end("write"); } } } } }
-
7. Re: how to implement co-sign a task by several person?
aspider Dec 4, 2008 4:35 AM (in response to aspider)Based on codes mentioned above, i have been confused by this problem for several days, who can tell me how to write 'task-end' action.
Test the process, i always get this error:org.jbpm.JbpmException: this token is locked by token[0] at org.jbpm.graph.exe.Token.signal(Token.java:182) at org.jbpm.graph.exe.Token.signal(Token.java:140) at org.jbpm.taskmgmt.exe.TaskInstance.end(TaskInstance.java:479) at org.jbpm.taskmgmt.exe.TaskInstance.end(TaskInstance.java:393) at com.sample.action.CosignTaskEndHandler.execute(CosignTaskEndHandler.java:37) at org.jbpm.graph.def.Action.execute(Action.java:122) at org.jbpm.graph.def.GraphElement.executeAction(GraphElement.java:259) at org.jbpm.graph.def.GraphElement.executeActions(GraphElement.java:215) at org.jbpm.graph.def.GraphElement.fireAndPropagateEvent(GraphElement.java:185) at org.jbpm.graph.def.GraphElement.fireAndPropagateEvent(GraphElement.java:198) at org.jbpm.graph.def.GraphElement.fireEvent(GraphElement.java:169) at org.jbpm.taskmgmt.exe.TaskInstance.end(TaskInstance.java:452) at org.jbpm.taskmgmt.exe.TaskInstance.end(TaskInstance.java:393) at com.sample.action.CosignTaskEndHandler.execute(CosignTaskEndHandler.java:37) at org.jbpm.graph.def.Action.execute(Action.java:122) at org.jbpm.graph.def.GraphElement.executeAction(GraphElement.java:259) at org.jbpm.graph.def.GraphElement.executeActions(GraphElement.java:215) at org.jbpm.graph.def.GraphElement.fireAndPropagateEvent(GraphElement.java:185) at org.jbpm.graph.def.GraphElement.fireAndPropagateEvent(GraphElement.java:198) at org.jbpm.graph.def.GraphElement.fireEvent(GraphElement.java:169) at org.jbpm.taskmgmt.exe.TaskInstance.end(TaskInstance.java:452) at org.jbpm.taskmgmt.exe.TaskInstance.end(TaskInstance.java:393) at com.sample.SimpleProcessTest.testSimpleProcess(SimpleProcessTest.java:59) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
-
8. Re: how to implement co-sign a task by several person?
aspider Dec 11, 2008 1:07 AM (in response to aspider)i am confused about this problem for 1 week.
I can create several tasks in a task node,
if one task is denied, quit the task node, no matter other task result.
How can it implement?
I add this in task-node,<event type="task-end"> <action class="com.sample.action.CosignTaskEndHandler"> </action> </event>
but awlays get a error like this:
org.jbpm.JbpmException: this token is locked by token[0]
Can anyone help me?? -
9. Re: how to implement co-sign a task by several person?
kukeltje Dec 11, 2008 8:47 AM (in response to aspider)Can you make a unit test with these actionhandlers embedded as innerclasses and the processdefinition embedded as a string? Fill some variables as well. Then I can check what happens
-
10. Re: how to implement co-sign a task by several person?
aspider Dec 11, 2008 10:43 PM (in response to aspider)problem resolved.
I just added the red code, the process runs.public class CosignTaskEndHandler implements ActionHandler { private static final long serialVersionUID = 1L; private static final Log log = LogFactory .getLog(CosignTaskEndHandler.class); /** * all approvers must agree, otherwise end */ public void execute(ExecutionContext context) throws Exception { Boolean isDisapprove = (Boolean) context.getTaskInstance().getVariable( "isDisapprove"); log.info("isDisapprove:" + isDisapprove); Token token = context.getToken(); TaskMgmtInstance tmi = context.getTaskMgmtInstance(); Collection<TaskInstance> unfinishedTasks = tmi .getSignallingTasks(context); if (isDisapprove != null) { if (isDisapprove == true) { for (TaskInstance unfinishedTaskInstance : unfinishedTasks) { if (!unfinishedTaskInstance.hasEnded()) { log.info(unfinishedTaskInstance.getActorId()); unfinishedTaskInstance.setSignalling(false); unfinishedTaskInstance.end(); } } } } } }
-
11. Re: how to implement co-sign a task by several person?
kukeltje Dec 12, 2008 9:00 AM (in response to aspider)Yep... that sounds really plausible... sorry I did not come up with this solution.
Would be nice if you could make a small wiki page with this example in it...