我的第一个Activiti小程序

本文介绍如何使用Activiti工作流引擎搭建开发环境,并通过一个简单案例——假期申请流程,展示从配置环境到部署流程定义文件的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于项目需要,最近要学习Activiti工作流引擎,刚开始拿着5.14的用户手册看了一下,对于没有学过Moven和Spring的小菜鸟来说,完全看不懂。于是先借了本jBPM 4的书翻了了一遍,算是对工作流有了个初步的了解,然后再回过头来看Activiti的用户手册,多多少少能够看懂了点。按照用户手册上缩写了的开始尝试运行一个简单的小程序。

第一步:创建一个java project,然后在项目中创建一个lib文件夹,引入必需的jar包。如图所示



把图中的jar包都添加到Classpath中去。

第二步:编写一个spring格式的activiti.cfg.xml的配置文件(这个配置文件我放在了src目录下面,如果放在其他目录下面需要在程序中添加完整的路径信息)我用的是mysql数据库。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd"> 
 
  <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> 
 
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" /> 
    <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> 
    <property name="jdbcUsername" value="root" /> 
    <property name="jdbcPassword" value="root" />  
    <property name="databaseSchemaUpdate" value="true" />  
    <property name="jobExecutorActivate" value="false" />  
    
    <!--  <property name="mailServerHost" value="mail.my-corp.com" /> 
          <property name="mailServerPort" value="5025" />  
    --> 
    
    </bean>  
 </beans>
第三步:编写个log4j.properties文件放在src目录下面(之前没有这个文件会出现没有日志输出的错误)这个文件我没有写,而是在别人的例子中copy过来的。
# Output pattern : date [thread] priority category - message
log4j.rootLogger=DEBUG, Console

#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

#Project defalult level
log4j.logger.me.kafeitu.demo=DEBUG

#spring default level
log4j.logger.org.springframework=INFO

#hibernate default level
log4j.logger.org.hibernate=ERROR

#apache
log4j.logger.org.apache=ERROR

log4j.logger.net.sf.ehcache=ERROR

第四步:引入一个流程定义文件,我直接用的Activiti 5.14用户手册中的VacationRequest这个流程定义
<?xml version="1.0" encoding="UTF-8" ?> 
<definitions id="definitions" 
             targetNamespace="http://activiti.org/bpmn20" 
             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:activiti="http://activiti.org/bpmn"> 
 
  <process id="vacationRequest" name="Vacation request"> 
 
    <startEvent id="request" activiti:initiator="employeeName"> 
      <extensionElements> 
        <activiti:formProperty id="numberOfDays" name="Number of days" type="long" value="1" required="true"/> 
        <activiti:formProperty id="startDate" name="First day of holiday (dd-MM-yyy)" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" /> 
        <activiti:formProperty id="vacationMotivation" name="Motivation" type="string" /> 
      </extensionElements> 
    </startEvent> 
    <sequenceFlow id="flow1" sourceRef="request" targetRef="handleRequest" /> 
 
    <userTask id="handleRequest" name="Handle vacation request" > 
      <documentation> 
        ${employeeName} would like to take ${numberOfDays} day(s) of vacation (Motivation: ${vacationMotivation}). 
      </documentation> 
      <extensionElements> 
         <activiti:formProperty id="vacationApproved" name="Do you approve this vacation" type="enum" required="true"> 
          <activiti:value id="true" name="Approve" /> 
          <activiti:value id="false" name="Reject" /> 
        </activiti:formProperty> 
        <activiti:formProperty id="managerMotivation" name="Motivation" type="string" /> 
      </extensionElements> 
      <potentialOwner> 
        <resourceAssignmentExpression> 
          <formalExpression>management</formalExpression> 
        </resourceAssignmentExpression> 
      </potentialOwner> 
    </userTask> 
    <sequenceFlow id="flow2" sourceRef="handleRequest" targetRef="requestApprovedDecision" /> 
 
    <exclusiveGateway id="requestApprovedDecision" name="Request approved?" /> 
    <sequenceFlow id="flow3" sourceRef="requestApprovedDecision" targetRef="sendApprovalMail"> 
      <conditionExpression xsi:type="tFormalExpression">${vacationApproved == 'true'}</conditionExpression> 
    </sequenceFlow> 
 
    <task id="sendApprovalMail" name="Send confirmation e-mail" /> 
    <sequenceFlow id="flow4" sourceRef="sendApprovalMail" targetRef="theEnd1" /> 
    <endEvent id="theEnd1" /> 
 
    <sequenceFlow id="flow5" sourceRef="requestApprovedDecision" targetRef="adjustVacationRequestTask"> 
      <conditionExpression xsi:type="tFormalExpression">${vacationApproved == 'false'}</conditionExpression> 
    </sequenceFlow> 
 
    <userTask id="adjustVacationRequestTask" name="Adjust vacation request"> 
      <documentation> 
        Your manager has disapproved your vacation request for ${numberOfDays} days. 
        Reason: ${managerMotivation} 
      </documentation> 
      <extensionElements> 
        <activiti:formProperty id="numberOfDays" name="Number of days" value="${numberOfDays}" type="long" required="true"/> 
        <activiti:formProperty id="startDate" name="First day of holiday (dd-MM-yyy)" value="${startDate}" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" /> 
        <activiti:formProperty id="vacationMotivation" name="Motivation" value="${vacationMotivation}" type="string" /> 
        <activiti:formProperty id="resendRequest" name="Resend vacation request to manager?" type="enum" required="true"> 
          <activiti:value id="true" name="Yes" /> 
          <activiti:value id="false" name="No" /> 
        </activiti:formProperty> 
      </extensionElements> 
      <humanPerformer> 
        <resourceAssignmentExpression> 
          <formalExpression>${employeeName}</formalExpression> 
        </resourceAssignmentExpression> 
      </humanPerformer> 
    </userTask> 
    <sequenceFlow id="flow6" sourceRef="adjustVacationRequestTask" targetRef="resendRequestDecision" /> 
 
    <exclusiveGateway id="resendRequestDecision" name="Resend request?" /> 
    <sequenceFlow id="flow7" sourceRef="resendRequestDecision" targetRef="handleRequest"> 
      <conditionExpression xsi:type="tFormalExpression">${resendRequest == 'true'}</conditionExpression> 
    </sequenceFlow> 
 
     <sequenceFlow id="flow8" sourceRef="resendRequestDecision" targetRef="theEnd2"> 
      <conditionExpression xsi:type="tFormalExpression">${resendRequest == 'false'}</conditionExpression> 
    </sequenceFlow> 
    <endEvent id="theEnd2" /> 
 
  </process> 
 
</definitions> 
然后,建一个简单的java类
package com.activiti.test;

import org.activiti.engine.*;

import com.mysql.jdbc.log.*;

public class ActivitiTest {
	
	public static void main(String[] args){
		
		ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
		RepositoryService repositoryService=processEngine.getRepositoryService();
		repositoryService.createDeployment().addClasspathResource("VacationRequest.bpmn20.xml")
		.deploy();
		
		//Log.logInfo("Number of process definitions: " + repositoryService.createProcessDefinitionQuery().count()); 
		System.out.println(repositoryService.createProcessDefinitionQuery().count());
	}

}

运行测试:输出3.







评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值