Activiti 5.3:配置与Spring整合

标签: activiti spring | 发表时间:2012-10-10 23:51 | 作者:howareyoutodaysoft
出处:http://blog.csdn.net

Activiti 5.3与Spring整合也比较简单,其基本思想就是,通过Spring的IOC容器来管理Activiti的流程引擎实例以及相关服务,可见,主要是基于Activiti在与Spring整合上努力上,做好配置即可。这里基于前面的<receiveTask>的例子来进行,可以参考: Activiti 5.3:流程活动自动与手工触发执行,简单的流程,如图所示:

Activiti 5.3与Spring整合,默认使用的配置文件为activiti-context.xml,当然可以在实际使用的时候覆盖掉默认的配置,或者增加自己的其他的Spring的配置。

我们也命名为activiti-context.xml,内容(安装Activiti 5.3的时候,实例工程中已经附带)如下所示:

[java]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"   
  4.        xmlns:context="http://www.springframework.org/schema/context"  
  5.        xmlns:tx="http://www.springframework.org/schema/tx"  
  6.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  7.        xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  9.                            http://www.springframework.org/schema/tx      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  10.   
  11.   <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">  
  12.     <property name="driverClass" value="org.h2.Driver" />  
  13.     <property name="url" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />  
  14.     <property name="username" value="sa" />  
  15.     <property name="password" value="" />  
  16.   </bean>  
  17.     
  18.   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  19.     <property name="dataSource" ref="dataSource" />  
  20.   </bean>  
  21.   
  22.  <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">  
  23.     <property name="dataSource" ref="dataSource" />  
  24.     <property name="transactionManager" ref="transactionManager" />  
  25.     <property name="databaseSchemaUpdate" value="true" />  
  26.     <property name="mailServerHost" value="localhost" />  
  27.     <property name="mailServerPort" value="5025" />  
  28.     <property name="jpaHandleTransaction" value="true" />  
  29.     <property name="jpaCloseEntityManager" value="true" />  
  30.     <property name="jobExecutorActivate" value="false" />  
  31.   </bean>  
  32.     
  33.   <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">  
  34.     <property name="processEngineConfiguration" ref="processEngineConfiguration" />  
  35.   </bean>  
  36.     
  37.   <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />  
  38.   <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />  
  39.   <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />  
  40.   <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />  
  41.   <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />  
  42.   
  43. </beans>  

这里面,我把Activiti 5.3默认工程中有关JPA的部分配置删除了,其实通过这个就可以初始化Activiti引擎实例。为了测试方便,将获取服务的实现抽象出来,同时使用Spring自带的与JUnit4集成的工具(AbstractTransactionalJUnit4SpringContextTests)。我们的实现类为AbstractSpringTest,代码如下所示:

[java]  view plain copy
  1. package org.shirdrn.workflow.activiti;  
  2.   
  3. import java.util.logging.Logger;  
  4.   
  5. import org.activiti.engine.HistoryService;  
  6. import org.activiti.engine.ManagementService;  
  7. import org.activiti.engine.ProcessEngine;  
  8. import org.activiti.engine.RepositoryService;  
  9. import org.activiti.engine.RuntimeService;  
  10. import org.activiti.engine.TaskService;  
  11. import org.junit.After;  
  12. import org.junit.Before;  
  13. import org.springframework.beans.factory.annotation.Autowired;  
  14. import org.springframework.test.context.ContextConfiguration;  
  15. import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;  
  16.   
  17. /** 
  18.  * @author shirdrn 
  19.  */  
  20. @ContextConfiguration("classpath:activiti-context.xml")  
  21. public abstract class AbstractSpringTest extends AbstractTransactionalJUnit4SpringContextTests {  
  22.   
  23.     @SuppressWarnings("unused")  
  24.     private final Logger log = Logger.getLogger(AbstractSpringTest.class.getName());  
  25.       
  26.     @SuppressWarnings("unused")  
  27.     @Autowired  
  28.     private ProcessEngine processEngine;  
  29.     @Autowired  
  30.     protected RepositoryService repositoryService;  
  31.     @Autowired  
  32.     protected RuntimeService runtimeService;  
  33.     @Autowired  
  34.     protected TaskService taskService;  
  35.     @Autowired  
  36.     protected HistoryService historyService;  
  37.     @Autowired  
  38.     protected ManagementService managementService;  
  39.       
  40.     protected String deploymentId;  
  41.       
  42.     public AbstractSpringTest() {  
  43.         super();  
  44.     }  
  45.       
  46.     @Before  
  47.     public void initialize() throws Exception {  
  48.         beforeTest();  
  49.     }  
  50.       
  51.     @After  
  52.     public void clean() throws Exception {  
  53.         afterTest();  
  54.     }  
  55.       
  56.     protected abstract void beforeTest() throws Exception;  
  57.       
  58.     protected abstract void afterTest() throws Exception;  
  59. }  

