在使用jBPM做开发的过程中, JbpmContextFilter 是一个非常方便的过滤器, 从源代码中我们可以看到:
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();
}
}
它主要做了两个事情: 一个是在流程继续执行之前为我们创建了一个JbpmContext; 另一个工作就是流程执行之后完成jbpmContext的关闭. 而如果不使用这个Filter的话, 那么在我们的流程处理中,就需要自己做这两件事. 接着我们再看org.jbpm.JbpmContext.close()的代码:
public void close() {
log.debug("closing jbpmContext " + toString());
try {
if (services!=null) {
try {
autoSave();
} finally {
services.close();
}
}
} finally {
if (jbpmConfiguration!=null) {
jbpmConfiguration.jbpmContextClosed(this);
}
}
}
在关闭之前都会执行自动保存.
从上面的分析我们可以看到, jbpm似乎没有提供我们处理流程内部异常的地方,它不管是否出现异常, 都会将我们的流程操作节点持久化到对应的jbpm数据库表中.本人就因为这个原因导致流程出现问题, 在我的一个流程运行过程中, 在某个审核步骤完成, 进入下一个task node的时候, 该Task节点的AssignmentHandler不幸抛出了异常, 按照我们的理解, 流程应该停留在前一步审核阶段, 但实际情况是审核节点已经被设置成完成状态, 而下一个task node的taskInstance也已经持久化到jbpm_taskinstance表中(只是处于未完成状态), 因为是在assign的时候出现的问题, 因此这个新创建的任务节点将成为一个无人处理的节点, 所有人都无法见不到它了.
出现上面的情况一点也不奇怪, 因为在TaskMgmtInstance的createTaskInstance方法中中有这样的代码:
// create the task instance
taskInstance.create(executionContext);
// if this task instance is created for a task, perform assignment
if (task!=null) {
taskInstance.assign(executionContext);
}
它先创建taskInstance, 完成taskInstance的属性设置, 然后执行assign动作(异常就出现在这里), 在出现异常之后程序会回到JbpmContextFilter中,然后执行JbpmContext的close方法(该方法中完成所有新建和修改对象的持久化工作).
为了解决这个问题,就需要我们自己来处理jbpm引擎内部抛出的异常, 这一点jbpm做的非常好, 因为jpbm抛出的异常都是继承自JbpmException, 所以我们只要捕获该异常就可以了.而我们结束流程操作一般都是出现在这样几个地方:调用TaskInstance.end(), ProcessInstance.signal()以及相关的同名方法, 因此只要在调用这些方法的地方对异常进行捕获就可以了.
我将这几个方法放到工具类, 以方便调用:
public static void end(TaskInstance ti) {
end(ti, (Transition) null);
}
public static void end(final TaskInstance ti, final String transitionName) {
new JbpmOperation() {
@Override
void doExecute(JbpmContext ctx) {
ti.end(transitionName);
}
}.execute();
}
public static void end(final TaskInstance ti, final Transition transition) {
new JbpmOperation() {
@Override
void doExecute(JbpmContext ctx) {
ti.end(transition);
}
}.execute();
}
public static void signal(final ProcessInstance pi) {
new JbpmOperation() {
@Override
void doExecute(JbpmContext ctx) {
pi.signal();
}
}.execute();
}
然后定义了一个回调的操作类用来处理在遇到JbpmException异常的时候告诉JbpmContext进行rollback:
/**
* 用来处理流程异常, 如果流程本身出现异常(这些异常可能来自我们定义的各种assignmentHandler, actionHandler,
* decisionHandler等),通过设置rollbackOnly来阻止其持久化
*
* @author Macro Chen
* @since Jun 3, 2008
*/
abstract class JbpmOperation {
void execute() {
JbpmContext ctx = JbpmUtils.getJbpmContext();
try {
doExecute(ctx);
} catch (JbpmException e) {
// 通过该方法让ctx提交的时候rollback
ctx.setRollbackOnly();
throw e;
} finally {
// 在filter中close
// ctx.close();
}
}
abstract void doExecute(JbpmContext ctx);
}
分享到:
相关推荐
【jbpm-4.4.zip part03】这个压缩文件是关于jbpm 4.4版本的组成部分,jbpm(Java Business Process Management)是一个开源的工作流管理系统,它提供了业务流程建模、部署、执行和监控的功能。jbpm 4.4是该系统的一...
JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM...
jbpm jbpm4.3.jar DDDDDDDD
jbpm.mysql.create.sql jbpm mysql建表语句
jbpm-jpdl.jar jbpm-jpdl.jar
jbpm-identity.jar jbpm-identity.jar
JBPM数据库表创建\jbpm.jpdl.oracle.sqlJBPM数据库表创建\jbpm.jpdl.oracle.sqlJBPM数据库表创建\jbpm.jpdl.oracle.sqlJBPM数据库表创建\jbpm.jpdl.oracle.sqlJBPM数据库表创建\jbpm.jpdl.oracle.sql
jbpm-3.1.2.zip 文件包含...无论是对于企业内部的流程优化,还是为客户提供定制化的流程解决方案,jBpm都是一个值得信赖的选择。通过深入学习和实践,开发者可以充分利用其特性,构建出符合业务需求的复杂工作流系统。
【jbpm4leave.zip_jbpm4leave_jbpm4leave.zip】是一个包含jbpm4.4和MyEclipse 11的实例应用,主要用于实现请假流程管理。这个压缩包的核心是jbpm4leave项目,它是一个基于JBoss Business Process Management (jBPM) ...
由于jbpm.Adapter.jar旨在提升用户体验,可以假设它在设计时考虑了性能优化,减少了不必要的数据库查询和提高了数据检索速度。 8. **兼容性和版本**: 需要确保jbpm_adapter.jar与当前使用的jbpm版本兼容,否则...
jbpm是一个开源的工作流管理系统,它提供了一套全面的工具和服务,用于设计、部署和执行业务流程。jbpm-4.4.jar包含了jbpm的主要功能,包括流程定义、流程实例管理、任务服务、事件处理以及与数据库交互的持久化层。...
jbpm-6.1.0.Final-installer是JBoss Business Process Management (jBPM)的一个发行版本,它是一个开源的工作流和业务流程管理(BPM)框架,由Red Hat公司开发并维护。jBPM旨在帮助企业和组织设计、执行、管理和监控...
jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd
JBPM(Java Business Process Management)是一个开源的工作流和业务流程管理(BPM)系统,它提供了一套完整的工具链,用于设计、执行、管理和监控业务流程。本指南旨在帮助开发者深入了解JBPM,从安装到实际开发...
- Signavio是一个基于Web的流程设计器,专为jBPM设计,提供了一个图形化的界面来创建和编辑流程模型。 - 在jbpm4之前,jBPM没有内置的Web流程设计器,而Signavio弥补了这一空白,尽管它存在不支持中文和绘图困难等...
这个`jar`文件可能是Apache Jackrabbit或其它JCR实现的一个版本,用于jbpm中的内容管理功能。 **jbpm-identity.jar**:这是jbpm(Java Business Process Management)框架的一个组件,专注于身份管理和权限控制。...
【jbpm4leave.zip_DEMO_java4leave_jbpm4lea_jbpm4leave_jbpm4leave.zi】是一个包含Java实现的Jbpm Demo的压缩包,它主要用于展示如何利用Jbpm来设计和执行一个简单的请假流程。这个Demo是针对开发者和对业务流程...
整合后,我们可以将JBPM的工作流服务作为一个Spring Bean注入到应用中,这样就可以轻松地在Spring环境中启动、管理和控制工作流实例。此外,Spring的事务管理可以帮助确保工作流操作的原子性和一致性。 具体整合...
添加一个名为jbpm.cfg.xml的文件,它导入了jbpm默认的配置文件以及与业务日历、事务管理、JPDL、BPMN和身份管理相关的配置。同时,需要修改hibernate.cfg.xml文件,以包含JBPM工作流的映射文件,比如jbpm.repository...
jBPM 是一个完全开源的业务流程管理(BPM)和案例管理解决方案。它支持流程和案例的完整生命周期,从编写工具到执行一直到监控和管理。 在核心引擎之上,提供了许多功能和工具来支持整个生命周期中的业务流程: ...