疯狂Activiti6.0连载(3)Activiti开发环境搭建

本文节选自《疯狂工作流讲义(第2版)》

京东购买地址:https://item.jd.com/12246565.html

疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397

工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577

3 Activiti开发环境搭建

3.1 安装开发环境

        本小节所说的Activiti开发环境包括以下内容:

              Eclipse IDE

              Eclipse的Activiti插件

3.1.1 下载Eclipse

        本书使用Eclipse作为开发工具,如果想使用Activiti的Eclipse设计器,官方建议使用Kepler(4.3)或者 Luna(4.4)版本,本书所使用的版本为Luna,大家可以从以下的地址得到该版本的Eclipse:

        http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/lunasr2  

        目前Eclipse已经发展到4.7版本,本书所使用的Eclipse功能不多,主要使用Activiti的设计器插件,本书的全部代码,理论上可以在高版本的Eclipse中运行。

        安装Eclipse插件的过程较为漫长,如果想直接使用已经安装好插件的Eclipse,可以到以下链接下载:http://pan.baidu.com/s/1pLI9L3t ,如以上链接失效,可以与笔者联系,笔者邮箱地址:yangenxiong@163.com。如果下载到了安装好插件的Eclipse,则可以跳过相应章节。

3.1.2 安装Activiti插件

        使用Eclipse的Luna版本,在安装Activiti插件前,要安装EMF插件(2.6.0版本)。打开Eclipse,在“Help”菜单中选择“Install New Software”,点击“Add”按钮,弹出窗口如图2-23所示。

图2-23 安装EMF插件

        输入的名称为EMF,位置URL为:

        http://download.eclipse.org/modeling/emf/updates/releases/

        注意在选择版本时,要选择2.6.0版本,安装完成后重启Eclipse,再进行Activiti插件安装。

        使用Activiti的Eclipse插件,开发者可以对流程模型进行可视化操作,对于流程元素可以进行拖拉,插件会自动生成相应的XML代码。安装方法与EMF插件安装方法一样,输入的插件信息如图2-24所示,输入的位置URL为:http://activiti.org/designer/update/

图2-24 Eclipse中添加软件仓库

        插件安装完成后重启Eclipse,在新建文件的对话框,如看到图2-25的选项,则表示已经安装成功。

图2-25 成功安装Activiti插件

        再次强调一下,在安装过程中,由于网络的原因,会导致安装中断或者安装时间过长,如果不是为了体验插件安装,笔者建议直接下载安装好插件的Eclipse,笔者提供的下载地址为:http://pan.baidu.com/s/1pLI9L3t

3.2 编写第一个Activiti程序

        完成了Activiti的开发环境搭建后,可以进行第一个Activiti程序的开发,开发Activiti应用,基本上只需要Eclipse即可,但是为了能更加方便设计流程,还要求使用Eclipse的Activiti插件,在编写Activiti程序前,请先确认Eclipse和Activiti插件已经成功安装。

        注:Activiti的可视化插件,是为了更加方便进行流程模型设计,笔者建议还是要认真学习BPMN规范,明白插件的工作原理。

3.2.1 如何运行本书案例

        使用Eclipse导入codes\common-lib项目,该项目用于存放本书全部例子所使用的第三方jar包,导入该项目后,可以选择某一章的案例进行导入,例如要查看第4章的案例,就可以在Eclipse可选择codes\04目录,将第4章全部的案例项目导入。每一个项目中都有相应的运行类,绝大部分的运行类都有main方法,直接运行相应案例的main方法即可以看到效果。

        为了能在每个案例运行后看到数据库的变化,因此大部分的案例均会将Activiti的databaseSchemaUpdate属性配置为drop-create(详细请见第4章),该属性会在相应案例运行前将原有的数据表删除,再创建Activiti的数据表,请读者注意该细节。

        注:本书除OA系统、第15章的Web项目和第16章的Web项目外,全部的案例所使用的第三方包均存放在codes\common-lib\lib目录下,因此成功编译和运行全部案例的前提,是先导入codes\common-lib项目。

