1. 程式人生 > >我的第一個Activiti小程式

我的第一個Activiti小程式

第二步:編寫一個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.