上面,将classpath:activiti-context.xml在测试的时候进行加载,这样,在测试的子类中,只需要将其他的相关Spring配置单独加载即可,业务配置与流程配置分开,便于维护。

具体测试用例,这里实现了一个简单的Spring Bean,配置文件为mySpringContext.xml,如下所示:

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd  
  7.                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  8.                            http://www.springframework.org/schema/tx      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  9.   
  10.     <bean id="mySpringBean" class="org.shirdrn.workflow.activiti.spring.MySpringBean">  
  11.         <property name="id" value="65536" />  
  12.         <property name="name" value="shirdrn" />  
  13.     </bean>  
  14. </beans>  

Spring Bean的实现,代码如下所示:

[java]  view plain copy
  1. package org.shirdrn.workflow.activiti.spring;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class MySpringBean implements Serializable {  
  6.     private static final long serialVersionUID = 1L;  
  7.     private Integer id;  
  8.     private String name;  
  9.     public Integer getId() {  
  10.         return id;  
  11.     }  
  12.     public void setId(Integer id) {  
  13.         this.id = id;  
  14.     }  
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     @Override  
  22.     public String toString() {  
  23.         return "MySpringBean[id="+ id + ",name=" + name + "]";  
  24.     }  
  25. }  

下面,看看我们具体的测试用例,实现代码如下所示:

[java]  view plain copy
  1. package org.shirdrn.workflow.activiti.spring;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import org.activiti.engine.repository.Deployment;  
  8. import org.activiti.engine.runtime.Execution;  
  9. import org.activiti.engine.runtime.ProcessInstance;  
  10. import org.junit.Test;  
  11. import org.shirdrn.workflow.activiti.AbstractSpringTest;  
  12. import org.shirdrn.workflow.activiti.subprocess.Merchant;  
  13. import org.springframework.beans.factory.annotation.Autowired;  
  14. import org.springframework.test.context.ContextConfiguration;  
  15.   
  16. /** 
  17.  * @author shirdrn 
  18.  */  
  19. @ContextConfiguration({  
  20.     "classpath:org/shirdrn/workflow/activiti/spring/mySpringContext.xml"})  
  21. public class ActivitiWithSpringTest extends AbstractSpringTest {  
  22.   
  23.     @Autowired  
  24.     private MySpringBean mySpringBean;  
  25.       
  26.     @Override  
  27.     protected void beforeTest() throws Exception {  
  28.         Deployment deployment = repositoryService  
  29.         .createDeployment()  
  30.         .addClasspathResource(  
  31.                 "diagrams/Task.ReceiveTask.bpmn20.xml")  
  32.         .deploy();    
  33.         deploymentId = deployment.getId();  
  34.     }  
  35.   
  36.     @Override  
  37.     protected void afterTest() throws Exception {  
  38.         repositoryService.deleteDeployment(deploymentId, true);   
  39.     }  
  40.       
  41.     @Test  
  42.     public void triggerMyProcess() {  
  43.         // prepare data packet  
  44.         Map<String, Object> variables = new HashMap<String, Object>();  
  45.         Map<String, Object> subVariables = new HashMap<String, Object>();  
  46.         variables.put("maxTransCount", 1000000);  
  47.         variables.put("merchant", new Merchant("ICBC"));  
  48.         variables.put("protocol", "UM32");  
  49.         variables.put("repository", "10.10.38.99:/home/shirdrn/repository");  
  50.         variables.put("in", subVariables);  
  51.         variables.put("out", new HashMap<String, Object>());  
  52.           
  53.         // start process instance  
  54.         ProcessInstance pi = runtimeService.startProcessInstanceByKey("MyReceiveTask", variables);  
  55.         assert (pi!=null);  
  56.           
  57.         List<Execution> executions = runtimeService.createExecutionQuery().list();  
  58.         assert (executions.size()==1);  
  59.           
  60.         Execution execution = runtimeService.createExecutionQuery().singleResult();  
  61.         runtimeService.setVariable(execution.getId(), "type", "receiveTask");  
  62.         runtimeService.signal(execution.getId());  
  63.           
  64.         executions = runtimeService.createExecutionQuery().list();  
  65.         assert (executions.size()==1);  
  66.           
  67.         execution = executions.get(0);  
  68.         runtimeService.setVariable(execution.getId(), "oper", mySpringBean.getName());  
  69.         runtimeService.signal(execution.getId());  
  70.     }  
  71. }  

运行程序,结果信息如下所示:

