疯狂Activiti6连载(3)Activiti开发环境搭建
本文节选自《疯狂工作流讲义(第2版)》Activiti开发环境搭建本章要点 安装JDK与MySQL 安装Eclipse以及Activiti插件 编写第一个Activiti程序安装开发环境本小节所说的Activiti开发环境包括以下内容: Eclipse IDE
本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
Activiti开发环境搭建
本章要点
安装JDK与MySQL
安装Eclipse以及Activiti插件
编写第一个Activiti程序
安装开发环境
本小节所说的Activiti开发环境包括以下内容:
Eclipse IDE
Eclipse的Activiti插件
下载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,可以到以下链接下载:https://pan.baidu.com/s/1bpEh1Gr,如以上链接失效,可以与笔者联系,笔者邮箱地址:yangenxiong@163.com。如果下载到了安装好插件的Eclipse,则可以跳过相应章节。
安装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-24Eclipse中添加软件仓库
插件安装完成后重启Eclipse,在新建文件的对话框,如看到图2-25的选项,则表示已经安装成功。
图2-25成功安装Activiti插件
再次强调一下,在安装过程中,由于网络的原因,会导致安装中断或者安装时间过长,如果不是为了体验插件安装,笔者建议直接下载安装好插件的Eclipse,笔者提供的下载地址为:https://pan.baidu.com/s/1bpEh1Gr。
编写第一个Activiti程序
完成了Activiti的开发环境搭建后,可以进行第一个Activiti程序的开发,开发Activiti应用,基本上只需要Eclipse即可,但是为了能更加方便设计流程,还要求使用Eclipse的Activiti插件,在编写Activiti程序前,请先确认Eclipse和Activiti插件已经成功安装。
注:Activiti的可视化插件,是为了更加方便进行流程模型设计,笔者建议还是要认真学习BPMN规范,明白插件的工作原理。
如何运行本书案例
使用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项目。
建立工程环境
打开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包。
创建配置文件
如果没有指定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的各个属性及其作用,请见第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中的两个用户任务。
注:在本书的代码清单中,为了减少篇幅,一般情况下不会将这些流程节点的位置信息配置贴出。
加载流程文件与启动流程
有了流程引擎的配置文件和流程文件后,就可以编写代码启动流程引擎并加载该流程文件,运行类如代码清单2-3所示。
代码清单2-3:codes\02\first\src\org\crazyit\activiti\First.java
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
小结
工欲善其事,必先利其器。本章主要讲解进行Activiti开发的准备工作,包括Activiti的下载和安装,Activiti开发环境的搭建,带领读者试用了Activiti的官方应用,并且开发了第一个Activiti程序。本章作为Activiti开发实践的第一课,学习完本章内容后,将有助于提升学习信心。从下一章开始,我们将一起遨游Activiti与BPMN2.0的世界。
本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
更多推荐
所有评论(0)