jbpm4.4 spring整合

jBPM-4.4与Spring集成配置比较容易,这里我使用的是Spring-2.5.6,数据库连接池使用C3P0,将相关的两个jar文件加入到CLASSPATH中。

jBPM-4.4与Spring集成的配置过程说明如下。

配置

1、修改jbpm.cfg.xml配置文件

将jbpm.cfg.xml文件中<import resource="jbpm.tx.hibernate.cfg.xml" />一行,修改为 <import resource="jbpm.tx.spring.cfg.xml" />,我们使用Spring的事务管理器,修改后配置文件内容为:

[xhtml] view plaincopy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <jbpm-configuration>
  3. <import resource="jbpm.default.cfg.xml" />
  4. <import resource="jbpm.businesscalendar.cfg.xml" />
  5. <!-- <import resource="jbpm.tx.hibernate.cfg.xml" /> -->
  6. <import resource="jbpm.tx.spring.cfg.xml" />
  7. <import resource="jbpm.jpdl.cfg.xml" />
  8. <import resource="jbpm.bpmn.cfg.xml" />
  9. <import resource="jbpm.identity.cfg.xml" />
  10. <!-- Job executor is excluded for running the example test cases. -->
  11. <!-- To enable timers and messages in production use, this should be included. -->
  12. <!--
  13. <import resource="jbpm.jobexecutor.cfg.xml" />
  14. -->
  15. </jbpm-configuration>

2、修改Spring的applicationContext.xml配置文件

配置文件内容如下所示:

[xhtml] view plaincopy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  6. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
  7. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
  8. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
  9. destroy-method="close">
  10. <property name="driverClass" value="com.mysql.jdbc.Driver" />
  11. <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/jbpmdb" />
  12. <property name="user" value="jbpm" />
  13. <property name="password" value="jbpm" />
  14. <property name="initialPoolSize" value="3" />
  15. <property name="minPoolSize" value="3" />
  16. <property name="maxPoolSize" value="50" />
  17. <property name="maxIdleTime" value="600" />
  18. <property name="maxStatements" value="100" />
  19. <property name="acquireIncrement" value="3" />
  20. </bean>
  21. <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
  22. <bean id="processEngine" factory-bean="springHelper"
  23. factory-method="createProcessEngine" />
  24. <!--Hibernate SessionFatory -->
  25. <bean id="sessionFactory"
  26. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  27. <property name="dataSource" ref="dataSource" />
  28. <property name="mappingResources">
  29. <list>
  30. <value>jbpm.repository.hbm.xml</value>
  31. <value>jbpm.execution.hbm.xml</value>
  32. <value>jbpm.history.hbm.xml</value>
  33. <value>jbpm.task.hbm.xml</value>
  34. <value>jbpm.identity.hbm.xml</value>
  35. </list>
  36. </property>
  37. <property name="hibernateProperties">
  38. <props>
  39. <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
  40. <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
  41. <prop key="hibernate.show_sql">true</prop>
  42. </props>
  43. </property>
  44. </bean>
  45. <!-- Transaction Manager -->
  46. <bean id="transactionManager"
  47. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  48. <property name="sessionFactory" ref="sessionFactory" />
  49. <property name="dataSource" ref="dataSource" />
  50. </bean>
  51. </beans>

这里使用MySQL作为流程数据库,需要在dataSource的bean中配置,其他的配置内容非常容易理解。这里面,我们最终的目标是通过 Spring的IOC容器来管理jBPM引擎的创建,即在应用中获取到一个org.jbpm.api.ProcessEngine实例即可,在一个应用中 通常只有一个流程引擎实例,然后通过这个实例就可以获取到流程提供的6种基本服务:

org.jbpm.api.RepositoryService
org.jbpm.api.ExecutionService
org.jbpm.api.ManagementService
org.jbpm.api.TaskService
org.jbpm.api.HistoryService
org.jbpm.api.IdentityService
一般情况下,在开发中不要将org.jbpm.api.ProcessEngine实例暴露给实际开发者,而只是暴露出引擎提供的服务即可。

测试验证

我们测试用例的流程定义如图所示:

对应的流程定义文件内容如下所示:

[xhtml] view plaincopy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <process name="MyExample" xmlns="http://jbpm.org/4.4/jpdl">
  3. <on event="start">
  4. <event-listener class="com.umpay.workflow.jbpm.listener.StartupListener">
  5. <field name="status">
  6. <string value="startup check..."/>
  7. </field>
  8. </event-listener>
  9. </on>
  10. <start g="354,6,48,48">
  11. <transition g="-102,-16" name="to start decision" to="start decision">
  12. <event-listener class="com.umpay.workflow.jbpm.listener.InitializationListener">
  13. <field name="initialized">
  14. <string value="initialize..."/>
  15. </field>
  16. </event-listener>
  17. </transition>
  18. </start>
  19. <decision g="413,107,48,48" name="start decision">
  20. <handler class="com.umpay.workflow.jbpm.decision.StartDecision" />
  21. <transition g="-83,-17" name="to check user" to="check user"/>
  22. <transition g="-48,-25" name="to error" to="error"/>
  23. </decision>
  24. <state g="216,183,104,52" name="check user">
  25. <on event="start">
  26. <event-listener class="com.umpay.workflow.jbpm.listener.CheckUserListener">
  27. <field name="state">
  28. <string value="Check user state..."/>
  29. </field>
  30. </event-listener>
  31. </on>
  32. <transition g="-128,-8" name="to decide check user" to="decide check user result"/>
  33. </state>
  34. <decision g="359,271,48,48" name="decide check user result">
  35. <handler class="com.umpay.workflow.jbpm.decision.CheckUserDecision" />
  36. <transition g="-95,-17" name="to check mobile" to="check mobile"/>
  37. <transition g="-41,14" name="to error" to="error"/>
  38. </decision>
  39. <state g="215,349,104,52" name="check mobile">
  40. <on event="start">
  41. <event-listener class="com.umpay.workflow.jbpm.listener.CheckMobileListener">
  42. <field name="online">
  43. <string value="Check mobile number..."/>
  44. </field>
  45. </event-listener>
  46. </on>
  47. <transition g="-146,-6" name="to decide check mobile" to="decide check mobile result"/>
  48. </state>
  49. <decision g="337,435,48,48" name="decide check mobile result">
  50. <handler class="com.umpay.workflow.jbpm.decision.CheckMobileDecision" />
  51. <transition g="-98,-21" name="to do transaction" to="do transaction"/>
  52. <transition g="-39,9" name="to error" to="error"/>
  53. </decision>
  54. <state g="217,516,112,52" name="do transaction">
  55. <on event="start">
  56. <event-listener class="com.umpay.workflow.jbpm.listener.DoTransactionListener">
  57. <field name="operation">
  58. <string value="Do transaction..."/>
  59. </field>
  60. </event-listener>
  61. </on>
  62. <transition g="-101,-17" name="to last decision" to="last decision"/>
  63. </state>
  64. <decision g="312,599,48,48" name="last decision">
  65. <handler class="com.umpay.workflow.jbpm.decision.DoTransactionDecision" />
  66. <transition g="-41,-17" name="to end" to="end"/>
  67. <transition g="-41,-1" name="to error" to="error"/>
  68. </decision>
  69. <end-error g="475,675,48,48" name="error"/>
  70. <end g="242,675,48,48" name="end">
  71. <on event="start">
  72. <event-listener class="com.umpay.workflow.jbpm.listener.ShutdownHookListener">
  73. <field name="saveThings">
  74. <string value="S:shutdown..."/>
  75. </field>
  76. </event-listener>
  77. </on>
  78. </end>
  79. </process>

基于该流程定义,实现的测试用例如下所示:

[java] view plaincopy

    1. package com.umpay.workflow.jbpm.process;
    2. import junit.framework.TestCase;
    3. import org.jbpm.api.Execution;
    4. import org.jbpm.api.ProcessEngine;
    5. import org.jbpm.api.ProcessInstance;
    6. import org.springframework.context.support.ClassPathXmlApplicationContext;
    7. public class MyProcessWithSpringTest extends TestCase {
    8. private ProcessEngine processEngine;
    9. String deploymentId;
    10. protected void setUp() throws Exception {
    11. super.setUp();
    12. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
    13. "applicationContext.xml");
    14. ctx.start();
    15. this.processEngine = (ProcessEngine) ctx.getBean("processEngine");
    16. deploymentId = this.processEngine
    17. .getRepositoryService()
    18. .createDeployment()
    19. .addResourceFromClasspath(
    20. "com/umpay/workflow/jbpm/process/process.jpdl.xml")
    21. .deploy();
    22. }
    23. protected void tearDown() throws Exception {
    24. this.processEngine.getRepositoryService().deleteDeploymentCascade(
    25. deploymentId);
    26. super.tearDown();
    27. }
    28. public void testMyProcess() {
    29. // start a process instance
    30. ProcessInstance processInstance = this.processEngine
    31. .getExecutionService().startProcessInstanceByKey("MyExample");
    32. // state : check user
    33. assertEquals("check user", processInstance.findActiveActivityNames()
    34. .iterator().next());
    35. Execution execution = processInstance
    36. .findActiveExecutionIn("check user");
    37. // state : check mobile
    38. processInstance = this.processEngine.getExecutionService()
    39. .signalExecutionById(execution.getId());
    40. execution = processInstance.findActiveExecutionIn("check mobile");
    41. assertEquals("check mobile", processInstance.findActiveActivityNames()
    42. .iterator().next());
    43. // state : do transaction
    44. processInstance = this.processEngine.getExecutionService()
    45. .signalExecutionById(execution.getId());
    46. execution = processInstance.findActiveExecutionIn("do transaction");
    47. assertEquals("do transaction", processInstance
    48. .findActiveActivityNames().iterator().next());
    49. processInstance = this.processEngine.getExecutionService()
    50. .signalExecutionById(execution.getId());
    51. assertEquals(true, processInstance.findActiveActivityNames().isEmpty());
    52. // ended
    53. assertEquals(Execution.STATE_ENDED, processInstance.getState());
    54. }
    55. }