[java]  view plain copy
  1. 011-3-23 18:21:28 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
  2. 信息: Loading XML bean definitions from class path resource [activiti-context.xml]  
  3. 2011-3-23 18:21:29 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
  4. 信息: Loading XML bean definitions from class path resource [org/shirdrn/workflow/activiti/spring/mySpringContext.xml]  
  5.   
  6. ... ...  
  7.   
  8. 2011-3-23 18:21:33 org.shirdrn.workflow.activiti.task.CheckBankReceiveTask execute  
  9. 信息: i am CheckBankReceiveTask.  
  10. in : {protocol=UM32, repository=10.10.38.99:/home/shirdrn/repository, merchant=Merchant[ICBC], maxTransCount=1000000, in={}, out={}}  
  11. 2011-3-23 18:21:33 org.shirdrn.workflow.activiti.task.CheckMerchantReceiveTask execute  
  12. 信息: i am CheckMerchantReceiveTask.  
  13. in : {protocol=UM32, repository=10.10.38.99:/home/shirdrn/repository, merchant=Merchant[ICBC], maxTransCount=1000000, type=receiveTask, in={}, out={}  

上述一部分是加载Spring配置,一部分是流程执行信息。

作者:howareyoutodaysoft 发表于2012-10-10 23:51:29 原文链接
阅读:31 评论:0 查看评论

相关 [activiti spring] 推荐:

Activiti入门篇之二 Spring 与Activiti的入门整合

- - 行业应用 - ITeye博客
Activiti相对Jbpm来说,与Spring整合更加完美,具体可见本文的详细介绍. 1.     Maven的环境任务,请参考第一篇 (Activiti入门篇—Maven的环境准备). 2.     Activiti的Eclipse插件安装.               插件更新地址:http://activiti.org/designer/update/.

Activiti 5.3:配置与Spring整合

- - CSDN博客推荐文章
Activiti 5.3:配置与Spring整合. Activiti 5.3与Spring整合也比较简单,其基本思想就是,通过Spring的IOC容器来管理Activiti的流程引擎实例以及相关服务,可见,主要是基于Activiti在与Spring整合上努力上,做好配置即可. 这里基于前面的的例子来进行,可以参考: Activiti 5.3:流程活动自动与手工触发执行,简单的流程,如图所示:.

Spring + Activiti + Drools整合的请假例子

- - CSDN博客推荐文章
业务规则是这样的(没有实际意义,只是做demo演示). 如果请假总天数大于等于3天,则需要总经理审批,否则不需要总经理审批. 如果当次请假小于3天,则请假总天数等于当次请假天数+2. 否则,请假总天数等于当次请假次数+5. 其中,总的请假次数的计算逻辑交给drools处理. 新建maven项目,目录结构如下:.

Activiti用户指南之Activiti的API

- - ITeye博客
 一、流程引擎的API和服务(services).      引擎的API是影响Activiti最常见的一种方法. 我们一开始最关注的中心是ProcessEngine,像之前描述的那样,流程引擎可以被多种方式创建. 从这个流程引擎里面,你能获得各个包含workflow/BPM方法的服务. 流程引擎和这些获得的服务是线程安全的.

Activiti学习笔记

- - 企业架构 - ITeye博客
第一个Activiti的HelloWorld. 获取核心ProcessEngine对象 2. 根据需求,获取对应的服务实例 3. 使用服务方法,做事情 * * @author Administrator * */ public class HelloWorld {. // 加载核心API ProcessEngine.

Activiti工作流demo

- - CSDN博客综合推荐文章
继上篇《 Activiti工作流的环境配置》.        前几篇对Activiti工作流进行了介绍,并讲解了其环境配置. 本篇将会用一个demo来展示Activiti工作流具体的体现,直接上干货.        以HelloWorld程序为例.       首先说一下业务流程,员工张三提交了一个申请,然后由部门经理李四审核,审核通过后再由总经理王五审核,通过则张三申请成功.

Activiti - 设置会签

- - 企业架构 - ITeye博客
前些天在群里聊工作流和Activiti,群里有人分享了自己的工作流引擎开源项目,大伙纷纷问这问那(比如为什么突然自己搞个process engine、有没有eclipse plugin、能不能绘制流程图等等). 现实生活中的工作流程,我们也经常碰到需要会签的情况,支持会签是很必要的. 正好有两个人问道:支持会签吗.

activiti工作流使用

- - 行业应用 - ITeye博客
activiti 开发流程. JBPM 与 Activiti. jBPM项目于2002年3月由Tom Baeyens发起,2003年12月发布1.0版本. 2004年10月18日,发布了2.0版本,并在同一天加入了JBoss. 2011 年 jBPM的创建者Tom Baeyens离开JBoss了, 他的离开产生了两个结果:.

ACTIVITI 学习笔记 - 监听

- - 企业架构 - ITeye博客
ACTIVITI 学习笔记 - 监听. 所有分发的事件都是org.activiti.engine.delegate.event.ActivitiEvent的子类. 监听器监听的流程引擎已经创建完毕,并准备好接受API调用. 监听器监听的流程引擎已经关闭,不再接受API调用. 创建了一个新实体,初始化也完成了.

Activiti安装配置(转)

- - 企业架构 - ITeye博客
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/38655311. 有一段时间没有更新文章了,虽然有一直在写文章,可是一直没有更新到博客内,这段时间写的文章大多还是以技术为主. 接下来的系列文章将会来讨论企业工作流的开发,主要是来研究开源工作流Activiti的使用.