最近把Activiti给研究了一下,因此想写一下有关工作流方面的知识,把自己的学习心得也给分享一下,省的在学习的道路上,走很多弯路。
什么是Activiti?
如果要看专业的解释的话,就百度一下就OK了,在这里只说一下小编的认识。
在生活中,我们都见过一些类似的流程式的操作,比如学校的请假流程、公司的业务流程……,由于这些流程,都是可变的,根据设计模式的思想,我们把这些可变的业务流程式的操作,也单独抽离出来,做一个系统来维护,提高了系统的灵活性和可维护性。
一般来说,如果没有Activiti的话,自己动手来做的话,也可以实现这些流式的操作的,只不过现在有成型的封装好的API,我们直接加以利用即可。
我们试想一下,如果让我们来维护一套请假流程的话,是不是需要设计各种的数据库表,然后再各种的数据库表之间的维护。而关于Activiti的学习,主要是学习这23张数据库表,每张数据库表都有不同的含义。这就引出了工作引擎的概念。在Activiti中,ProcessEngine对象是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
对于各种复杂的流程,如何来办呢?Activit中可以通过图形化的形式来画出我们需要的流程操作,业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)。如果理解的深刻的话,也可以通过代码的形式来描述。 基本上要说的就这么多了,下面来搭建我们的准备环境吧
准备环境
activiti5 软件环境
1) JDK1.6或者更高版本
2) 支持的数据库有:h2, mysql, oracle, postgres, mssql, db2等。
3) 支持activiti5运行的jar包
4) 开发环境为Eclipse3.7或者以上版本,myeclipse为8.6版本
4.2:相关资源下载
1) JDK可以到sun的官网下载
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2) 数据库,例如:mysql可以在官网上下载。
3) activiti也可以到Activiti官方网站下载得到。
http://activiti.org/download.html
4) Eclipse3.7或者MyEclipse8.6也可以到相应的网站上获得下载。
另外还需要安装流程设计器(eclipse插件),直接在elicpse中搜索图中插件即可
添加Activiti5的jar包
在activiti-5.13->wars目录下是一些示例项目,解压activiti-rest项目,导入activiti-rest目录中WEB-INF\lib下所有包。添加到classpath中。
由于我们使用的是Mysql数据库,Mysql数据库的链接驱动Activiti官方包中并没有提供,需要我们自己导入。手动导入mysql-connector-java.jar,添加到classpath下。
初始化数据库操作
下面就来初始化数据库,等会就可以看到经常用的23张数据库表了。
第一种方式
<span style="font-family:Comic Sans MS;font-size:18px;"><span style="font-family:Comic Sans MS;font-size:18px;">@Test public void createTable_23(){ ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); //定义连接mysql数据库 configuration.setJdbcDriver("com.mysql.jdbc.Driver"); configuration.setJdbcUrl("jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8"); configuration.setJdbcUsername("root"); configuration.setJdbcPassword(""); /** * public static final String DB_SCHEMA_UPDATE_FALSE = "false";操作activiti23张表的时候,如果表不存在,就抛出异常,不能自动创建23张表 public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";每次操作,都会先删除表,再创建表 public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,就创建表,如果表存在,就直接操作 */ configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); //activiti核心对象(流程引擎) ProcessEngine processEngine = configuration.buildProcessEngine(); System.out.println("processEngine:"+processEngine); } </span></span>
第二种方式
在第一种方式中,我们看到有很多关于数据库连接操作的信息,为了方便Activiti为我们提供了activiti.cfg.xml的配置方式,直接把此文件放置到Classpath下即可,配置文件的信息如下
<span style="font-family:Comic Sans MS;font-size:18px;"><span style="font-family:Comic Sans MS;font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8"></property> <property name="jdbcUsername" value="root"></property> <property name="jdbcPassword" value=""></property> <!-- true没有表就创建表,有表就直接操作 --> <property name="databaseSchemaUpdate" value="true"></property> </bean> </beans></span></span>
然后我们的创建方式就变为了如下
<span style="font-family:Comic Sans MS;font-size:18px;"><span style="font-family:Comic Sans MS;font-size:18px;">@Test public void createTable_23FromXml(){ // ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); // ProcessEngine processEngine = configuration.buildProcessEngine(); ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml") .buildProcessEngine(); System.out.println("processEngine:"+processEngine); }</span></span>
上述只是经常用的两种方式来创建ProcessEngineConfiguration,还有其他的一些创建,如下
public static ProcessEngineConfiguration createProcessEngineConfigurationFromResourceDefault() {
return createProcessEngineConfigurationFromResource("activiti.cfg.xml", "processEngineConfiguration");
}
public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource) {
return createProcessEngineConfigurationFromResource(resource, "processEngineConfiguration");
}
public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource, String beanName) {
return BeansConfigurationHelper.parseProcessEngineConfigurationFromResource(resource, beanName);
}
public static ProcessEngineConfiguration createProcessEngineConfigurationFromInputStream(InputStream inputStream) {
return createProcessEngineConfigurationFromInputStream(inputStream, "processEngineConfiguration");
}
public static ProcessEngineConfiguration createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName) {
return BeansConfigurationHelper.parseProcessEngineConfigurationFromInputStream(inputStream, beanName);
}
public static ProcessEngineConfiguration createStandaloneProcessEngineConfiguration() {
return new StandaloneProcessEngineConfiguration();
}
public static ProcessEngineConfiguration createStandaloneInMemProcessEngineConfiguration() {
return new StandaloneInMemProcessEngineConfiguration();
}
关于这些,我们会在后面的博客中提到。