开源工作流引擎Shark入门4——任务的分配

时间:2022-04-29 13:38:56
    这第三篇的demo中,所有的任务都是分配给一个人的,这显然不太实用。Shark是如何进行任务分配的呢?Shark本身有4种任务分配方式:
  • 标准方式(Standard):任务分配给参与者映射所对应的用户,如果没有,则分配给创建流程的用户。
  • 历史相关方式(History Related):根据分配的历史来决定任务分配给谁。
  • 直接使用XPDL定义的用户方式(XPDL Straight):任务分配给用户名与XPDL中定义的参与者id一样的用户
  • 工作负担相关方式(Workload Related):分配任务时考虑用户的工作负担。仅用于专业版。
    在应用的conf/Shark.conf中定义了任务分配的方式,默认的是:
    AssignmentManagerClassName=org.enhydra.shark.assignment.StandardAssignmentManager
    这也就是我们做的demo为什么任务只分配给一个人的原因。
    我们可以试试用XPDL定义的参与者id来承担任务的方式。可以用JaWE编辑mydemo.xpdl,把参与者的类型改为Human,然后放到应用的对应目录下。用模拟器建立2个用户employee、manager,把类AskForLeave中的employeeName、managerName改为employee、manager,密码也对应修改。在conf/Shark.conf中,注释掉AssignmentManagerClassName=org.enhydra.shark.assignment.StandardAssignmentManager,把AssignmentManagerClassName=org.enhydra.shark.assignment.XPDLStraightParticipantMappingAssignmentManager打开。运行程序,可以看到在employeeWorkList.jsp下看不到审批的任务了,这样就把任务分开了。
    我们如果想自己定义任务的分配方式如何处理呢?如一个任务可以出现在一组用户的任务列表里,我们可以用 ParticipantMappingManagerAdmin进行参与者的映射,模拟器中的用户映射就是实现的这个功能。以下代码可以做为参考:
String pkgId = "mydemo";
Object pmmaObj = Shark.getInstance().getPlugIn(SharkConstants.PLUGIN_PARTICIPANT_MAPPING);
ParticipantMappingManagerAdmin pmma = null;
if (pmmaObj instanceof ParticipantMappingManagerAdmin) pmma = (ParticipantMappingManagerAdmin) pmmaObj;
String pkgVersion = pa.getCurrentPackageVersion(sc.getSessionHandle(), pkgId);
String procDefName = "askForLeave";
ParticipantMap[] pms = pmma.getParticipantMappings(sc.getSessionHandle(), pkgId, pkgVersion, procDefName, "employee");
for (int i=0;i<pms.length;i++)
{
pmma.deleteParticipantMapping(pms[i]);
}
pms = pmma.getParticipantMappings(sc.getSessionHandle(), pkgId, pkgVersion, procDefName, "manager");
for (int i=0;i<pms.length;i++)
{
pmma.deleteParticipantMapping(pms[i]);
}
ParticipantMap map1 = pmma.createParticipantMap();
map1.setIsGroupUser(false);
map1.setPackageId(pkgId);
map1.setPackageVersion(pkgVersion);
map1.setParticipantId("manager");
map1.setProcessDefinitionId(procDefName);
map1.setUsername("user2");
pmma.saveParticipantMapping(map1);

ParticipantMap map2 = pmma.createParticipantMap();
map2.setIsGroupUser(false);
map2.setPackageId(pkgId);
map2.setPackageVersion(pkgVersion);
map2.setParticipantId("employee");
map2.setProcessDefinitionId(procDefName);
map2.setUsername("user1");
pmma.saveParticipantMapping(map2);
    上面这段代码是Shark 2.x中的用法,与1.x的用法有所不同。
    Shark对参与者id与用户的映射关系是保存在数据库中的,下次启动同样一个流程新实例的时候,还是用原来的映射关系,即用户映射是静态的。但同一个流程,不同的实例所要分配的用户可能是不一样的,这怎么处理还需要自己再想办法。