jbpm4.4官方下载中怎么得到下个任务ID

jBPM4.4:查寻任务完成过程 - 编程当前位置:& &&&jBPM4.4:查寻任务完成过程jBPM4.4:查寻任务完成过程&&网友分享于:&&浏览:606次jBPM4.4:查找任务完成过程
在jBPM中,历史的任务,通过historyService可以查询执行顺序
在/admin/blogs/739903 中,已经讲了,可以把已经结束的任务,通过查询一步步获取执行的顺序:
列出执行的过程:
List&HistoryActivityInstance& haInstance = historyService
.createHistoryActivityInstanceQuery().processInstanceId(instanceId)
.orderAsc(HistoryProcessInstanceQuery.PROPERTY_STARTTIME)
Iterator&HistoryActivityInstance& it = haInstance.iterator();
while( it.hasNext() ) {
HistoryActivityInstance ha = it.next();
system.out.println( ha.getActivityName() );
对于执行到一半的任务呢?
做了一个实验:开始一个任务,只完成中间的一半任务,通过historyService进行查询(根据ProcessInstanceId查)
结果可以一路查到当前正在Activity的任务,说明也是可以的
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有3811人阅读
工作流(4)
&& & &jbpm4中已有获取待指定用户处理的任务的方法,如下:
processEngine.getTaskService().findPersonalTasks(用户ID); //获取个人任务
processEngine.getTaskService().findGroupTasks(用户ID); //获取所在组任务
&& & &也可以自己写HQL通过hibernate来将个人任务和分组任务一起查询:
select task from org.jbpm.pvm.internal.task.TaskImpl task left join task.participations
pt where (task.assignee='用户ID' or ( task.assignee is null and pt.type = 'candidate'
and ((pt.userId='用户ID') or (pt.groupId in ('分组1','分组2','分组3')))))
其中用户ID和分组等参数可以通过?方式来传入。
&& & &然而如果系统中有多种业务用到jbpm工作流的话(比如OA中有请假、出差、公文收发等),jbpm4自带的两个方法是获取到的是所有业务的任务,而无法获得每个任务对应的是哪个业务,当然也有偏门的方法,比如通过task中的getExecutionId来判断对应的哪个业务(可以看下附加信息)。
&& & &这样任务对应的业务还是好获取到,系统中一般会将不同业务的任务设置成不同的模块,并且一般获取任务时还需要附带一些对应的业务信息,比如请假任务能看到请假人、请假天数等信息,这些信息在我们通过上面的方法中获取到的任务List中是获取不到的,我们得想办法将这些信息同任务一起展现出来。
&& & &对于这个问题我之前用了一个很别扭的方法,就是先获取到待处理的任务,然后循环去查询每个任务对应的业务信息,最后把任务和业务信息封装在一起,存入List中返回,这样每一次要经过很多的查询,性能大大下降,如果要通过条件查询或者分页等需求就又很麻烦了。
&& & &后来无意间又想到一个方法(知道用HQL查询任务的方法后),何不在这个HQL上再改一下,把业务的表也关联进来,那样不就一次查询就将任务和业务记录绑定起来了,这样通过业务信息进行条件查询、分页查询都很好解决了。
&& & &另外在最近做的一个功能中接触到了优先级这个东东,用于在任务列表中按优先级排序,jbpm4的表中本来有PRIORITY_这个字段,但我没找到合适的方法给它设值,所以我就直接将优先级直接放入业务表中了,正好这个优先级的问题也解决了。
&&&&& 由于我这项目本身用的框架没用hibernate,所以最终还是直接用SQL来获取待处理任务了,最终的SQL大致如下:
select it.*,jt.DBID_ as task_id,jt.NAME_ as task_name from itsm_task it left join
jbpm4_task jt on it.execution_id = jt.EXECUTION_ID_ left join jbpm4_participation
jp on jt.DBID_ = jp.TASK_ where it.status&3 and (jt.ASSIGNEE_ = 'admin' or
(jt.ASSIGNEE_ is null and jp.TYPE_ = 'candidate' and ((jp.USERID_ = 'admin') or
(jp.GROUPID_ in('TECH_UNCERTAIN','UNCERTAIN_EMPLOYEE','TECH_EMPLOYEE','admin')))))
group by jt.DBID_
executionService().startProcessInstanceByKey(流程KEY,业务KEY);
在启动流程时可以指定一个业务的KEY,比如:
executionService().startProcessInstanceByKey('INCIDENT','IN0001');
'INCIDENT'是流程定义的KEY,'IN0001'是业务的KEY,这样启动流程创建的Execution的ID则为'INCIDENT-IN0001',如果没有指定业务KEY,则jbpm会默认将Execution的主键(DBID_字段)作为业务KEY。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94942次
积分:1243
积分:1243
排名:千里之外
原创:30篇
评论:22条
(1)(3)(1)(1)(2)(2)(2)(1)(2)(1)(6)(2)(1)(3)(2)(3)android4.4\frameworks\base\packages\SystemUI\src\com\android\systemui\recent\RecentsActivity.java
此函数是打开最近应用点击空闲地方跳转
& & public void dismissAndGoHome() { & & & & if (mRecentsPanel != null) { & & & & & & Intent homeIntent = new Intent(Intent.ACTION_MAIN, null); & & & & & & homeIntent.addCategory(Intent.CATEGORY_HOME); & & & & & & homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK & & & & & & & & & & | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); && & & & & & & startActivityAsUser(homeIntent, new UserHandle(UserHandle.USER_CURRENT));//这里是跳转到系统最高Launch 里面 & & & & & & & & & & } & & }
//记录最近应用在这里面
android4.4\frameworks\base\packages\SystemUI\src\com\android\systemui\recent\RecentTasksLoader.java
& & & & & &protected Void doInBackground(Void... params) { & & & & & & & & // We load in two stages: first, we update progress with just the first screenful & & & & & & & & // of items. Then, we update with the rest of the items & & & & & & & & final int origPri = Process.getThreadPriority(Process.myTid()); & & & & & & & & Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); & & & & & & & & final PackageManager pm = mContext.getPackageManager(); & & & & & & & & final ActivityManager am = (ActivityManager) & & & & & & & & mContext.getSystemService(Context.ACTIVITY_SERVICE);
& & & & & & & & final List&ActivityManager.RecentTaskInfo& recentTasks = & & & & & & & & & & & & am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE); & & & & & & & & int numTasks = recentTasks.size(); & & & & & & & & ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN) & & & & & & & & & & & & .addCategory(Intent.CATEGORY_HOME).resolveActivityInfo(pm, 0);
& & & & & & & & boolean firstScreenful = & & & & & & & & ArrayList&TaskDescription& tasks = new ArrayList&TaskDescription&();
& & & & & & & & // skip the first task - assume it's either the home screen or the current activity. & & & & & & & & final int first = 0; & & & & & & & & for (int i = first, index = 0; i & numTasks && (index & MAX_TASKS); ++i) { & & & & & & & & & & if (isCancelled()) { & & & & & & & & & & & & & & & & & & & & & & } & & & & & & & & & & final ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(i);
& & & & & & & & & & Intent intent = new Intent(recentInfo.baseIntent); & & & & & & & & & & if (recentInfo.origActivity != null) { & & & & & & & & & & & & intent.setComponent(recentInfo.origActivity); & & & & & & & & & & }
& & & & & & & & & &//关键代码 & & & & & & & & & & // Don't load the current home activity. & & & & & & & & & & if (isCurrentHomeActivity(intent.getComponent(), homeInfo)) {//这里是屏蔽了系统最高launch 不记录在最近应用的栈中 & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & // Don't load ourselves & & & & & & & & & & if (intent.getComponent().getPackageName().equals(mContext.getPackageName())) { & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & TaskDescription item = createTaskDescription(recentInfo.id, & & & & & & & & & & & & & & recentInfo.persistentId, recentInfo.baseIntent, & & & & & & & & & & & & & & recentInfo.origActivity, recentInfo.description);
& & & & & & & & & & if (item != null) { & & & & & & & & & & & & while (true) { & & & & & & & & & & & & & & try { & & & & & & & & & & & & & & & & tasksWaitingForThumbnails.put(item); & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & } catch (InterruptedException e) { & & & & & & & & & & & & & & } & & & & & & & & & & & & } & & & & & & & & & & & & tasks.add(item); & & & & & & & & & & & & if (firstScreenful && tasks.size() == mNumTasksInFirstScreenful) { & & & & & & & & & & & & & & publishProgress(tasks); & & & & & & & & & & & & & & tasks = new ArrayList&TaskDescription&(); & & & & & & & & & & & & & & firstScreenful = & & & & & & & & & & & & & & // & & & & & & & & & & & & } & & & & & & & & & & & & ++ & & & & & & & & & & } & & & & & & & & }
& & & & & & & & if (!isCancelled()) { & & & & & & & & & & publishProgress(tasks); & & & & & & & & & & if (firstScreenful) { & & & & & & & & & & & & // always should publish two updates & & & & & & & & & & & & publishProgress(new ArrayList&TaskDescription&()); & & & & & & & & & & } & & & & & & & & }
& & & & & & & & while (true) { & & & & & & & & & & try { & & & & & & & & & & & & tasksWaitingForThumbnails.put(new TaskDescription()); & & & & & & & & & & & & & & & & & & & & & & } catch (InterruptedException e) { & & & & & & & & & & } & & & & & & & & }
& & & & & & & & Process.setThreadPriority(origPri); & & & & & & & & & & & & & & } & & & & }; & & & & mTaskLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); & & & & loadThumbnailsAndIconsInBackground(tasksWaitingForThumbnails); & & }JBPM4中的任务回退、补签、自由流程实现 - man1900 - ITeye技术网站
博客分类:
最近在实施政府办公项目的时候,经常有客户在问,公文的流程能否自由流转,如我在拟稿完成后,直接归档,不需要再经过核稿与审批流程。同样,我可以在任何一个任务上,直接把任务回退到以上任何一个环节,如,在审批的过程中,若不合适,可以直接回退至拟稿任务。如下图所示:
非常幸运,JBPM4也提供了给我们动态创建Transition的接口。即在当前的节点中,动态创建出当前节点所有的跳转的Transition,问题是如果你给你的活动节点创建了连接后,下一次进入该任务时,不能显示这些动态创建的连接。否则当前任务的跳转连接会越来越多。
所以对于那些在两个节点间不存在的连接,而又想实现这两个节点的跳转的话,就需要动态创建连接,然后再实现任务跳转,跳转后再进行删除连接。相当于现实中我们所说的过河拆桥模式。
有了这种思想,Jbpm实现任务回退、补签等操作都是相当容易。
动态创建:
* 动态创建连接当前任务节点至名称为destName的节点的Transition
* @param taskId 任务节点ID
* @param sourceName 源节点名称
* @param destName
目标节点名称
public void addOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){
EnvironmentFactory environmentFactory = (EnvironmentFactory) processE
Environment env=
env = environmentFactory.openEnvironment();
//取得当前流程的活动定义
ActivityImpl sourceActivity = pd.findActivity(sourceName);
//取得目标的活动定义
ActivityImpl destActivity=pd.findActivity(destName);
//为两个节点创建连接
TransitionImpl transition = sourceActivity.createOutgoingTransition();
transition.setName("to" + destName);
transition.setDestination(destActivity);
sourceActivity.addOutgoingTransition(transition);
}catch(Exception ex){
logger.error(ex.getMessage());
if(env!=null)env.close();
动态删除:
* 动态删除连接sourceName与destName的Transition
* @param taskId
* @param sourceName
* @param destName
public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){
EnvironmentFactory environmentFactory = (EnvironmentFactory) processE
Environment env=
env = environmentFactory.openEnvironment();
//取得当前流程的活动定义
ActivityImpl sourceActivity = pd.findActivity(sourceName);
//若存在这个连接,则需要把该连接删除
List&Transition& trans=sourceActivity.getOutgoingTransitions();
for(Transition tran:trans){
if(destName.equals(tran.getDestination().getName())){//删除该连接
trans.remove(tran);
}catch(Exception ex){
logger.error(ex.getMessage());
if(env!=null)env.close();
其实现效果如下所示,可以跳至任何节点,并且可以指派给任何人。
指定至相关人员:
浏览: 298445 次
来自: 广州
你好,想问下,串行的多实例任务能做到回退么
参考这个实现思路,可以弄个自定义的表单设计器http://wi ...
都进不去啊
你好,为什么使用这个方法后会在action中执行具体方法操作的 ...
在线登录是不是密码也改了 csx/111 不正确jbpm4.4之待处理任务 【转】 - nhy520 - ITeye技术网站
博客分类:
jbpm4中已有获取待指定用户处理的任务的方法,如下:
processEngine.getTaskService().findPersonalTasks(用户ID);
processEngine.getTaskService().findGroupTasks(用户ID);
也可以自己写HQL通过hibernate来将个人任务和分组任务一起查询:
org.jbpm.pvm.internal.task.TaskImpl task
task.participations
(task.assignee=
( task.assignee
'candidate'
((pt.userId=
(pt.groupId
其中用户ID和分组等参数可以通过?方式来传入。
然而如果系统中有多种业务用到jbpm工作流的话(比如OA中有请假、出差、公文收发等),jbpm4自带的两个方法是获取到的是所有业务的任务,而无
法获得每个任务对应的是哪个业务,当然也有偏门的方法,比如通过task中的getExecutionId来判断对应的哪个业务(可以看下附加信息)。
这样任务对应的业务还是好获取到,系统中一般会将不同业务的任务设置成不同的模块,并且一般获取任务时还需要附带一些对应的业务信息,比如请假任务能看
到请假人、请假天数等信息,这些信息在我们通过上面的方法中获取到的任务List中是获取不到的,我们得想办法将这些信息同任务一起展现出来。
对于这个问题我之前用了一个很别扭的方法,就是先获取到待处理的任务,然后循环去查询每个任务对应的业务信息,最后把任务和业务信息封装在一起,存入List中返回,这样每一次要经过很多的查询,性能大大下降,如果要通过条件查询或者分页等需求就又很麻烦了。
后来无意间又想到一个方法(知道用HQL查询任务的方法后),何不在这个HQL上再改一下,把业务的表也关联进来,那样不就一次查询就将任务和业务记录绑定起来了,这样通过业务信息进行条件查询、分页查询都很好解决了。
另外在最近做的一个功能中接触到了优先级这个东东,用于在任务列表中按优先级排序,jbpm4的表中本来有PRIORITY_这个字段,但我没找到合适的方法给它设值,所以我就直接将优先级直接放入业务表中了,正好这个优先级的问题也解决了。
由于我这项目本身用的框架没用hibernate,所以最终还是直接用SQL来获取待处理任务了,最终的SQL大致如下:
it.*,jt.DBID_
task_id,jt.NAME_
itsm_task it
jbpm4_task jt on
it.execution_id = jt.EXECUTION_ID_
jbpm4_participation
jt.DBID_ = jp.TASK_
it.status&3
(jt.ASSIGNEE_ =
(jt.ASSIGNEE_ is
jp.TYPE_ =
'candidate'
((jp.USERID_ =
(jp.GROUPID_ in
'TECH_UNCERTAIN'
'UNCERTAIN_EMPLOYEE'
'TECH_EMPLOYEE'
executionService().startProcessInstanceByKey(流程KEY,业务KEY);
在启动流程时可以指定一个业务的KEY,比如:
executionService().startProcessInstanceByKey('INCIDENT','IN0001');
'INCIDENT'是流程定义的KEY,'IN0001'是业务的KEY,这样启动流程创建的Execution的ID则为'INCIDENT-IN0001',如果没有指定业务KEY,则jbpm会默认将Execution的主键(DBID_字段)作为业务KEY。
浏览: 613613 次
来自: 北京
方案3亲测完全可用,顺便解决了我其他方面的一些疑问,非常感谢
Spring太强大了。
he 写道请问java用memcache主 ...
这样真的可以解决吗?为什么我使用你的代码:ImageIO.re ...}

我要回帖

更多关于 jbpm4.4入门 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信