開源工作流引擎Shark入門4——任務的分配

    這第三篇的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與用戶的映射關係是保存在數據庫中的,下次啓動同樣一個流程新實例的時候,還是用原來的映射關係,即用戶映射是靜態的。但同一個流程,不同的實例所要分配的用戶可能是不一樣的,這怎麼處理還需要自己再想辦法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章