时间: 2024-11-12 16:03:26

jbpm4.4 spring整合的相关文章

【整合篇】JBPM4.4与Spring整合

我们大家都知道容器的好处,那么工作流也提供了与spring整合的方式,将工作流引擎由spring容器统一管理起来,共同拥有容器的特性.下面来从代码的角度来看看整合与不整合的对比: 未整合: 引入相应的jar包,使用hibernate来持久化 配置文件: jbpm.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <jbpm-configuration> <import resource=&q

springMVC+MyBatis+Spring 整合(3)

spring mvc 与mybatis 的整合. 加入配置文件: spring-mybaits.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" xm

Spring整合Struts2

Spring整合Struts21整合目的:让Spring的IOC容器去管理Struts2的Action, 2Struts2是web开源框架,Spring要整合Struts2,也就是说要在web应用使用Spring①. 需要额外加入的 jar 包:spring-web-4.0.0.RELEASE.jarspring-webmvc-4.0.0.RELEASE.jar ②. Spring 的配置文件, 和非 WEB 环境没有什么不同 ③. 需要在 web.xml 文件中加入如下配置: <!-- 配置

Spring整合hibernate4:事务管理

Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTransaction,commit,这些都是重复的工作,我们可以把事务管理部分交给spring框架完成. 配置事务(xml方式) 使用spring管理事务后在dao中不再需要调用beginTransaction和commit,也不需要调用session.close(),使用API  sessionFactory.getCurrentSession()来

springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640人阅读 评论(1) 收藏 举报 用的是 SSM3的框架 Spring MVC 3.1 + Spring 3.1 + Mybatis3.1第一种情况:Spring MVC 和 Spring 整合的时候,SpringMVC的springmvc.xml文件中 配置扫描包,不要包含 service的注解,S

Spring整合MyBatis

首先下载jar包  mybatis-spring.jar 原因spring3.0出来的早,MyBatis3.0晚,意味着Spring不愿意去在一个没有做出发布版本的MyBatis上做过多的设置.所以,最终jar包提供者第三方. <!--Mybatis+Spring整合--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId&g

JMS 之 Active MQ 的spring整合

一.与spring整合实现ptp的同步接收消息 pom.xml: <!-- https://mvnrepository.com/artifact/org.springframework/spring-jms --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>4.3.7.RE

8 -- 深入使用Spring -- 7...2 MVC框架与Spring整合的思考

8.7.2 MVC 框架与Spring整合的思考 对于一个基于B/S架构的JAVA EE 应用而言,用户请求总是向MVC框架的控制器请求,而当控制器拦截到用户请求后,必须调用业务逻辑组件来处理用户请求.此时有一个问题:控制器应该如何获得业务逻辑组件? 最容易想到的策略是,直接通过new 关键字创建业务逻辑组件,然后调用业务逻辑组件的方法,根据业务逻辑方法的返回值确定结果. 在实际的应用中,很少见到采用上面的访问策略,因为这是一种非常差的策略.不这样做至少有如下三个原因: ⊙ 控制器直接创建业务逻

Spring整合strus2简单应用总结

本身strus2没接触过,所以这块学的一知半解,正常不整合的还没学(接着学) step: 1.创建web工程 2.在/WEB-INF/lib引入jar包 asm-3.3.jarasm-commons-3.3.jarasm-tree-3.3.jarcom.springsource.net.sf.cglib-2.2.0.jarcom.springsource.org.aopalliance-1.0.0.jarcom.springsource.org.aspectj.weaver-1.6.8.RELE