读书人

jBPM(3):Spring 集成 jBPM4.3 (jBPM

发布时间: 2013-11-08 17:52:01 作者: rapoo

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还会出现什么问题呢?

谢谢!!

读书人网 >行业软件

热点推荐