jbpm4.4实现任务通知
成長中的丫頭
2012-07-19
当流程到达任务A(由用户B去做)时,想发送一个通知给B,告诉B有一个任务A需要完成,一般思路是?
我给任务A设置了on,但是我用taskService查询当前的任务列表,size为0,取不到任务A? 如何解决呢? |
|
boav911
2012-07-27
在任务节点上注册一个监听,监听进入节点的事件,使用event机制进行任务通知,一般思路就是这样
|
|
成長中的丫頭
2012-07-31
boav911 写道 在任务节点上注册一个监听,监听进入节点的事件,使用event机制进行任务通知,一般思路就是这样
我的原意也是这样啊,可是监听器里面得不到我要通知所需要的信息呢,比如进入的节点的任务id,任务分配给谁,这些你是怎么拿到的呢? |
|
boav911
2012-07-31
当你提交任务的时候,可以把通知的消息放入流程实例的context里,通过context获取你在监听器里得不到的东西,至于进入的节点的任务id,完全可以拿到,可以利用jbpm提供的taskService的相关查询方法,即它提供的一组Query()方法,来获取你需要的节点的任务id
|
|
成長中的丫頭
2012-08-01
boav911 写道 当你提交任务的时候,可以把通知的消息放入流程实例的context里,通过context获取你在监听器里得不到的东西,至于进入的节点的任务id,完全可以拿到,可以利用jbpm提供的taskService的相关查询方法,即它提供的一组Query()方法,来获取你需要的节点的任务id
System.out.println("进入节点:"+execution.getActivity().getName()); System.out.println("进入节点:"+execution.getActivity().getType()); System.out.println("execution.getProcessInstance().getId():"+execution.getProcessInstance().getId()); System.out.println("execution.getId():"+execution.getId()); TaskService ts=Configuration.getProcessEngine().getTaskService(); List<Task> tList=ts.createTaskQuery().executionId(execution.getId()).list(); System.out.println("tList()"+tList.size()); 上面是监听器notify方法中的内容,但是得到的tList.size()为0啊? 监听器定义如下; <task candidate-users="#{drafter}" name="拟票" g="100,70,50,30"> <on event="start"> <event-listener class="com.ies.optsd.workflow.eventListener.switchPac.DrawUpListener" /> </on> <transition to="审票" /> 打印内容 进入节点:拟票 进入节点:task execution.getProcessInstance().getId():switch.50001 execution.getId():switch.50001 tList()0 </task> |
|
boav911
2012-08-01
taskService.createTaskQuery().processInstanceId(processInstanceId).list();
你用流程实例id查询任务 |
|
成長中的丫頭
2012-08-01
boav911 写道 taskService.createTaskQuery().processInstanceId(processInstanceId).list();
你用流程实例id查询任务 不知道你试过没,难道你能取到?但是我也用实例试过啊,语句如下: public void notify(EventListenerExecution execution) throws Exception { // TODO Auto-generated method stub System.out.println("execution.getName()"+execution.getName()); System.out.println("进入节点:"+execution.getActivity().getName()); System.out.println("进入节点:"+execution.getActivity().getType()); System.out.println("execution.getProcessInstance().getId():"+execution.getProcessInstance().getId()); System.out.println("execution.getId():"+execution.getId()); TaskService ts=Configuration.getProcessEngine().getTaskService(); // List<Task> tasks=ts.createTaskQuery().list(); // // System.out.println("task.size()"+tasks.size()); // for(int i=0;i<tasks.size();i++){ // Task t=tasks.get(i); // System.out.println("getId()"); // System.out.println("getId()"+t.getId()); // System.out.println("getActivityName()"+t.getActivityName()); // } List<Task> tList=ts.createTaskQuery().executionId(execution.getId()).list(); System.out.println("tList()"+tList.size()); for(int i=0;i<tList.size();i++){ Task t=tList.get(i); System.out.println("getId()"); System.out.println("getId()"+t.getId()); System.out.println("getActivityName()"+t.getActivityName()); } tList=ts.createTaskQuery().processInstanceId(execution.getProcessInstance().getId()).list(); System.out.println("getProcessInstance tList()"+tList.size()); for(int i=0;i<tList.size();i++){ Task t=tList.get(i); System.out.println("getId()"); System.out.println("getId()"+t.getId()); System.out.println("getActivityName()"+t.getActivityName()); } } 查的结果一样啊,都是0啊,我后来是这样认为的:进入该任务节点的监听器时,任务对象还未创建,监听器执行完后,任务对象才创建出来啊。。。所以这时查询肯定查不到啊? |
|
boav911
2012-08-01
对,在任务的start事件里,task还没有创建,你可以使用一个变相的方法,为task指定一个不做任何事情的assignment-handler,在这里面肯定可以获取到task实例,然后将你的业务逻辑方到这里来实现
|
|
成長中的丫頭
2012-08-02
boav911 写道 对,在任务的start事件里,task还没有创建,你可以使用一个变相的方法,为task指定一个不做任何事情的assignment-handler,在这里面肯定可以获取到task实例,然后将你的业务逻辑方到这里来实现
用assignment-handler的话,流程定义文件必须要动吗?流程定义文件可以保持不动,动态添加一个assignment-handler吗? |
|
boav911
2012-08-02
可以动态创建assignment-handler,通过动态创建UserCodeReference对象来设置某一具体task的assignment-handler
|