Spring集成Activiti工作流

  • ProcessEngineFactoryBean
  • 事务
  • 表达式
  • 资源自动部署
  • 单元测试
  • 基于注解的配置
  • JPA和Hibernate

想了解更多精彩内容,快来关注攻城狮Chova

打开网易新闻 查看更多图片

Spring使用Activiti提供了一些非常不错的集成特性,只在Activiti与Spring集成时使用

ProcessEngineFactoryBean

  • 可以把流程引擎(ProcessEngine)作为一个普通的Spring bean进行配置
  • org.activiti.spring.ProcessEngineFactoryBean是集成的切入点,这个bean需要一个流程引擎配置来创建流程引擎
  • Spring集成的配置和流程引擎bean,使用的processEngineConfiguration beanorg.activiti.spring.SpringProcessEngineConfiguration

事务

  • 使用这个例子的Spring配置文件SpringTransactionIntegrationTest-context.xml:
  • dataSource: 数据源
  • transactionManager: 事务管理器
  • processEngine: 流程引擎
  • Activiti引擎服务
  • 为了确保在Spring配置中声明的一个TransactionAwareDataSourceProxy,不能把使用它的应用交给Spring事物控制的资源(例如DataSourceTransactionManagerJPATransactionManager需要非代理的数据源)
  • 首先使用任意的一种Spring创建应用上下文的方式创建其Spring应用上下文。可以使用类路径下面的XML资源来配置我们的Spring应用上下文
  • 然后我们就可以得到Activiti的服务beans并且调用该服务上面的方法,ProcessEngineFactoryBean将会对该服务添加一些额外的拦截器,在Activiti服务上面的方法使用的是Propagation.REQUIRED事物语义。 可以使用repositoryService去部署一个流程:
  • 其他相同的服务也是同样可以这么使用。在这个例子中,Spring的事务将会围绕在userBean.hello()上,并且调用Activiti服务的方法也会加入到这个事务中
  • 在上面Spring bean的配置中把repositoryService注入到userBean中

表达式

  • 当使用ProcessEngineFactoryBean时候,默认情况下,在BPMN流程中的所有表达式都将会“看见”所有的Spring beans. 可以限制在表达式中暴露出的beans或者甚至可以在配置中使用一个Map不暴露任何beans
  • 想要不暴露任何beans,只需要在SpringProcessEngineConfiguration中传递一个空的list作为’beans’的属性。 当不设置’beans’的属性时,在应用上下文中Spring beans都是可以使用的
  • 下面的例子暴露了一个单例bean(printer),可以把“printer”当作关键字使用
  • 现在暴露出来的beans就可以在表达式中使用:例如,在SpringTransactionIntegrationTest中的hello.bpmn20.xml展示的是如何使用UEL方法表达式去调用Spring bean的方法

资源自动部署

  • Spring的集成有专门针对对资源部署的特性
  • 在流程引擎的配置中,可以指定一组资源,当流程引擎被创建的时候,所有在这里的资源都将会被自动扫描与部署
  • 在这里有过滤以防止资源重新部署,只有当这个资源真正发生改变的时候,它才会向Activiti使用的数据库创建新的部署。
  • 针对于很多用例来说,当Spring容器经常重启的情况下,使用是非常不错的选择

默认情况下,上面的配置会把所有匹配的资源发布到Activiti引擎的一个单独发布包下。用来检测防止未修改资源重复发布的机制会作用到整个发布包中

有时候,这可能不是想要的。比如,如果你发布了很多流程资源,但是只修改里其中某一个单独的流程定义,整个发布包都会被认为变更了,导致整个发布包下的所有流程定义都会被重新发布,结果就是每个流程定义都生成了新版本,虽然其中只有一个流程发生了改变

  • 为了定制发布方式, 可以为SpringProcessEngineConfiguration指定一个额外的参数deploymentMode. 这个参数指定了匹配多个资源时的发布处理方式。 默认下这个参数支持设置三个值:default: 把所有资源放在一个单独的发布包中,对这个发布包进行重复检测。这是默认值,如果你没有指定参数值,就会使用它single-resource: 为每个单独的资源创建一个发布包,并对这些发布包进行重复检测。你可以单独发布每个流程定义,并在修改流程定义后只创建一个新的流程定义版本resource-parent-folder: 把放在同一个上级目录下的资源发布在一个单独的发布包中,并对发布包进行重复检测。当需要多资源时需要创建发布包;但是需要根据共同的文件夹来组合一些资源时,可以使用
  • deploymentMode参数配置为single-resource的情况:
  • 如果想使用上面三个值之外的参数值,你需要自定义处理发布包的行为。可以创建一个SpringProcessEngineConfiguration的子类,重写getAutoDeploymentStrategy(String deploymentMode)方法。 这个方法中处理了对应deploymentMode的发布策略

单元测试

  • 当集成Spring时,使用标准的Activiti测试工具类是非常容易地对业务流程进行测试:
  • 对于这种方式,需要在Spring配置中定义一个org.activiti.engine.test.ActivitiRulebean

打开网易新闻 查看更多图片

基于注解的配置

除了基于XML的配置以外,还可以选择基于注解的方式来配置Spring环境。这与使用XML的方法非常相似,除了要使用@Bean注解。而且配置是使用java编写的, 可以直接用于Activiti-Spring的集成

  • @EnableActiviti: 会创建一个Spring环境,并对Activiti流程引擎进行配置默认的内存H2数据库,启用数据库自动升级一个简单的DataSourceTransactionManager一个默认的SpringJobExecutor自动扫描processes/ 目录下的bpmn20.xml文件
  • 可以直接通过注入操作Activiti引擎:
  • 默认值都可以自定义:
  • 如果配置了DataSource,就会代替默认创建的数据库配置
  • 事务管理器,ob执行器和其他组件都与之相同

其他数据库会代替默认的

  • 注意AbstractActivitiConfigurer用法,它暴露了流程引擎的配置,可以用来对它的细节进行详细的配置:

JPA和Hibernate

  • 在Activiti引擎的serviceTasklistener中使用Hibernate 4.2.x JPA时,需要添加Spring ORM依赖,Hibernate 4.1.x及以下版本是不需要的