3.2.2 建立工程环境

        打开Eclipse,将common-lib项目导入到Eclipse中,然后新建一个普通的Java项目,在项目的根目录下建立一个resource的源文件目录。修改项目的“Java Build Path”,在“Libraries”中点击“Add JARs”,选中common-lib/lib目录下的全部jar包。项目结构如图2-26所示。

图2-26 项目结构

        注:项目common-lib/lib目录下面的jar包,是从activiti-6.0.0/libs目录下复制过去的,并且也含有其他框架的jar包。本书后面章节代码,如没有特别说明,也是使用该方法引入jar包。

3.2.3 创建配置文件

        如果没有指定Activiti的配置文件,那么默认情况下将会到CLASSPATH下读取activiti.cfg.xml文件作为Activit的配置文件,该文件主要用于配置Activiti的数据库连接等属性(详细请见第4章)。将activiti-5.10\setup\files\cfg.activiti\standalone目录下的activiti.cfg.xml文件复制到项目的resource目录下,修改该文件,内容如代码清单2-1所示。

        代码清单2-1:codes\02\first\resource\activiti.cfg.xml

<?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 -->
	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="123456" />
		<property name="databaseSchemaUpdate" value="true" />
	</bean>
</beans>

        代码清单2-1中的activiti.cfg.xml是一份标准的XML文档,该XML中只配置了一个名称为processEngineConfiguration的bean元素,代码清单2-1中的粗体部分,配置了连接的数据库中act,因此需要在MySQL中建立一个名称为“act”的数据库,数据库的属性如图2-27所示。

图2-27 数据库属性

        本书的数据库字符集均使用“utf8”,项目中的源文件也使用“UTF-8”编码,如出现乱码问题,请检查数据库及源文件编码。配置文件中的processEngineConfiguration的各个属性及其作用,请参见后面章节。

3.2.4 创建流程文件

        流程描述文件是用XML语言去描述业务流程的文件,Activiti的流程文件需要遵守BPMN2.0规范。使用Activiti的Eclipse插件新建一个流程文件,该流程与Activiti的demo中的费用申请单一致,图2-28为流程图,代码清单2-2为该流程的XML配置。

图2-28 第一个Activiti流程

        代码清单2-2:codes\02\first\resource\bpmn\First.bpmn

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
	xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
	typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
	targetNamespace="http://www.activiti.org/test">
	<process id="process1" name="process1">
		<startEvent id="startevent1" name="Start"></startEvent>
		<userTask id="usertask1" name="Expense Request"></userTask>
		<userTask id="usertask3" name="Handle Request"></userTask>
		<endEvent id="endevent1" name="End"></endEvent>
		<sequenceFlow id="flow1" name="" sourceRef="startevent1"
			targetRef="usertask1"></sequenceFlow>
		<sequenceFlow id="flow2" name="" sourceRef="usertask1"
			targetRef="usertask3"></sequenceFlow>
		<sequenceFlow id="flow3" name="" sourceRef="usertask3"
			targetRef="endevent1"></sequenceFlow>
	</process>
	<bpmndi:BPMNDiagram id="BPMNDiagram_process1">
		<bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1">
			<bpmndi:BPMNShape bpmnElement="startevent1"
				id="BPMNShape_startevent1">
				<omgdc:Bounds height="35" width="35" x="150" y="190"></omgdc:Bounds>
			</bpmndi:BPMNShape>
			<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
				<omgdc:Bounds height="55" width="105" x="230" y="180"></omgdc:Bounds>
			</bpmndi:BPMNShape>
			<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
				<omgdc:Bounds height="55" width="105" x="380" y="180"></omgdc:Bounds>
			</bpmndi:BPMNShape>
			<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
				<omgdc:Bounds height="35" width="35" x="530" y="190"></omgdc:Bounds>
			</bpmndi:BPMNShape>
			<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
				<omgdi:waypoint x="185" y="207"></omgdi:waypoint>
				<omgdi:waypoint x="230" y="207"></omgdi:waypoint>
			</bpmndi:BPMNEdge>
			<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
				<omgdi:waypoint x="335" y="207"></omgdi:waypoint>
				<omgdi:waypoint x="380" y="207"></omgdi:waypoint>
			</bpmndi:BPMNEdge>
			<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
				<omgdi:waypoint x="485" y="207"></omgdi:waypoint>
				<omgdi:waypoint x="530" y="207"></omgdi:waypoint>
			</bpmndi:BPMNEdge>
		</bpmndi:BPMNPlane>
	</bpmndi:BPMNDiagram>
