`
lijiejava
  • 浏览: 262350 次
  • 性别: Icon_minigender_1
  • 来自: 南通
社区版块
存档分类
最新评论

jBPM(三):Spring 集成 jBPM4.3 (jBPM4+Hibernate4)

 
阅读更多

http://www.muxuanli.com/lmx/

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;
  }


本地新建的类:

分享到:
评论
12 楼 u011684694 2018-01-29  
方便提供一源码?初学者
11 楼 ycy1003757 2015-03-16  
请教一下,在BlobStrategyBlob类中session.getLobHelper() 使用Spring注入SessionFactory 如何获取SessionFactory,有没有代码示例参考下,急求!!!
10 楼 fuyanchao 2015-02-13  
aqaqaeae1234 写道
lb250028 写道
chenjl 写道
楼主,还有一个问题想请问你一下。
//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还会出现什么问题呢?

谢谢!!


同楼主提到的方法一样,重写org/jbpm/pvm/internal/lob/BlobStrategyBlob 类,因为原代码中使用的是hibernate3的Hibernate.createLob(),这个方法在h4中已经取消了,可以使用 session.getLobHelper() 得到一个帮助类操作Bolb。我使用的是Spring注入SessionFactory 然后获取currentSession,暂时没出现什么问题 ,有其他方法的同学可以交流探讨下.


我是通过看HIBERNATE3中源码发现,Hibernate.createLob()相当于
NonContextualLobCreator.INSTANCE.wrap(NonContextualLobCreator.INSTANCE.createBlob(bytes))
但是在之后使用的过程中发现仍然会抛出异常
java.lang.AbstractMethodError
at org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(DelegatingPreparedStatement.java:318)
at org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(DelegatingPreparedStatement.java:318)
不知道该怎么解决··

我也这样操作,org/jbpm/pvm/internal/lob/BlobStrategyBlob重写了,添加了一个SessionFactory成员变量,setter方法,然后通过Spring配置中注入SessionFactory了,但是为什么没有注入进去呢,总是空呢
9 楼 fuyanchao 2015-02-12  
从头看到尾,看了不下10遍了,从刚开始的什么都看不懂,直到把jbpm4.4差不多学完了,又返回来看,这次比每一次都仔细,尤其是其他人提的问题(sessionImpl问题)把困扰我的问题终于给解决了,太感谢了
8 楼 passlicense 2014-12-24  
楼主你好,我也是用hibernate4去集成jbpm4, 出现了:HibernateException: No Session found for current thread错误,于是我在hibernate里面又配置了hibernate.current_session_context_class为thread,结果又出现了:JbpmException: no jBPM DB schema: no JBPM4_EXECUTION table.  的错误,经代码跟踪,是因为checkDb时在ThreadLocal里面获取不到hibernate的session导致的。
hibernate3和4处理session的方式完全不一样了,请问你们集成的时候怎么会没出现这个问题? 求帮助,谢谢了!
7 楼 aqaqaeae1234 2014-02-28  
lb250028 写道
chenjl 写道
楼主,还有一个问题想请问你一下。
//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还会出现什么问题呢?

谢谢!!


同楼主提到的方法一样,重写org/jbpm/pvm/internal/lob/BlobStrategyBlob 类,因为原代码中使用的是hibernate3的Hibernate.createLob(),这个方法在h4中已经取消了,可以使用 session.getLobHelper() 得到一个帮助类操作Bolb。我使用的是Spring注入SessionFactory 然后获取currentSession,暂时没出现什么问题 ,有其他方法的同学可以交流探讨下.


我是通过看HIBERNATE3中源码发现,Hibernate.createLob()相当于
NonContextualLobCreator.INSTANCE.wrap(NonContextualLobCreator.INSTANCE.createBlob(bytes))
但是在之后使用的过程中发现仍然会抛出异常
java.lang.AbstractMethodError
at org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(DelegatingPreparedStatement.java:318)
at org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(DelegatingPreparedStatement.java:318)
不知道该怎么解决··
6 楼 lb250028 2014-01-02  
chenjl 写道
楼主,还有一个问题想请问你一下。
//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还会出现什么问题呢?

谢谢!!


同楼主提到的方法一样,重写org/jbpm/pvm/internal/lob/BlobStrategyBlob 类,因为原代码中使用的是hibernate3的Hibernate.createLob(),这个方法在h4中已经取消了,可以使用 session.getLobHelper() 得到一个帮助类操作Bolb。我使用的是Spring注入SessionFactory 然后获取currentSession,暂时没出现什么问题 ,有其他方法的同学可以交流探讨下.
5 楼 cz271882889 2013-12-03  
请问jbpm4能否和hibernate4整合?能否给出整合方案,万分感谢,我的qq271882889
4 楼 chenjl 2013-11-06  
楼主,还有一个问题想请问你一下。
//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还会出现什么问题呢?

谢谢!!
3 楼 chenjl 2013-09-11  
非常感谢!可以了。
lijiejava 太厉害了。
2 楼 lijiejava 2013-09-11  
chenjl 写道
你好,请问一下,我用的是hibernate4,在集成jbpm4.4的时候,报如下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processEngine' defined in class path resource [spring-hibernate.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.jbpm.api.ProcessEngine org.jbpm.pvm.internal.processengine.SpringHelper.createProcessEngine()] threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/impl/SessionImpl


按照你的方法,新建了一个类SpringProcessEngine类,覆盖了jBPM源码。
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 楼 chenjl 2013-09-10  
你好,请问一下,我用的是hibernate4,在集成jbpm4.4的时候,报如下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processEngine' defined in class path resource [spring-hibernate.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.jbpm.api.ProcessEngine org.jbpm.pvm.internal.processengine.SpringHelper.createProcessEngine()] threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/impl/SessionImpl


按照你的方法,新建了一个类SpringProcessEngine类,覆盖了jBPM源码。
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;

不清楚问题出在哪里,请指教一下,谢谢。

相关推荐

    JBPM5+Spring+Hibernate+MySQL 请假例子

    将JBPM5、Spring、Hibernate和MySQL整合在一起,可以实现一个完整的业务流程管理系统。JBPM5负责流程的定义和执行,Spring作为应用的框架,提供依赖注入和事务管理,使得各组件间协作顺畅;Hibernate作为ORM层,负责...

    spring+struts1+hibernate+jbpm实例

    标题中的"spring+struts1+hibernate+jbpm实例"揭示了这是一个基于Java技术栈的Web应用程序开发实例,其中涉及四大核心技术:Spring、Struts1、Hibernate和JBPM。接下来,我们将深入探讨这些技术及其在实际项目中的...

    jbpm4.3与spring整合

    - `jbpm-4.3/install/src/cfg/jbpm/spring.jbpm.cfg.xml`:JBPM与Spring集成的关键配置文件。 #### 三、配置文件调整 接下来,我们将对这些配置文件进行必要的修改。 1. **调整`hibernate.cfg.xml`**:在`...

    spring+struts+hibernate+jbpm +dwr整合开发的OA办公系统源码

    这是一个基于Java技术栈,采用Spring、Struts、Hibernate、jbpm和DWR等多种框架整合开发的OA(Office Automation)办公系统源码项目。这个系统的构建旨在实现企业的日常办公自动化,提高工作效率,简化工作流程,...

    struts+hibernate+spring+jbpm智能工作流系统

    在"struts+hibernate+spring+jbpm 智能工作流系统"中,这些框架协同工作,实现了以下关键功能: 1. **用户界面**:Struts 处理用户的输入和输出,提供友好的交互界面。 2. **数据持久化**:Hibernate 负责将业务对象...

    jbpm4整合struts2+spring2.5+hibernate3.3

    【jbpm4整合struts2+spring2.5+hibernate3.3】的集成是企业级应用开发中常见的技术栈组合,旨在利用各框架的优势实现高效、灵活的业务流程管理。jbpm4是一个开源的工作流管理系统,用于定义、执行和管理业务流程。...

    jbpm4+spring+hibernate

    【jbpm4+spring+hibernate】是一个集成示例,展示了如何将业务流程管理工具Jbpm4与Spring框架和Hibernate ORM库协同工作。这个示例主要关注于在企业级应用中实现工作流管理和数据持久化。让我们深入探讨这三个技术...

    Struts+Hibernate+spring+jpa+lucene+jbpm+compass配置文件

    Struts、Hibernate、Spring、JPA、Lucene、JBPM和Compass是Java开发中常用的一系列技术,它们各自在不同的领域发挥着重要作用。这里我们将深入探讨这些技术以及如何将它们整合在一起进行配置。 1. **Struts**:...

    基于struts+spring+hibernate+jbpm的工作流系统

    在这个“基于struts+spring+hibernate+jbpm的外贸服装企业的工作流系统”中,开发者可能设计了以下功能: 1. **用户管理**:包括用户注册、登录、权限管理等,确保不同角色的用户只能访问其权限范围内的功能。 2. *...

    struts2+spring+hibernate+jbpm工作流实例

    在这个“struts2+spring+hibernate+jbpm工作流实例”中,主要展示了如何利用这些技术实现一个公文审批流转的过程。 首先,Struts2是一个基于MVC设计模式的Web应用框架,它负责处理HTTP请求,并将这些请求映射到相应...

    Jbpm4.4 整合Spring Hibernate4

    **Jbpm4.4整合Spring Hibernate4详解** Jbpm4.4是一个流程管理系统,它结合了业务流程管理(BPM)和工作流服务,提供了强大的流程定义、执行和监控能力。在这个版本中,Jbpm与Spring框架和Hibernate ORM工具进行了...

    spring+hibernate+jbpm整合

    ### Spring + Hibernate + jBPM 整合知识点详解 #### 一、项目背景与整合目的 在企业级应用开发中,通常需要实现业务流程管理、数据持久化以及服务层等功能。Spring框架因其强大的依赖注入(DI)和面向切面编程...

    SSH+JBPM4.3的整合 JBPM4.3

    SSH+JBPM4.3的整合是企业级应用开发中的一种常见组合,SSH指的是Spring、Struts和Hibernate这三个开源框架的集成,而JBPM4.3则是一个强大的工作流管理系统,用于实现业务流程自动化。这篇内容将深入探讨这两个技术...

    Jbpm+Spring+hibernate+struts2+mysql+c3p0部署

    Jbpm+Spring+hibernate+struts2+mysql+c3p0项目部署

    jbpm4.3+struts2+spring3+hibernate3整合(一)

    【标题】"jbpm4.3+struts2+spring3+hibernate3整合(一)"涉及的是一个常见的Java企业级应用架构整合实践,其中jbpm4.3是业务流程管理(Business Process Management)框架,Struts2是MVC(Model-View-Controller)...

    struts+hibernate+spring+jbpm例

    在这个"struts+hibernate+spring+jbpm"的例子中,开发者可能创建了一个能够处理用户请求、持久化数据、执行业务流程并进行流程控制的应用。Ch 20 文件可能包含了这个示例的源代码或相关文档,包括Struts配置文件、...

    jBPM4与Spring整合的2种方式

    1. **引入Spring-JBPM4依赖**:Spring社区提供了Spring-JBPM4模块,可以直接集成到Spring应用中。添加相应的Maven或Gradle依赖。 2. **配置jbpmContext**:创建一个jbpmContext的bean,它会自动配置jBPM4所需的服务...

    SSH最新项目(struts+spring +hibernate+Jbpm+freemarker)

    SSH是Java Web开发中的经典框架组合,包括Struts、Spring和Hibernate,它们分别负责MVC模式的展现层、业务逻辑层和数据持久化层。在这个最新的SSH项目中,结合了Jbpm工作流引擎和FreeMarker模板引擎,使得项目的功能...

Global site tag (gtag.js) - Google Analytics