本文主要是介绍Spring与JBPM整合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
整合的先后顺序是关键,下面按照顺序一步一步来设置:
1.首先jbpm是依赖数据库的,所以可以先创建数据库,我是mysql数据库,所以到jbpm-4.4\install\src\db\create中找到jbpm.mysql.create.sql创建文件导入mysql执行!
2.设置spring中hibernate的配置:
可以参考:jbpm-4.4\install\src\cfg\hibernate\spring中的mysql.hibernate.cfg.xml(具体见下面的spring配置文件applicationContext.xml)
3.设置事务,这里由于hibernate和ibatis必须用一个事务,所以使用了TransactionAwareDataSourceProxy来管理事务。(具体见下面的spring配置文件applicationContext.xml)
4.配置默认jbpm的cfg文件,在classpath下创建一个jbpm.cfg.xml,内容如下:
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
05 | < import resource = "jbpm.default.cfg.xml" /> |
06 | < import resource = "jbpm.businesscalendar.cfg.xml" /> |
08 | < import resource = "jbpm.tx.spring.cfg.xml" /> |
09 | < import resource = "jbpm.jpdl.cfg.xml" /> |
10 | < import resource = "jbpm.bpmn.cfg.xml" /> |
11 | < import resource = "jbpm.identity.cfg.xml" /> |
5.在spring配置文件中注入工作流引擎。(具体见下面的spring配置文件applicationContext.xml)
2 | < bean id = "springHelper" class = "org.jbpm.pvm.internal.processengine.SpringHelper" /> |
3 | < bean id = "processEngine" factory-bean = "springHelper" factory-method = "createProcessEngine" /> |
6.搞定以上配置文件后添加jbpm.jar, juel-api.jar,juel-engine.jar,juel-impl.jar,mail.jar,这里注意一下,可能有的朋友之后运行还会有错误如下:
java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
这是因为struts2的anltr-2.7.2.jar过旧导致的,我们为了省掉麻烦这里最好直接把struts2的antlr.jar去掉(windows---preferences---在文本框中搜索struts 2(中间有空格)---选择struts 2---选择antlr---remove),然后重新到发布到服务器的lib目录下删除anltr-2.7.2.jar即可。
7.成功的关键就是applicationContext.xml了,这里把这个关键配置贴出来!
001 | <? xml version = "1.0" encoding = "UTF-8" ?> |
002 | < beans xmlns = "http://www.springframework.org/schema/beans" |
003 | xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:p = "http://www.springframework.org/schema/p" xmlns:context = "http://www.springframework.org/schema/context" |
004 | xmlns:aop = "http://www.springframework.org/schema/aop" |
005 | xsi:schemaLocation="http://www.springframework.org/schema/beans |
006 | http://www.springframework.org/schema/beans/spring-beans-2.5.xsd |
007 | http://www.springframework.org/schema/aop |
008 | http://www.springframework.org/schema/aop/spring-aop-2.5.xsd |
009 | http://www.springframework.org/schema/context |
010 | http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-autowire = "byName" > |
012 | < context:property-placeholder location = "classpath*:database.properties" /> |
017 | < bean id = "springHelper" class = "org.jbpm.pvm.internal.processengine.SpringHelper" /> |
018 | < bean id = "processEngine" factory-bean = "springHelper" factory-method = "createProcessEngine" /> |
021 | < bean id = "dataSource" |
022 | class = "org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy" |
023 | p:targetDataSource-ref = "dynamicDataSource" /> |
026 | < bean id = "dynamicDataSource" class = "com.xuyi.support.DynamicDataSource" > |
027 | < property name = "targetDataSources" > |
028 | < map key-type = "java.lang.String" > |
029 | < entry key = "dataSource" value-ref = "dataSourceJDBC" /> |
035 | < bean id = "dataSourceJDBC" class = "com.mchange.v2.c3p0.ComboPooledDataSource" |
036 | destroy-method = "close" p:driverClass = "${jdbc.driverClass}" p:jdbcUrl = "${jdbc.jdbcUrl}" |
037 | p:user = "${jdbc.user}" p:password = "${jdbc.password}" p:initialPoolSize = "${c3p0.initialPoolSize}" |
038 | p:minPoolSize = "${c3p0.minPoolSize}" p:maxPoolSize = "${c3p0.maxPoolSize}" |
039 | p:acquireIncrement = "${c3p0.acquireIncrement}" p:maxIdleTime = "${c3p0.maxIdleTime}" |
040 | p:maxStatements = "${c3p0.maxStatements}" lazy-init = "true" /> |
044 | < bean id = "sessionFactory" |
045 | class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" > |
046 | < property name = "dataSource" > |
047 | < ref bean = "dataSource" /> |
049 | < property name = "hibernateProperties" > |
051 | < prop key = "hibernate.dialect" >org.hibernate.dialect.MySQLInnoDBDialect</ prop > |
052 | < prop key = "hibernate.hbm2ddl.auto" >update</ prop > |
053 | < prop key = "hibernate.format_sql" >true</ prop > |
056 | < property name = "mappingLocations" > |
058 | < value >classpath*:com/xuyi/modal/Creater.hbm.xml</ value > |
059 | < value >classpath*:com/xuyi/modal/Month.hbm.xml</ value > |
060 | < value >classpath*:com/xuyi/modal/Thing.hbm.xml</ value > |
061 | < value >classpath*:jbpm.repository.hbm.xml</ value > |
062 | < value >classpath*:jbpm.execution.hbm.xml</ value > |
063 | < value >classpath*:jbpm.history.hbm.xml</ value > |
064 | < value >classpath*:jbpm.task.hbm.xml</ value > |
065 | < value >classpath*:jbpm.identity.hbm.xml</ value > |
069 | < property name = "useTransactionAwareDataSource" value = "true" ></ property > |
073 | < bean id = "sqlMapClient" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" > |
074 | < property name = "dataSource" ref = "dataSource" ></ property > |
075 | < property name = "configLocation" value = "classpath:sql-map-config.xml" ></ property > |
079 | < bean id = "transactionManager" |
080 | class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" > |
081 | < property name = "dataSource" ref = "dataSource" /> |
086 | < bean id = "transactionProxy" abstract = "true" |
087 | class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" > |
088 | < property name = "transactionManager" > |
089 | < ref bean = "transactionManager" /> |
091 | < property name = "transactionAttributes" > |
093 | < prop key = "get*" >PROPAGATION_REQUIRED,readOnly</ prop > |
094 | < prop key = "find*" >PROPAGATION_REQUIRED,readOnly</ prop > |
095 | < prop key = "*" >PROPAGATION_REQUIRED</ prop > |
database.properties:
01 | jdbc.driverClass=com.mysql.jdbc.Driver |
02 | jdbc.jdbcUrl=jdbc:mysql://localhost:3306/myweb |
07 | c3p0.initialPoolSize=1 |
10 | c3p0.acquireIncrement=5 |
注意:这里会遇到一个类:
com.xuyi.support.DynamicDataSource这类实现了多数据源管理。如下:
01 | package com.xuyi.support; |
03 | import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; |
05 | public class DynamicDataSource extends AbstractRoutingDataSource { |
07 | private static ThreadLocal<String> local = new ThreadLocal<String>(); |
10 | protected Object determineCurrentLookupKey() { |
11 | return local.get() == null ? "dataSource" : local.get(); |
19 | public static void setRoute(String route) { |
20 | if (route== null || route.equals( "" )){ |
8.终于可以开始测试了,先创建一个发布用的xml放入classpath:
测试用的流程swing.jpdl.xml
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
02 | < process name = "swing" xmlns = "http://jbpm.org/4.3/jpdl" > |
03 | < start g = "94,64,48,48" name = "start1" > |
04 | < transition g = "-52,-22" name = "A" to = "A" /> |
06 | < task assignee = "A" g = "73,195,92,52" name = "A" > |
07 | < transition g = "-52,-22" name = "B" to = "B" /> |
09 | < task assignee = "B" g = "266,192,92,52" name = "B" > |
10 | < transition g = "-40,-21" name = "end" to = "end1" /> |
12 | < end g = "290,327,48,48" name = "end1" /> |
然后写一个测试类进行测试:
01 | package com.xuyi.test; |
03 | import java.util.List; |
05 | import org.jbpm.api.ExecutionService; |
06 | import org.jbpm.api.ProcessEngine; |
07 | import org.jbpm.api.ProcessInstance; |
08 | import org.jbpm.api.TaskService; |
09 | import org.jbpm.api.task.Task; |
10 | import org.springframework.context.support.ClassPathXmlApplicationContext; |
12 | public class TestJbpm{ |
13 | public static void main(String[] args) { |
14 | ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml" ); |
15 | applicationContext.start(); |
16 | ProcessEngine processEngine = (ProcessEngine)applicationContext.getBean( "processEngine" ); |
17 | ExecutionService executionService = processEngine.getExecutionService(); |
18 | TaskService taskService = processEngine.getTaskService(); |
21 | String deploymentId = processEngine.getRepositoryService().createDeployment() |
22 | .addResourceFromClasspath( "swing.jpdl.xml" ).deploy(); |
23 | System.out.println( "流程发布ID:" +deploymentId); |
26 | ProcessInstance processInstance = executionService.startProcessInstanceByKey( "swing" ); |
27 | System.out.println( "流程实例ID:" + processInstance.getId()); |
31 | List<Task> taskList_A = taskService.findPersonalTasks( "A" ); |
32 | System.out.println( "A待处理任务数:" + taskList_A.size()); |
33 | if (taskList_A.size() > 0 ){ |
34 | for (Task task : taskList_A){ |
35 | System.out.println(task.getId()); |
36 | taskService.completeTask(task.getId()); |
41 | List<Task> taskList_B = taskService.findPersonalTasks( "B" ); |
42 | System.out.println( "B待处理任务数:" + taskList_B.size()); |
43 | if (taskList_B.size() > 0 ){ |
44 | for (Task task : taskList_B){ |
45 | System.out.println(task.getId()); |
46 | taskService.completeTask(task.getId()); |
一切顺利的话就可以看到具体打印了!!关于jbpm的xml专用设计插件,可以看我以前的
在Myeclipse8.6安装JBPM插件
这篇文章。这样设计好xml就可以发布给jbpm进行工作流处理了。
这篇关于Spring与JBPM整合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!