最近一直在研究工作流,就简单记录下工作中用到activiti遇到的问题及解决办法。
一、工作流是什么
工作流是对工作流程极其各操作步骤之间的业务规则的抽象、概括描述。
二、工作流建模
将工作流程中的工作前后组织在一起的逻辑及规则,在计算机中以恰当的模型表达对其实施计算。
三、工作流解决的问题
主要为实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息、或者任务。
四、简单的一个二级审批流程图及代码实现。
代码:
public class DemoExample { private static final Logger LOGGER = LoggerFactory.getLogger(DemoMain.class); public static void main(String[] args) throws ParseException { //创建流程引擎 ProcessEngine processEngine = getProcessEngine(); //部署流程引擎文件 ProcessDefinition processDefinition = getProcessDefinition(processEngine); //启动运行流程 ProcessInstance processInstance = getProcessInstance(processEngine, processDefinition); //处理流程任务\ procesTask(processEngine, processInstance); LOGGER.info("结束任务"); } private static void procesTask(ProcessEngine processEngine, ProcessInstance processInstance) throws ParseException { Scanner scanner = new Scanner(System.in); while (processInstance != null && !processInstance.isEnded()){ TaskService taskService = processEngine.getTaskService(); List<Task> list = taskService.createTaskQuery().list();//获取需要处理的任务列表 LOGGER.info("待处理任务数量{}",list.size()); for(Task task : list){ LOGGER.info("待处理任务{}",task.getName()); Map<String, Object> variables = getMap(processEngine, scanner, task); taskService.complete(task.getId(),variables); processInstance = processEngine.getRuntimeService() .createProcessInstanceQuery() .processInstanceId(processInstance.getId()) .singleResult(); } } scanner.close(); } //提取map private static Map<String, Object> getMap(ProcessEngine processEngine, Scanner scanner, Task task) throws ParseException { FormService formService = processEngine.getFormService(); TaskFormData taskFormData = formService.getTaskFormData(task.getId()); List<FormProperty> formProperties = taskFormData.getFormProperties(); Map<String,Object> variables = Maps.newHashMap(); for (FormProperty property : formProperties) { String line = null; if(StringFormType.class.isInstance(property.getType())) { LOGGER.info("请输入{} ?", property.getName()); line = scanner.nextLine(); variables.put(property.getId(),line); }else if(DateFormType.class.isInstance(property.getType())){ LOGGER.info("请输入{} ? 格式 (yyyy-MM-dd)", property.getName()); line = scanner.nextLine(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = dateFormat.parse(line); variables.put(property.getId(),date); }else{ LOGGER.info("类型暂时不支持{}",property.getType()); } LOGGER.info("亲输入的内容是【{}】",line); } return variables; } //启动流程任务 private static ProcessInstance getProcessInstance(ProcessEngine processEngine, ProcessDefinition processDefinition) { RuntimeService runtimeService = processEngine.getRuntimeService();//得到一个运行时对象 ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());//根据Id来启动流程 LOGGER.info("启动流程 {}",processInstance.getProcessDefinitionKey()); return processInstance; } //部署流程文件 private static ProcessDefinition getProcessDefinition(ProcessEngine processEngine) { RepositoryService repositoryService = processEngine.getRepositoryService(); DeploymentBuilder deploymentBuilder = repositoryService.createDeployment(); deploymentBuilder.addClasspathResource("secoend_approve.bpmn20.xml"); Deployment deployment = deploymentBuilder.deploy(); LOGGER.info("部署{}",deployment); String deploymentId = deployment.getId(); LOGGER.info("流程ID {}",deploymentId); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); LOGGER.info("流程定义Id{},流程定义名称{}",processDefinition.getId(),processDefinition.getName()); return processDefinition; } //创建流程引擎 private static ProcessEngine getProcessEngine() { ProcessEngineConfiguration cfg= ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();//基于内存数据库 ProcessEngine processEngine =cfg.buildProcessEngine();//构造流程引擎 String name = processEngine.getName(); String version = processEngine.VERSION; LOGGER.info("流程引擎名称{},版本信息{}",name,version); return processEngine; } }