`
阅读更多
http://koudai.360.cn/u/23733528/article_217962180.html?s=y

经过一段事件的摸索终于将jpbm与spring完全整合,主要是事务处理的整合,工作流代码与业务代码在一个事务上下文进行;

使用了springmodules的封装,对jbpm稍有修改,稍后附上解决办法及代码;
========================================================

spring modules中包含了spring集成JBPM的机制,在使用的发现其并没有彻底解决两者的事务处理统一的问题,经过一段事件的摸索终于将jpbm与spring完全整合,主要是事务处理的整合,工作流代码与业务代码在一个事务上下文进行;
使用了springmodules的封装,对jbpm稍有修改,稍后附上解决办法及代码;
-------------------------------------------------姗姗来吃---------------o(∩_∩)o...哈哈,害得帖子被隐藏了
第一步:首先引入spring-modules-jbpm31.jar,同时将jbpm包含的所有hibernate映射文件解压出来,集成到spring配置文件中,可以使用类路径下的目录形式简化,如下:


--------------------------------------------------------------------------------

经测试在这种方式在weblogic上不能正常加载,从jar包加载也有问题必须解压到目录;

第二步:配置JPBM的大字段处理类型,这一步估计大家都知道,没什么说的;
xml 代码
<bean
id="jbpmTypes"
class="org.springframework.orm.hibernate3.TypeDefinitionBean">

--------------------------------------------------------------------------------

<bean
id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

--------------------------------------------------------------------------------

第三步:配置spring modules,通过 springmodules 初始化jbpmConfiguration;
xml 代码
Xml代码
<!-- jBPM configuration-->
<bean id="jbpmConfiguration"
class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
<property name="sessionFactory" ref="sessionFactory" />

<property name="configuration" value="classpath:/conf/jbpm.cfg.xml" />

<!--<property name="configuration" value="classpath:/org/jbpm/default.jbpm.cfg.xml" />-->
<!--<property name="processDefinitions">-->
<!--<list>-->
<!--<ref local="demoWorkflow" />-->
<!--</list>-->
<!--</property>-->

<!--<property name="createSchema" value="true"/>-->
</bean> <!-- jBPM configuration-->
<bean id="jbpmConfiguration"
class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
<property name="sessionFactory" ref="sessionFactory" />
<property name="configuration" value="classpath:/conf/jbpm.cfg.xml" />
<!--<property name="configuration" value="classpath:/org/jbpm/default.jbpm.cfg.xml" />-->
<!--<property name="processDefinitions">-->
<!--<list>-->
<!--<ref local="demoWorkflow" />-->
<!--</list>-->
<!--</property>-->
<!--<property name="createSchema" value="true"/>-->

--------------------------------------------------------------------------------
<!--<service name="persistence" factory="org.jbpm.persistence.db.DbPersistenceServiceFactory" />-->
<service name="persistence">
<factory>
<bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
<field name="isTransactionEnabled">
<STRONG><U><false /></U></STRONG>
</field>
<field name="isCurrentSessionEnabled">
<U><STRONG><true /></STRONG></U>
</field>
</bean>
</factory>
</service>

<service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />
<service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
<service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
<service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
</jbpm-context>

<STRONG><U><!--<string name="resource.hibernate.cfg.xml" value="hibernate.cfg.xml" />--></U></STRONG>

<string name="resource.business.calendar" value="org/jbpm/calendar/jbpm.business.calendar.properties" />
<string name="resource.default.modules" value="org/jbpm/graph/def/jbpm.default.modules.properties" />
<string name="resource.converter" value="org/jbpm/db/hibernate/jbpm.converter.properties" />
<string name="resource.action.types" value="org/jbpm/graph/action/action.types.xml" />
<string name="resource.node.types" value="org/jbpm/graph/node/node.types.xml" />
<string name="resource.parsers" value="org/jbpm/jpdl/par/jbpm.parsers.xml" />
<string name="resource.varmapping" value="org/jbpm/context/exe/jbpm.varmapping.xml" />

<long name="jbpm.msg.wait.timout" value="5000" singleton="true" />
<int name="jbpm.byte.block.size" value="1024" singleton="true" />
<string name="mail.smtp.host" value="localhost" />
<bean name="jbpm.task.instance.factory" class="org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl"
singleton="true" />
<bean name="jbpm.variable.resolver" class="org.jbpm.jpdl.el.impl.JbpmVariableResolver" singleton="true" />
<bean name="jbpm.mail.address.resolver" class="org.jbpm.identity.mail.IdentityAddressResolver" singleton="true" />

</jbpm-configuration> <jbpm-configuration>
<jbpm-context>
<!--<service name="persistence" factory="org.jbpm.persistence.db.DbPersistenceServiceFactory" />-->
<service name="persistence">
<factory>
<bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
<field name="isTransactionEnabled">
<false />
</field>
<field name="isCurrentSessionEnabled">
<true />
</field>
</bean>
</factory>
</service>
<service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />
<service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
<service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
<service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
</jbpm-context>
<!--<string name="resource.hibernate.cfg.xml" value="hibernate.cfg.xml" />-->
<string name="resource.business.calendar" value="org/jbpm/calendar/jbpm.business.calendar.properties" />
<string name="resource.default.modules" value="org/jbpm/graph/def/jbpm.default.modules.properties" />
<string name="resource.converter" value="org/jbpm/db/hibernate/jbpm.converter.properties" />
<string name="resource.action.types" value="org/jbpm/graph/action/action.types.xml" />
<string name="resource.node.types" value="org/jbpm/graph/node/node.types.xml" />
<string name="resource.parsers" value="org/jbpm/jpdl/par/jbpm.parsers.xml" />
<string name="resource.varmapping" value="org/jbpm/context/exe/jbpm.varmapping.xml" />
<long name="jbpm.msg.wait.timout" value="5000" singleton="true" />
<int name="jbpm.byte.block.size" value="1024" singleton="true" />
<string name="mail.smtp.host" value="localhost" />
<bean name="jbpm.task.instance.factory" class="org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl"
singleton="true" />
<bean name="jbpm.variable.resolver" class="org.jbpm.jpdl.el.impl.JbpmVariableResolver" singleton="true" />
<bean name="jbpm.mail.address.resolver" class="org.jbpm.identity.mail.IdentityAddressResolver" singleton="true" />
</jbpm-configuration>

第四步:修改JBPM自带的过滤器(web.xml),初始化当前请求线程的JBPM Context时从spring获取我们上面配置的jbpmConfiguration;其自带过滤器是通过JbpmConfiguration.getInstance获取的,不能公用spring事务上下文的hibernate session;

--------------------------------------------------------------------------------

import com.**.**.core.container.ApplicationContext;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.Serializable;
import java.security.Principal;
public
class JbpmContextHolder implements Filter, Serializable {
private
static
final
long serialVersionUID = 1L;
String jbpmConfigurationResource = null;
String jbpmContextName = null;
boolean isAuthenticationEnabled = true;
public
void init(FilterConfig filterConfig) throws ServletException {
// get the jbpm configuration resource
this.jbpmConfigurationResource = filterConfig.getInitParameter("jbpm.configuration.resource");
// get the jbpm context to be used from the jbpm configuration
this.jbpmContextName = filterConfig.getInitParameter("jbpm.context.name");
if (jbpmContextName == null) {
jbpmContextName = JbpmContext.DEFAULT_JBPM_CONTEXT_NAME;
}
// see if authentication is turned off
String isAuthenticationEnabledText = filterConfig.getInitParameter("authentication");
if ((isAuthenticationEnabledText != null)
&& ("disabled".equalsIgnoreCase(isAuthenticationEnabledText))
) {
isAuthenticationEnabled = false;
}
}
public
void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String actorId = null;
// see if we can get the authenticated swimlaneActorId
if (servletRequest instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
Principal userPrincipal = httpServletRequest.getUserPrincipal();
if (userPrincipal != null) {
actorId = userPrincipal.getName();
}
}
JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext(jbpmContextName);
try {
if (isAuthenticationEnabled) {
jbpmContext.setActorId(actorId);
}
filterChain.doFilter(servletRequest, servletResponse);
} finally {
jbpmContext.close();
}
}
注意:下面是修改后的方法,从spring获取JbpmConfiguration;
ApplicationContext是我们对spring的封装,可以改成自己的bean加载方式;


protected JbpmConfiguration getJbpmConfiguration() {
return (JbpmConfiguration) ApplicationContext.getInstance().getBizComponent("jbpmConfiguration");
}
public
void destroy() {
}
}

大功告成:

经过上边的修改后,从spring事务过程中调用JBPM方法、或者spring modules的方法时都会直接纳入当前事务,实现一致的提交和回滚;
分享到:
评论

相关推荐

    jbpm开发指南--jbpm全面介绍

    通过查看JBPM的表,我们知道要实现流程监控功能就是把JBPM当中的JBPM_PROCESSDEFINITION(已发布的流程表),JBPM_PROCESSINSTANCE(流程实例表),JBPM_TASKINSTANCE(流程产生的任务实例表)这三张表串联起来就可以...

    JBPM工作原理及表结构详解

    本文件从JBPM的原理、实现方法、实例等方面详细讲解了JBPM的原理,包括以下内容: 1、JBPM特色: 3 2、流程图的组成: 3 2.1流转 (TRANSITION) 3 2.2活动 (ACTIVITY) 3 3、所用到的表: 4 3.1资源库与运行时表结构:...

    jbpm简介\jbpm简介

    \jbpm简介\jbpm简介\jbpm简介\jbpm简介\jbpm简介

    jbpm jbpm4.3.jar

    jbpm jbpm4.3.jar DDDDDDDD

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...

    jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍

    jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍

    jbpm的一个实例

    JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上 JBPM的工程文件,大家可以到...

    JBPM采购申请系统——08_JBPM流程节点.7z

    JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM...

    jbpm7示例(jbpm-7.3.0.Final-examples)

    2017年jBPM 正式发布了全新的 7版本。jBPM 是一个完全开源的业务流程管理(BPM)和案例管理解决方案。它支持流程和案例的完整生命周期,从编写工具到执行一直到监控和管理。 在核心引擎之上,提供了许多功能和工具来...

    jbpm安装及使用方法

    在解决“并行”等(比如Fork)问题时,jBpm让Token对象维护了父子关系,这种关系在涉及到Fork的时候会产生。 jBpm让Token这个对象身兼了多种使命: (1)快速定位current state (2)用于fork,join算法 (3)用于...

    生成基于Oracle的jBPM数据库脚本

    解压这个文件,假设解压目录为 "${jbpm.starters.kit}",它的下面应该有 jbpm, jbpm-bpel,jbpm-db,jbpm-designer,jbpm-server 五个子目录。其中我们要用到的是 jbpm 和 jbpm-db两个目录。 2. 导航到 jbpm-db 子...

    JBPM数据库表说明.doc

    JBPM数据库表说明 2 1 流程配置类数据库表: 2 1.1 JBPM_PROCESSDEFINITION:流程模版表 2 1.2 JBPM_NODE:流程节点表 2 1.3 JBPM_TRANSITION:流程迁移表 3 1.4 JBPM_ACTION:流程动作表 4 1.5 JBPM_EVENT:流程...

    jbpm3.2表说明

    jbpm3.2表说明 很详细 1.1 JBPM_PROCESSDEFINITION:流程模版表 关系表 外键存在表 外键名称 外键存在表字段 存在原因 可能 关系 JBPM_NODE JBPM_NODE FK_PROCST_SBPRCDEF SUBPROCESSDEFINITION_ 子流程的...

    JBPM采购申请系统——06_JBPM版本控制及Token对象.7z

    JBPM采购申请系统——06_JBPM版本控制及Token对象.7z JBPM采购申请系统——06_JBPM版本控制及Token对象.7z JBPM采购申请系统——06_JBPM版本控制及Token对象.7z JBPM采购申请系统——06_JBPM版本控制及Token对象.7z ...

    jbpm4jbpm5

    jbpm应用开发指面(胡奇) jbpm4.3表结构和表字段说明 [jBPM开发指南].高杰.文字版 jBPM5_用户手册-中文版

    jbpm 案例 jbpm jbpm

    jbpm使用案例,非常不错,大家都来看看吧。

    深入浅出jBPM完整版part1

    1 章 helloworld..............................................2 1.1 下载开发套件.............................................2 1.2 安装流程设计器 .........................................7 1.3 jBPM版...

    jbpm 数据库jbpm 数据库

    jbpm 数据库jbpm 数据库jbpm 数据库jbpm 数据库jbpm 数据库

    JBPM的使用与简单的操作

    把JBoss安装到${jbpm.home}/jboss-5.0.0.GA目录 把jBPM安装到JBoss中。 安装hsqldb,并在后台启动。 创建数据库结构 在后台启动JBoss 根据示例创建一个examples.bar业务归档,把它发布到jBPM数据库中 从${jbpm...

    工作流jBPM.jar包

    jBPM是公开源代码项目,使用它要遵循 ASL(Apache License Version 2.0)和EULA(JBoss End User License Agreement)协议。  jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台...

Global site tag (gtag.js) - Google Analytics