今天演示的JBPM的启动,说明一下JBPM的启动过程。以及简单的和Spring集成。
程序采用的是TestCase方式来演示的,当然Web应用是很重要的,但是其实在Web应用上只要自己写几个类就可以把Spring和JBPM对接起来使用了,所以后面大部分都将使用TestCase,小部分会有Web的例子,希望大家理解。
所有的例子我都会做在一个工程里,所以这个工程的打包文件,我会不断的更新,请大家下载。
需要准备的东西:
JBPM SDK,从JBPM官网上下载。
Eclipse,开发环境,插件(可选)包括:Spring、M2Eclipse(Maven)、WST(WebStandardTools)
jar依赖,如果多ant和maven熟悉的朋友推荐用maven下载,如果不熟悉的,请看附件包里面的dependencies.txt文件列表,然后去下载,谢谢。
数据库,采用HSQLDb来演示,已经包含在工程的lib下了。
范例工程:JBPMSamples.zip
JBPM启动过程简要说明:
- JBPM启动,其实就是JBPM获取需要的配置以及依赖的组件(主要是Hiberante)的配置。
- 环境中一些文件来源和修改的说明:
- src/hibernate.cfg.xml:jbpm-jpdl-3.2.GA\config\hibernate.cfg.xml,由于不使用identity部分所以,注释掉配置里“identity mappings”的部分
- src/log4j.xml:jbpm-jpdl-3.2.GA\config\log4j.cfg.xml,修改了部分配置。
- res/jbpm.jpdl.hsqldb.sql:拷贝自jbpm-jpdl-3.2.GA\db\jbpm.jpdl.hsqldb.sql,给每句后面加上逗号,然后使用build.xml中任务initDb.hsqldb对数据库执行初始化。
- 样例代码:com.cnblogs.seewood.s01.ConfigurationTests:基于JUnit的测试范例,载入配置文件。
- 样例代码:com.cnblogs.seewood.s02.ConfigurationSpringTests:结合Spring的调用。
下面贴一些代码的样例:
com.cnblogs.seewood.s01.ConfigurationTests
1package com.cnblogs.seewood.s01;
2
3import org.apache.commons.logging.Log;
4import org.apache.commons.logging.LogFactory;
5import org.hibernate.Session;
6import org.jbpm.JbpmConfiguration;
7import org.jbpm.JbpmContext;
8
9import junit.framework.TestCase;
10
11public class ConfigurationTests extends TestCase {
12 private final Log logger = LogFactory.getLog(this.getClass());
13
14 public void testSimpleProcessInMemory() {
15 JbpmConfiguration cfg;
16/*
17 // 载入配置的方法有很多,这里仅举几个常见例子
18 // JbpmConfiguration构造时,会先载入
19 // classpath:org/jbpm/default.jbpm.cfg.xml中的配置,
20 // 然后根据用户指定位置载入配置信息
21 // 用户自定义配置信息将会覆盖default.jbpm.cfg.xml的内容。
22 // 默认配置读取classpath:hiberante.cfg.xml
23
24 // 默认名称的载入配置,即classpath:jbpm.cfg.xml,
25 cfg = JbpmConfiguration.getInstance();
26
27 // 先载入classpath:org/jbpm/default.jbpm.cfg.xml中的配置
28 // 再从指定名称的载入配置
29 cfg = JbpmConfiguration.getInstance("jbpm-cfg.xml");
30
31 // 从XML字符串构造配置
32 cfg = JbpmConfiguration.parseXmlString(
33 "<jbpm-configuration>" +
34 " <string name=\"resource.hibernate.cfg.xml\" " +
35 " value=\"cn/horncomb/bpm/jbpm/hibernate.cfg.xml\" />" +
36 "</jbpm-configuration>");
37*/
38 // Spring测试类,默认采用Auto-wire,即从ApplicationContext中获取名称匹配的bean,
39 // 自动注入。jbpmConfiguration就会自动注入的。
40 // applicationContext-jbpm.xml 中定义了bean: jbpmConfiguration.
41
42 cfg = JbpmConfiguration.getInstance("com/cnblogs/seewood/s01/jbpm.cfg.xml");
43 assertNotNull(cfg);
44 this.logger.info("成功创建Jbpm配置信息");
45
46 JbpmContext ctx = cfg.createJbpmContext();
47 assertNotNull(ctx);
48 this.logger.info("成功创建JbpmContext");
49
50 // 注意日志的输入,当第一次获取session的时候才初始化hibernate的配置。
51 Session s = ctx.getSession();
52 assertNotNull(s);
53 this.logger.info("成功创建Hibernate Session");
54
55 // 以后获取时,hibernate不会需要再初始化,所以这种情况用spring就更好了
56 ctx.getSession();
57 this.logger.info("再次获取Session");
58 }
59}
60
2
3import org.apache.commons.logging.Log;
4import org.apache.commons.logging.LogFactory;
5import org.hibernate.Session;
6import org.jbpm.JbpmConfiguration;
7import org.jbpm.JbpmContext;
8
9import junit.framework.TestCase;
10
11public class ConfigurationTests extends TestCase {
12 private final Log logger = LogFactory.getLog(this.getClass());
13
14 public void testSimpleProcessInMemory() {
15 JbpmConfiguration cfg;
16/*
17 // 载入配置的方法有很多,这里仅举几个常见例子
18 // JbpmConfiguration构造时,会先载入
19 // classpath:org/jbpm/default.jbpm.cfg.xml中的配置,
20 // 然后根据用户指定位置载入配置信息
21 // 用户自定义配置信息将会覆盖default.jbpm.cfg.xml的内容。
22 // 默认配置读取classpath:hiberante.cfg.xml
23
24 // 默认名称的载入配置,即classpath:jbpm.cfg.xml,
25 cfg = JbpmConfiguration.getInstance();
26
27 // 先载入classpath:org/jbpm/default.jbpm.cfg.xml中的配置
28 // 再从指定名称的载入配置
29 cfg = JbpmConfiguration.getInstance("jbpm-cfg.xml");
30
31 // 从XML字符串构造配置
32 cfg = JbpmConfiguration.parseXmlString(
33 "<jbpm-configuration>" +
34 " <string name=\"resource.hibernate.cfg.xml\" " +
35 " value=\"cn/horncomb/bpm/jbpm/hibernate.cfg.xml\" />" +
36 "</jbpm-configuration>");
37*/
38 // Spring测试类,默认采用Auto-wire,即从ApplicationContext中获取名称匹配的bean,
39 // 自动注入。jbpmConfiguration就会自动注入的。
40 // applicationContext-jbpm.xml 中定义了bean: jbpmConfiguration.
41
42 cfg = JbpmConfiguration.getInstance("com/cnblogs/seewood/s01/jbpm.cfg.xml");
43 assertNotNull(cfg);
44 this.logger.info("成功创建Jbpm配置信息");
45
46 JbpmContext ctx = cfg.createJbpmContext();
47 assertNotNull(ctx);
48 this.logger.info("成功创建JbpmContext");
49
50 // 注意日志的输入,当第一次获取session的时候才初始化hibernate的配置。
51 Session s = ctx.getSession();
52 assertNotNull(s);
53 this.logger.info("成功创建Hibernate Session");
54
55 // 以后获取时,hibernate不会需要再初始化,所以这种情况用spring就更好了
56 ctx.getSession();
57 this.logger.info("再次获取Session");
58 }
59}
60
1package com.cnblogs.seewood.s02;
2
3import org.hibernate.Session;
4import org.hibernate.SessionFactory;
5import org.jbpm.JbpmConfiguration;
6import org.jbpm.JbpmContext;
7import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
8
9/**
10 * 简单流程测试
11 * @author seewood
12 * @version $LastChangedRevision$
13 */
14public class ConfigurationSpringTests
15 extends AbstractTransactionalDataSourceSpringContextTests {
16 private JbpmConfiguration jbpmConfiguration;
17 private SessionFactory sessionFactory;
18
19 @Override
20 protected String getConfigPath() {
21 // 返回配置文件路径(相对与classpath)
22 return "/applicationContext.xml";
23 }
24
25 @Override
26 protected boolean isRollback() {
27 // 默认为true,即是测试完毕后事务全部rollback
28 return super.isRollback();
29 }
30
31 public void testInitJbpmConfiguration() {
32 JbpmConfiguration cfg;
33 // Spring测试类,默认采用Auto-wire,即从ApplicationContext中获取名称匹配的bean,
34 // 自动注入。jbpmConfiguration就会自动注入的。
35 // applicationContext-jbpm.xml 中定义了bean: jbpmConfiguration.
36 // 这是自定义的一个JbpmConfiguration的Factory Bean。
37 cfg = this.getJbpmConfiguration();
38 assertNotNull(cfg);
39 this.logger.info("成功创建Jbpm配置信息");
40
41 JbpmContext ctx = cfg.createJbpmContext();
42 assertNotNull(ctx);
43 this.logger.info("成功创建JbpmContext");
44
45 // 注意与不使用Spring时候的区别
46 // Spring已经初始化Hibernate配置了,所以这个时候不能使用ctx直接获取session
47 // 而必须使用Spring中配置的工厂来获取session。
48 // 后面会演示在web时,在哪里处理这个session问题比较好。
49
50 // 使用Spring的session工厂
51 ctx.setSessionFactory(this.sessionFactory);
52 Session s = ctx.getSession();
53 assertNotNull(s);
54 this.logger.info("成功创建Hibernate Session");
55 }
56
57 public void testInitProcessDefinitionXml() {
58
59 }
60
61 public JbpmConfiguration getJbpmConfiguration() {
62 return jbpmConfiguration;
63 }
64
65 public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
66 this.jbpmConfiguration = jbpmConfiguration;
67 }
68
69 public SessionFactory getSessionFactory() {
70 return sessionFactory;
71 }
72
73 public void setSessionFactory(SessionFactory sessionFactory) {
74 this.sessionFactory = sessionFactory;
75 }
76}
77
2
3import org.hibernate.Session;
4import org.hibernate.SessionFactory;
5import org.jbpm.JbpmConfiguration;
6import org.jbpm.JbpmContext;
7import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
8
9/**
10 * 简单流程测试
11 * @author seewood
12 * @version $LastChangedRevision$
13 */
14public class ConfigurationSpringTests
15 extends AbstractTransactionalDataSourceSpringContextTests {
16 private JbpmConfiguration jbpmConfiguration;
17 private SessionFactory sessionFactory;
18
19 @Override
20 protected String getConfigPath() {
21 // 返回配置文件路径(相对与classpath)
22 return "/applicationContext.xml";
23 }
24
25 @Override
26 protected boolean isRollback() {
27 // 默认为true,即是测试完毕后事务全部rollback
28 return super.isRollback();
29 }
30
31 public void testInitJbpmConfiguration() {
32 JbpmConfiguration cfg;
33 // Spring测试类,默认采用Auto-wire,即从ApplicationContext中获取名称匹配的bean,
34 // 自动注入。jbpmConfiguration就会自动注入的。
35 // applicationContext-jbpm.xml 中定义了bean: jbpmConfiguration.
36 // 这是自定义的一个JbpmConfiguration的Factory Bean。
37 cfg = this.getJbpmConfiguration();
38 assertNotNull(cfg);
39 this.logger.info("成功创建Jbpm配置信息");
40
41 JbpmContext ctx = cfg.createJbpmContext();
42 assertNotNull(ctx);
43 this.logger.info("成功创建JbpmContext");
44
45 // 注意与不使用Spring时候的区别
46 // Spring已经初始化Hibernate配置了,所以这个时候不能使用ctx直接获取session
47 // 而必须使用Spring中配置的工厂来获取session。
48 // 后面会演示在web时,在哪里处理这个session问题比较好。
49
50 // 使用Spring的session工厂
51 ctx.setSessionFactory(this.sessionFactory);
52 Session s = ctx.getSession();
53 assertNotNull(s);
54 this.logger.info("成功创建Hibernate Session");
55 }
56
57 public void testInitProcessDefinitionXml() {
58
59 }
60
61 public JbpmConfiguration getJbpmConfiguration() {
62 return jbpmConfiguration;
63 }
64
65 public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
66 this.jbpmConfiguration = jbpmConfiguration;
67 }
68
69 public SessionFactory getSessionFactory() {
70 return sessionFactory;
71 }
72
73 public void setSessionFactory(SessionFactory sessionFactory) {
74 this.sessionFactory = sessionFactory;
75 }
76}
77