activiti学习2:示例工程activiti-explorer.war的使用
工作流主要解决的主要问题是:为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。
activiti官方提供了一个示例工程activiti-explorer.war
,运行这个工程可以体验activiti的基本功能,了解工作流的基本使用。
本文中使用的是activiti-5.22.0的官方包,
一、搭建开发环境
要运行示例工程,需要安装jdk8和tomcat。其中jdk需要jdk8或以上,tomcat我使用的是tomcat8,使用tomcat7时启动会报如下错误:
严重: Exception sending context initialized event to listener instance of class org.activiti.explorer.servlet.WebConfigurer
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demoDataConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected org.activiti.engine.IdentityService org.activiti.explorer.conf.DemoDataConfiguration.identityService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'identityService' defined in class path resource [org/activiti/explorer/conf/ActivitiEngineConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.activiti.engine.IdentityService]: Factory method 'identityService' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processEngine' defined in class path resource [org/activiti/explorer/conf/ActivitiEngineConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.activiti.engine.ProcessEngine]: Factory method 'processEngine' threw exception; nested exception is java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processEngineFactoryBean': FactoryBean threw exception on object creation; nested exception is java.util.ServiceConfigurationError: org.activiti.engine.cfg.ProcessEngineConfigurator: org.activiti.management.jmx.JMXConfigurator not a subtype
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.activiti.explorer.servlet.WebConfigurer.contextInitialized(WebConfigurer.java:40)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5197)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5720)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1018)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:662)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:514)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.base/java.lang.Thread.run(Thread.java:844)
不明白这个是什么原因造成的,但tomcat升级到8版本后可以正常启动.
二、运行示例工程
将 activiti-5.22.0 的官方包解压后复制其中的activiti-explorer.war到本地tomcat的webapps目录中,然后启动tomcat,浏览器中访问http://localhost:8080/activiti-explorer/,会出现如下的登录界面,可以使用默认的账户密码
kermit/kermit
进行登录
登录成功后,就可以在这个示例应用中体验activiti的基本功能。
三、示例工程功能演示
这个工程分为了四个功能模块:任务、流程、报表、管理
下面我按照一般的使用流程来讲解下这几个功能模块
1. 创建流程图
从工作流的定义,为了实现某个业务目标利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。可以知道使用工作流前我们需要先定义一个规则,在这里的规则指的就是流程图。
进入流程管理模块,按如下菜单选则新建一个流程模型
流程-->流程设计工作区 -->新建模型
然后在新的页面中绘制一个简单的请假流程并保存。绘制流程图时注意要在用户任务的属性中分配assignment为当前的登录人kermit,这样才能在代办中看到新的任务。
如下是新建好的请假流程
这样流程图就创建好了。
2. 部署流程图
画好的流程图经过部署后才可以使用。在流程设计工作区选定刚才新建的流程,处理模型选择部署,完成流程的部署
3. 启动流程
部署完成后就可以启动这个流程,创建任务。在"已部署流程定义"中选中刚部署的流程,点击"启动流程"就可以启动流程。流程启动后就会在“任务”模块的"代办任务"中出现一个新的任务"apply vacation",这就是我们在流程图中定义的第一个用户任务。
这里要注意如果在画流程图时没有指定用户任务的assignee属性,或者指定的不是当前登录人的id,这个任务就不会出现在登录人的代办任务中
4. 完成任务
在任务模块对任务进行操作。在代办列表中找到刚才启动流程产生的那个任务,点击完成任务,流程就会走到下一个节点,并创建一个manager agree的任务,再完成这个任务,刚才开启的流程就结束了。
5. 用户管理
在管理模块的用户选项卡下可以对用户进行管理。这里的用户可以作为流程图上配置的assignees,使用对应账号登录后就可以操作各自的任务。
四、数据持久化
需要注意的是这个示例工程默认使用的是h2数据库,数据没有持久化到硬盘上,所以如果关闭tomcat后刚才操作的所有数据都会丢失,如果需要把操作数据持久化到硬盘上,就需要配置数据库设置,让示例工程连接本机上的mysql数据库。需要以下两个步骤:
(1) 修改war包中的配置文件,activiti-explorer\WEB-INF\classes\db.properties
中的内容为以下内容
db=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///activiti_explore
jdbc.username=root
jdbc.password=root
这样示例工程就连接上了本机上的mysql数据库
(2) 给该工程添加mysql的驱动jar包
该示例工程中是没有mysql的驱动的,所以这样配置后启动会报找不到数据库驱动的错误。复制一个驱动jar包到
activiti-explorer\WEB-INF\lib
目录下,就完成添加。
重启tomcat,到数据库activiti_explore中查看,发现activiti自动了创建了需要的表结构,说明已经完成了数据持久化的配置。
五、总结
以上演示了如何使用activiti-5.22.0的示例工程 activiti-explorer.war
如何使用。需要注意的是这个示例工程默认使用的是h2数据库,数据没有持久化到硬盘上,所以如果关闭tomcat后刚才操作的所有数据都会丢失。
如果需要把操作数据持久化到硬盘上,就需要配置数据库设置,让示例工程连接本机上的mysql数据库。