Activiti入门

1、核心组件

 

Activiti引擎提供了7大Service接口,均通过processEngine获取,支持链式API风格。

Service接口 作用
RepositoryService 流程仓库服务,管理流程仓库,比如部署、删除、读取流程资源
IdentityService 身份服务,管理用户、组及其关系
RuntimeService 运行服务,处理所有正在运行态的流程实例、任务等。
TaskService 任务服务,管理(签收、办理、指派等)、查询任务。
FormService 表单服务,读取和流程、任务相关的表单数据
HistoryService 历史服务,管理所有历史数据
ManagementService 引擎管理服务,和具体业务无关,管理引擎。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();

2、流程设计器

Eclipse插件:Eclipse Designer

web:Activiti Modeler

3、设计流程

在activiti部署的时候,必须同时存在leave.bpmn及leave.png。因此在eclipse设置:window—>preferences—>activiti->save->选中create process definition image when saving the diagram。绘制完leave.bpmn后,就会自动生成对应的png文件。

4、测试

public class SayHelloToLeaveTest {

    @Test
    public void testStartProcess() throws Exception {
        ProcessEngine processEngine = ProcessEngineConfiguration
                .createStandaloneInMemProcessEngineConfiguration()
                .buildProcessEngine();

        RepositoryService repositoryService = processEngine.getRepositoryService();
        String bpmnFileName = "me/kafeitu/activiti/helloworld/SayHelloToLeave.bpmn";
        repositoryServic.createDeployment()
                 .addInputStream("SayHelloToLeave.bpmn",this.getClass().getClassLoader().getResourceAsStream(bpmnFileName))
                 .deploy();

        ProcessDefinition processDefinition = repositoryService
                .createProcessDefinitionQuery().singleResult();
        assertEquals("SayHelloToLeave", processDefinition.getKey());

        RuntimeService runtimeService = processEngine.getRuntimeService();

        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("applyUser", "employee1");
        variables.put("days", 3);

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("SayHelloToLeave", variables);
        assertNotNull(processInstance);
        System.out.println("pid=" + processInstance.getId() + ", pdid="
                + processInstance.getProcessDefinitionId());

        TaskService taskService = processEngine.getTaskService();
        Task taskOfDeptLeader = taskService.createTaskQuery().taskCandidateGroup("deptLeader").singleResult();
        assertNotNull(taskOfDeptLeader);
        assertEquals("领导审批", taskOfDeptLeader.getName());

        taskService.claim(taskOfDeptLeader.getId(), "leaderUser");
        variables = new HashMap<String, Object>();
        variables.put("approved", true);
        taskService.complete(taskOfDeptLeader.getId(), variables);

        taskOfDeptLeader = taskService.createTaskQuery().taskCandidateGroup("deptLeader").singleResult();
        assertNull(taskOfDeptLeader);

        HistoryService historyService = processEngine.getHistoryService();
        long count = historyService.createHistoricProcessInstanceQuery().finished().count();
        assertEquals(1, count);
    }
}

5、自动部署

通过Spring创建 ProcessEngine 时一个独有的功能。可以在初始化 ProcessEngine 时自动将定义的资源部署到 ProcessEngine 中。对新系统的上线或者开发过程中加入新的流程非常有用,可以自动部署引擎数据库中不存在的,或者修改过的流程定义。

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="dataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="databaseSchemaUpdate" value="true" />
        <property name="jobExecutorActivate" value="false" />
        <property name="deploymentResource" value="classpath*:/chapter6/**/*.bpmn"/>
    </bean>

6、集成普通表单

业务数据和流程数据分离

<form action="${ctx }/chapter7/leave/start" class="form-horizontal" method="post" onsubmit="beforeSend()">
        <input type="hidden" name="startTime" />
        <input type="hidden" name="endTime" />
        <fieldset>
            <legend><small>请假申请</small></legend>
            <div id="messageBox" class="alert alert-error input-large controls" style="display:none">输入有误,请先更正。</div>
            <div class="control-group">
                <label for="loginName" class="control-label">请假类型:</label>
                <div class="controls">
                    <select id="leaveType" name="leaveType" class="required">
                        <option>公休</option>
                        <option>病假</option>
                        <option>调休</option>
                        <option>事假</option>
                        <option>婚假</option>
                    </select>
                </div>
            </div>
            <div class="control-group">
                <label for="name" class="control-label">开始时间:</label>
                <div class="controls">
                    <input type="text" id="startDate" class="datepicker input-small" data-date-format="yyyy-mm-dd" />
                    <input type="text" id="startTime" class="time input-small" />
                </div>
            </div>
            <div class="control-group">
                <label for="plainPassword" class="control-label">结束时间:</label>
                <div class="controls">
                    <input type="text" id="endDate" class="datepicker input-small" data-date-format="yyyy-mm-dd" />
                    <input type="text" id="endTime" class="time input-small" />
                </div>
            </div>
            <div class="control-group">
                <label for="groupList" class="control-label">请假原因:</label>
                <div class="controls">
                    <textarea name="reason"></textarea>
                </div>
            </div>
            <div class="form-actions">
                <button type="submit" class="btn"><i class="icon-play"></i>启动流程</button>
            </div>
        </fieldset>
    </form>

form
@Service
@Transactional
public class LeaveWorkflowService {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    LeaveManager leaveManager;

    @Autowired
    private IdentityService identityService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private RepositoryService repositoryService;

    /**
     * 保存请假实体并启动流程
     */
    public ProcessInstance startWorkflow(Leave entity, String userId, Map<String, Object> variables) {
        if (entity.getId() == null) {
            entity.setApplyTime(new Date());
            entity.setUserId(userId);
        }
        leaveManager.save(entity);//持久化请假实体
        String businessKey = entity.getId().toString();//实体保存后的ID,作为流程中的业务key

        // 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
        identityService.setAuthenticatedUserId(userId); // 设置当前用户

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave", businessKey, variables);//将业务主ID设置为流程实例的key
        String processInstanceId = processInstance.getId();
        entity.setProcessInstanceId(processInstanceId);// 将流程实例的ID保存至业务表
        logger.debug("start process of {key={}, bkey={}, pid={}, variables={}}", new Object[]{"leave", businessKey, processInstanceId, variables});
        leaveManager.save(entity);
        return processInstance;
    }

    ...
}

 7、解决流程图乱码问题

/**
 * 解决乱码问题
 * @author Administrator
 *
 */
@Component
public class ShareniuProcessEngineConfigurationConfigurer implements ProcessEngineConfigurationConfigurer  {
    public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
        processEngineConfiguration.setActivityFontName("宋体");
        processEngineConfiguration.setLabelFontName("宋体");
        processEngineConfiguration.setAnnotationFontName("宋体");
        System.out.println("ShareniuProcessEngineConfigurationConfigurer#############");
        System.out.println(processEngineConfiguration.getActivityFontName());
    }
原文地址:https://www.cnblogs.com/ijavanese/p/9442486.html