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

 本文节选自《疯狂工作流讲义(第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开发环境搭建

本章要点

    安装JDKMySQL

    安装Eclipse以及Activiti插件

    编写第一个Activiti程序

安装开发环境

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

     Eclipse IDE

     EclipseActiviti插件

下载Eclipse

本书使用Eclipse作为开发工具,如果想使用ActivitiEclipse设计器,官方建议使用Kepler4.3或者Luna4.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如以上链接失效,可以与笔者联系,笔者邮箱地址:[email protected]如果下载到了安装好插件的Eclipse,则可以跳过相应章节

安装Activiti插件

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

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

2-23安装EMF插件

输入的名称为EMF,位置URLhttp://download.eclipse.org/modeling/emf/updates/releases/注意在选择版本时,要选择2.6.0版本,安装完成后重启Eclipse,再进行Activiti插件安装

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

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

2-24Eclipse添加软件仓库

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

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

2-25成功安装Activiti插件

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

 

编写第一个Activiti程序

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

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

如何运行本书案例

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

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

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

建立工程环境

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

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

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-1codes\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中只配置了一个名称为processEngineConfigurationbean元素,代码清单2-1中的粗体部分,配置了连接的数据库中act,因此需要在MySQL中建立一个名称为“act”的数据库,数据库的属性如图2-27所示

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

2-27数据库属性

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

创建流程文件

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

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

2-28第一个Activiti流程

代码清单2-2codes\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-3codes\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开发实践的第一课,学习本章内容后,将有助于提升学习信心。从下一章开始,我们将一起遨游ActivitiBPMN2.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

本书代码共享地址:https://gitee.com/yangenxiong/CrazyActiviti

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

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