工作流的概念
解決“使在多個參與者之間按照某種預定義的規則傳遞文檔、信息或人物的過程自動進行,從而實現某個預期的業務目標,或者促使此目標的實現”。
核心API
ProcessEngine
1、在Activiti中最核心的類,其他的類都是由他而來
2、產生方式
ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();//配置引擎通過配置文件獲取對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
3、提供的服務
//流程入的部署 修改 刪除的服務 act_ge_bytearray act_re_deployment act_re_model act_re_procdef
RepositoryService repositoryService1 = processEngine.getRepositoryService();
//流程的運行
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
//查詢歷史紀錄
HistoryService historyService = processEngine.getHistoryService();
//頁面表單的服務(不常用)
FormService formService = processEngine.getFormService();
//對工作流的用戶管理的表的操作
IdentityService identityService = processEngine.getIdentityService();
//管理器
ManagementService managementService = processEngine.getManagementService();
RepositoryService
是Activiti的倉庫類。所謂的倉庫指流程定義文檔的兩個文件,bpmn文件和流程圖片。
作用
- 管理流程定義文件xml及靜態資源的服務
- 對特定流程的暫停和激活
- 流程定義啓動權限管理
基礎API
- 部署文件構造器DeploymentBuilder(對資源的封裝)
- 部署文件查詢器DeploymentQuery(查詢部署的一些操作)
- 流程定義文件查詢對象ProcessDefinitionQuery
- 流程部署文件對象Deployment
- 流程定義文件對象ProcessDefinition
- 流程定義的java格式BpmnModel
1、產生方式
RepositoryService repositoryService1 = processEngine.getRepositoryService();
2、可以產生DeploymentBuilder,用來定義流程部署的相關參數
DeploymentBuilder builder = repositoryService.createDeployment();
3、刪除流程定義
repositoryService.deleteDeployment(deploymentId);
RuntimeService
是activiti的流程執行服務類,可以從這個服務類中獲取很多關於流程執行相關的信息
ProcessDefinition
流程定義文件類,可以從這裏獲得資源文件等。
ProcessInstance
流程實例,某一個具體的流程,通過RepositoryService部署某個流程,再通過部署的流程的id獲取流程定義文件,最後通過ProcessDefinition的實例的id,使用runtimeService得到ProcessInstance的具體實例。
demo
public class DemoMain {
private static final Logger LOGGER = LoggerFactory.getLogger(DemoMain.class);
public static void main(String[] args) throws ParseException {
System.out.println("啓動程序");
System.out.println();
//創建流程引擎
// ProcessEngine processEngine = getProcessEngine();
ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
ProcessEngine processEngine = cfg.buildProcessEngine();
String name = processEngine.getName();
String version = processEngine.VERSION;
System.out.printf("流程引擎[%s],版本[%s]",name,version);
System.out.println();
//部署流程定義文件
// ProcessDefinition processDefinition = getProcessDefinition(processEngine);
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder builder = repositoryService.createDeployment();
builder.addClasspathResource("diagrams/check.bpmn");
Deployment deploy = builder.deploy();
String id = deploy.getId();
//獲取流程定義文件
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(id).singleResult();
System.out.printf("流程定義文件[%s],流程id[%s]",processDefinition.getName(),processDefinition.getId());
System.out.println();
//啓動運行流程
// ProcessInstance processInstance = startRuntimeService(processEngine, processDefinition);
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.printf("啓動流程:[%s]",processInstance.getProcessDefinitionKey());
System.out.println();
//處理流程任務
Scanner scanner = new Scanner(System.in);
while (processInstance!=null && !processInstance.isEnded()) {
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().list();
System.out.printf("待處理任務數量:[%s]",list.size());
System.out.println();
for(Task task : list){
System.out.printf("待處理任務:[%s]",task.getName());
System.out.println();
FormService formService = processEngine.getFormService();
TaskFormData taskFormData = formService.getTaskFormData(task.getId());
List<FormProperty> formProperties = taskFormData.getFormProperties();
Map<String,Object> map = new HashMap<String,Object>();
for(FormProperty property : formProperties){
String line = null;
if(StringFormType.class.isInstance(property.getType())){
System.out.printf("請輸入{%s}:",property.getName());
System.out.println();
line = scanner.nextLine();
map.put(property.getId(),line);
}else if(DateFormType.class.isInstance(property.getType())){
System.out.printf("請輸入%s格式 (yyyy-MM-dd): ",property.getName());
System.out.println();
line = scanner.nextLine();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date parse = simpleDateFormat.parse(line);
map.put(property.getId(),parse);
}else {
System.out.printf("類型暫不支持%s",property.getType());
System.out.println();
}
System.out.printf("您輸入的內容是: [%s]",line);
System.out.println();
}
taskService.complete(task.getId(),map);
processInstance = processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
}
}
System.out.println("結束程序");
}
}