</definitions>

        代码清单2-2中为一份流程描述文件,该文件中的process元素用于描述流程信息,而bpmndi:BPMNDiagram元素则用于描述这些流程节点的位置信息。代码清单2-2中,定义了两个userTask元素,分别表示图2-26中的两个用户任务。

        注:在本书的代码清单中,为了减少篇幅,一般情况下不会将这些流程节点的位置信息配置贴出。

3.2.5 加载流程文件与启动流程

        有了流程引擎的配置文件和流程文件后,就可以编写代码启动流程引擎并加载该流程文件,运行类如代码清单2-3所示。

        代码清单2-3:codes\02\first\src\org\crazyit\activiti\First.java

package org.crazyit.activiti;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;

/**
 * 第一个流程运行类
 * @author yangenxiong
 *
 */
public class First {
	public static void main(String[] args)  {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务组件
		RepositoryService repositoryService = engine.getRepositoryService();
		// 得到运行时服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 获取流程任务组件
		TaskService taskService = engine.getTaskService();
		// 部署流程文件
		repositoryService.createDeployment()
				.addClasspathResource("bpmn/First.bpmn").deploy();
		// 启动流程
		runtimeService.startProcessInstanceByKey("process1");
		// 查询第一个任务
		Task task = taskService.createTaskQuery().singleResult();
		System.out.println("第一个任务完成前,当前任务名称:" + task.getName());
		// 完成第一个任务
		taskService.complete(task.getId());
		// 查询第二个任务
		task = taskService.createTaskQuery().singleResult();
		System.out.println("第二个任务完成前,当前任务名称:" + task.getName());
		// 完成第二个任务(流程结束)
		taskService.complete(task.getId());
		task = taskService.createTaskQuery().singleResult();
		System.out.println("流程结束后,查找任务:" + task);
		// 退出
		System.exit(0);
	}
}

        代码清单2-3中,使用ProcessEngines类加载默认的流程引擎配置文件(activiti.cfg.xml),再获取Activiti的各个服务组件的实例,RepositoryService主要用于管理流程的资源(请见第7章),RuntimeService主要用于进行流程运行时的流程管理(请见第9章),TaskService主要用于管理流程任务(请见第8章)。代码清单2-3中使用RepositoryService部署流程文件,使用RuntimeService启动流程,然后使用TaskService进行流程任务查找,并对结束查找到的任务。关于这些服务对象的使用以及流程文件的定义,将会在本书后面章节中详细讲解。运行代码清单2-3,输出结果如下:

第一个任务完成前,当前任务名称:Expense Request
第二个任务完成前,当前任务名称:Handle Request
流程结束后,查找任务:null

3.3 小结

        工欲善其事,必先利其器。本章主要讲解进行Activiti开发的准备工作,包括Activiti的下载和安装,Activiti开发环境的搭建,带领读者试用了Activiti的官方应用,并且开发了第一个Activiti程序。本章作为Activiti开发实践的第一课,学习完本章内容后,将有助于提升学习信心。从下一章开始,我们将一起遨游Activiti与BPMN2.0的世界。

本文节选自《疯狂工作流讲义(第2版)》

京东购买地址:https://item.jd.com/12246565.html

疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397

工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577

本书代码目录:https://gitee.com/yangenxiong/CrazyActiviti

140509_5TSO_3665821.png

转载于:https://my.oschina.net/JavaLaw/blog/1543359

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值