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
Global site tag (gtag.js) - Google Analytics