jBPM(三):Spring 集成 jBPM4.3 (jBPM4+Hibernate4)Spring 集成 jBPM4.3 主要工作有2点:1. 将jbpm默认的hib
jBPM(三):Spring 集成 jBPM4.3 (jBPM4+Hibernate4)
Spring 集成 jBPM4.3 主要工作有2点:
1. 将jbpm默认的hibernate事务换成spring事务,即在jbpm.cfg.xml文件中将
<import resource="jbpm.tx.hibernate.cfg.xml" />
替换成:
<import resource="jbpm.tx.spring.cfg.xml" />
2. jBPM的核心控件processEngine由Spring生成、管理。这2方面的内容,网上有很多资料查询,但基本都是在xml文件中进行配置,而我是在之前的代码中集成jBPM,之前的代码采用的是注解的方式(Spring注解,Hibernate注解),所以采用编码的方式获得了processEngine对象,即:
@Bean(name="processEngine") @DependsOn("sessionFactory")public ProcessEngine getProcessEngine() throws Exception{ processEngine = new ConfigurationImpl().springEnabled() .setHibernateSessionFactory(this.getSessionFactory()) .springInitiated(applicationContext) .buildProcessEngine(); return processEngine;}
从上述代码中可以看到,生成processEngine对象需要设置SessionFactory对象。查看jBPM4.3源码SpringProcessEngine.java类,发现其获取的是LocalSessionFactoryBena对象,而我在代码中采用的是注解方式,所以生成的是AnnotationSessionFactoryBean对象,即:
@Bean(name="annotationSessionFactoryBean")@DependsOn("dataSource")public AnnotationSessionFactoryBean getAnnotationSessionFactoryBean() throws Exception { Properties properties = new Properties();properties.put("hibernate.dialect", dialect); properties.put("hibernate.show_sql", showSql);properties.put("hibernate.hbm2ddl.auto", hbm2ddl);properties.put("hibernate.max_fetch_depth", max_fetch_depth);properties.put("hibernate.temp.use_jdbc_metadata_defaults", "false"); properties.put("hibernate.jdbc.fetch_size", "50");properties.put("hibernate.jdbc.batch_size", "25"); AnnotationSessionFactoryBean a = new AnnotationSessionFactoryBean(); a.setDataSource(this.getDataSource());a.setHibernateProperties(properties); a.setPackagesToScan(models.split(","));// jbpm文件a.setMappingResources(new String[]{"jbpm.repository.hbm.xml","jbpm.execution.hbm.xml","jbpm.history.hbm.xml","jbpm.task.hbm.xml","jbpm.identity.hbm.xml"}); a.afterPropertiesSet(); return a;}
解决的办法是在本地源码中新建一个对应的SpringProcessEngine类,用以覆盖jBPM源码。修改其中的代码,获取AnnotationSessionFactoryBean对象。以下是修改的create方法:
public static ProcessEngine create(ConfigurationImpl configuration) { SpringProcessEngine springProcessEngine = null; ApplicationContext applicationContext = null; if (configuration.isInstantiatedFromSpring()) { applicationContext = (ApplicationContext) configuration.getApplicationContext(); springProcessEngine = new SpringProcessEngine(); springProcessEngine.applicationContext = applicationContext; springProcessEngine.initializeProcessEngine(configuration);// 原先的代码// LocalSessionFactoryBean localSessionFactoryBean = springProcessEngine.get(LocalSessionFactoryBean.class);// Configuration hibernateConfiguration = localSessionFactoryBean.getConfiguration();// springProcessEngine.processEngineWireContext// .getWireDefinition()// .addDescriptor(new ProvidedObjectDescriptor(hibernateConfiguration, true));// // springProcessEngine.checkDb(configuration); // 将LocalSessionFactoryBean 换成 AnnotationSessionFactoryBean AnnotationSessionFactoryBean annotationSessionFactoryBean = springProcessEngine.get(AnnotationSessionFactoryBean.class); Configuration hibernateConfiguration = annotationSessionFactoryBean.getConfiguration(); springProcessEngine.processEngineWireContext .getWireDefinition() .addDescriptor(new ProvidedObjectDescriptor(hibernateConfiguration, true)); springProcessEngine.checkDb(configuration); } else { String springCfg = (String) configuration.getProcessEngineWireContext().get("spring.cfg"); if (springCfg==null) { springCfg = "applicationContext.xml"; } applicationContext = new ClassPathXmlApplicationContext(springCfg); springProcessEngine = (SpringProcessEngine) applicationContext.getBean("processEngine"); } return springProcessEngine; }
本地新建的类:

public static ProcessEngine create(ConfigurationImpl configuration) {SpringProcessEngine springProcessEngine = null;ApplicationContext applicationContext = null;if (configuration.isInstantiatedFromSpring()) {applicationContext = (ApplicationContext) configuration.getApplicationContext();springProcessEngine = new SpringProcessEngine();springProcessEngine.applicationContext = applicationContext;springProcessEngine.initializeProcessEngine(configuration);LocalSessionFactoryBean localSessionFactoryBean = springProcessEngine.get(LocalSessionFactoryBean.class);Configuration hibernateConfiguration = localSessionFactoryBean.getConfiguration();springProcessEngine.processEngineWireContext.getWireDefinition().addDescriptor(new ProvidedObjectDescriptor(hibernateConfiguration, true));springProcessEngine.checkDb(configuration);} else {String springCfg = (String) configuration.getProcessEngineWireContext().get("spring.cfg");if (springCfg == null) {springCfg = "applicationContext.xml";}applicationContext = new ClassPathXmlApplicationContext(springCfg);springProcessEngine = (SpringProcessEngine) applicationContext.getBean("processEngine");}return springProcessEngine;}
这里的LocalSessionFactoryBean是org.springframework.orm.hibernate4.LocalSessionFactoryBean;
不清楚问题出在哪里,请指教一下,谢谢。public static ProcessEngine create(ConfigurationImpl configuration) {SpringProcessEngine springProcessEngine = null;ApplicationContext applicationContext = null;if (configuration.isInstantiatedFromSpring()) {applicationContext = (ApplicationContext) configuration.getApplicationContext();springProcessEngine = new SpringProcessEngine();springProcessEngine.applicationContext = applicationContext;springProcessEngine.initializeProcessEngine(configuration);LocalSessionFactoryBean localSessionFactoryBean = springProcessEngine.get(LocalSessionFactoryBean.class);Configuration hibernateConfiguration = localSessionFactoryBean.getConfiguration();springProcessEngine.processEngineWireContext.getWireDefinition().addDescriptor(new ProvidedObjectDescriptor(hibernateConfiguration, true));springProcessEngine.checkDb(configuration);} else {String springCfg = (String) configuration.getProcessEngineWireContext().get("spring.cfg");if (springCfg == null) {springCfg = "applicationContext.xml";}applicationContext = new ClassPathXmlApplicationContext(springCfg);springProcessEngine = (SpringProcessEngine) applicationContext.getBean("processEngine");}return springProcessEngine;}
这里的LocalSessionFactoryBean是org.springframework.orm.hibernate4.LocalSessionFactoryBean;
不清楚问题出在哪里,请指教一下,谢谢。
org/hibernate/impl/SessionImpl 是Hibernate3中的,Hibernate4中是org.hibernate.internal.SessionImpl 。 jbpm4中默认是hibernate3,我看了源码是在HibernateSessionDescriptor类中用到了SessionImpl,所以你再新建一个HibernateSessionDescriptor类覆盖。我已经试过了,是可以的。//1.布署流程RepositoryService repositoryService = processEngine.getRepositoryService();ZipInputStream zis = new ZipInputStream(this.getClass().getResourceAsStream("/omaterial.zip"));repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();/** ExecutionService接口,用来管理流程实例 */ExecutionService executionService = processEngine.getExecutionService();
我在布署流程的时候,读入zip文件,DEBUG进去发现BlobStrategyBlob这个类中,使用Hibernate.createBlob(bytes);这个在hibernate4中是没有。请问一下要怎么修改呢?
还有JBPM4.4集成hibernate4还会出现什么问题呢?
谢谢!!