task活動講解之任務分配,候選,自定義任務分配處理器

jbpm學習筆記(八) task活動講解之任務分配,候選,自定義任務分配處理器
   本來是要寫end活動的,感覺比較簡單,就直接進入task活動。
    Task活動是一個重難點。
    定義:在jbpm中,task活動一般用來處理涉及人機交互的活動。我們可以使用task活動的assignee屬性將一個任務分配給指定的用戶。

  示例一:熟練一下基本功能
  對應的jpdl如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
	<start>
	<transition to="review"/>
	</start>
    <!-- EL表達式 "#{order.owner}"的值在這裏表示分配者ID -->
    <task name="review" assignee="#{order.owner}">
      <transition to="wait" />
    </task>
    <state name="wait" />
</process>

  對應的order代碼如下:
package org.test;

import java.io.Serializable;

public class Order implements Serializable{

	private String owner;
	
	public Order(){
	}
	
	public Order(String owner){
		this.owner=owner;
	}

	public String getOwner() {
		return owner;
	}

	public void setOwner(String owner) {
		this.owner = owner;
	}
	
}

注意:假如不實現Serializable的話,會給你報錯。

測試代碼如下:
package org.test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jbpm.api.ProcessInstance;
import org.jbpm.api.task.Task;
import org.jbpm.test.JbpmTestCase;

public class TestTask extends JbpmTestCase {

	String deploymentId;

	@Override
	public void setUp() throws Exception {
		super.setUp();
		deploymentId = repositoryService.createDeployment()
				.addResourceFromClasspath("org/test/task.jpdl.xml").deploy();
		System.out.println("啓動成功");
	}

	@Override
	public void tearDown() throws Exception {
		repositoryService.deleteDeploymentCascade(deploymentId);
		super.tearDown();
		System.out.println("銷燬成功");
	}

	public void testTask() {
		Map<String, Object> variables = new HashMap<String, Object>();

		// 用戶ID爲afei
		variables.put("order", new Order("afei"));
		ProcessInstance pi = executionService.startProcessInstanceByKey(
				"TaskAssignee", variables);
		List<Task> taskList=taskService.findPersonalTasks("afei");
		Task task=taskList.get(0);
		System.out.println("task.getActivityName()"+task.getActivityName());

	}

}


  Jbpm支持將任務分配給一組候選用戶,組中的一個用戶可以接受這個任務並完成它,這就是任務的候選者機制。Task活動的候選者屬性有:candidate-groups和candidate-users。


示例二:用戶組概念
對應的jpdl如下:
<?xml version="1.0" encoding="UTF-8"?>

<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
	<start>
		<transition to="review" />
	</start>
	<!-- 在這裏用字符串應用了一個用戶組:sales-dept -->
	<task name="review" candidate-groups="sales-dept">
		<transition to="wait" />
	</task>
	<state name="wait" />
</process>


   流程實例發起後,任務review會被創建。這個任務不會顯示在任何人的個人任務列表中,因爲還沒有創建sales-dept組。因此下面獲取的個人任務列表將是空(empty)的:
  taskService.getAssignedTasks(“afei”);
  taskService.getAssignedTasks(“angel”);
 

   但是此任務會顯示在sales-dept組成員的分組任務列表,可以通過service Api的taskService.findGroupTasks獲取。
接下來,我們就將afei和angel這兩個用戶創建並加入sales-dept住,這需要使用到IdentiryService服務:
ProcessInstance pi=executionService.startProcessInstanceByKey("TaskAssignee");
		// 首先創建sales-dept組
		String groupName = "sales-dept";
		identityService.createGroup(groupName);

		// 創建用戶afei
		identityService.createUser("afei", "afei", "du", "[email protected]");

		// 將afei加入sales-dept組
		identityService.createMembership("afei", groupName);

		// 創建用戶angel
		identityService.createUser("angel", "angel", "peng", "[email protected]");

		// 將angel加入sales-dept組
		identityService.createMembership("angel", groupName);

		/* 此時,在流程實例發起後,review任務就會出現在用戶afei和angel的分組任務列表中,即一下代碼的執行結果非空 */
		List<Task> afeiTasks = taskService.findGroupTasks("afei");
		List<Task> angelTasks = taskService.findGroupTasks("angel");
		
		System.out.println(afeiTasks.size());
		
		Task afeiTask = afeiTasks.get(0);

		// afei接受任務操作
		taskService.takeTask(afeiTask.getId(), "afei");
		assertNull(taskService.findGroupTasks("afei"));

   與candidate-groups屬性類似的,candidate-users屬性可以用來處理逗號分隔的系列用戶ID,candidate-users屬性可以和其他任務分配屬性結合使用。
但是,如果我們需要在分配任務時加入一些複雜的業務邏輯計算呢。顯示我們得找出另外的解決方案。“任務分配處理器”是個很不錯的選擇。
首先,得實現AssignmentHandler接口。

package org.test;

import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;

public class AssignTask implements AssignmentHandler {

	private String assignee;

	@Override
	public void assign(Assignable assignable, OpenExecution execution)
			throws Exception {
		assignable.setAssignee(assignee);
		System.out.println("assignee: "+assignee);
	}

}

Jpdl如下:

<?xml version="1.0" encoding="UTF-8"?>

<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
	<start>
		<transition to="review" />
	</start>

	<task name="review">

		<!-- 在這裏的類就是實現了AssignmentHandler接口的 -->
		<assignment-handler class="org.test.AssignTask">
			<!-- field元素爲任務分配處理器的assignee域注入值。這種注入方式對於jbpm的用戶代碼都是通用的 -->
			<field name="assignee" >
				<string value="afei" />
			</field>
		</assignment-handler>

		<transition to="wait" />
	</task>
	<state name="wait" />
</process>

Ok,單元測試如下:

Map<String,Object> vals=new HashMap<String, Object>();
		vals.put("order",new Order("afei"));
		ProcessInstance pi = executionService
				.startProcessInstanceByKey("TaskAssignee",vals);

		// afei是通過jpdl定義注入的任務分配者
		List<Task> taskList = taskService.findPersonalTasks("afei");

		// 斷言afei有一個任務
		assertEquals(1, taskList.size());

		Task task = taskList.get(0);

		// 斷言任務名稱如定義的 "review"
		assertEquals("review", task.getName());

		// 斷言任務的分配者如預期
		assertEquals("afei", task.getAssignee());
當然   就像你看到的,AssignmentHandler提供的execution對象可以獲得流程上下文和變量,可以結合其他任何API來計算出任務的分配者和候選者,單個用戶和用戶組。比如你可以這樣做:
在啓動流程實例時候,加一個參數:
  
Map<String,Object> vals=new HashMap<String, Object>();
   vals.put("order",new Order("angel"));
然後在你的任務分配處理器實現類中加入:
Order order=(Order)execution.getVariable("order");
assignable.setAssignee(order.getOwner());

就可以自動控制分配人了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章