在使用流程引擎,如JBPM开发应用的时候,经常会遇见以下情况,即在流程引擎中要嵌入很多的Event Handler或者Action Handler来处理业务相关的事务,这其中就包括了写业务数据表等。
我们知道,在JBPM对于Event Handler或者Action Handler的执行异常,设计了相应的Exception Handler来处理,这使得在对业务数据表操作时,出现异常,流程是可以对异常进行处理的。(关于流程与Event Handler和Action Handler的执行顺序及关系,可参考咖啡blog中关于jBPM的文章,这里不做复述)
但反之,如果对业务数据表操作时正常,而流程处理自己发生了异常时问题就出现了。比如:我们向一个业务表成功插入了一条业务数据,希望流程走向下一个节点,但流程执行异常,停留在了上一个节点中,两者状态出现了不一致。
对jBPM了解的细心看官可能要问,流程引擎的内部是自洽的系统,怎么会发生异常呢?但实际上,确实会的。这种情况发生在多人并行任务中,当多人同时(就那么恰好)认领一个任务时。由于jBPM使用Hiberante的数据库存储,所以sql语句执行实际是发生在session.close()的时候。这时候,外部Handler中的数据库事务已经完成提交,但流程内部可能因为乐观锁机制(jBPM使用Hibernate Version保障数据一致性),甚至是网络物理链路损坏这样的极端情况,而不能正常完成执行。
这里,我们要清楚的意识到,流程引擎的数据库操作和业务数据库操作是完全分离的,两者可能是不同的数据库(分布式部署),使用不用的数据库上下文(对于Hibernate就是不同的SessionFactory)。那么如何解决不同数据库间的数据事务同步呢?
目前咖啡想到的方法是,巧用数据库事务拦截器(可参考本人Blog
http://linliangyi2007.iteye.com/blog/288153,当然你也可是使用Spring等众多开源框架自带的事务拦截机制),将数据库事务延伸至Biz层来。
STEP 1。 在业务层声明事务方法txMethodA();《----数据库事务拦截器在进入这个方法前启动业务数据库的事务
STEP 2. 在事务方法txMethodA()中调用jBPM的api进行流程处理,在流程中会调用HandlerA的方法。
STEP 3. HandlerA中会调用相应的外部业务数据处理txMethodB(); 《---- 这里通过数据库事务拦截器,将它和txMethodA的事务统一在一个事务上下文中。
异常情况1. 如果txMethodB()外部业务数据处理异常,则将异常抛给jBPM的HandlerA,HandlerA将异常报告流程引擎,流程引擎使用Exception Handler对流程进行异常处理。这种情况没有异议!
异常情况2. 如果txMethodB()外部业务数据处理正常,则HandlerA执行正常。但由于“事务拦截器”的作用,在HanlderA执行后,事务并不提交。此时,流程执行发生异常,该异常将抛给txMethodA(),txMethodA()捕获流程异常后,在退出方法后,由“数据库事务拦截器”来负责对txMethodB()中事务的回滚。这样就保证了流程异常与业务处理状态的一致性!
当然也许有人会说这个破坏了MVC原则,但目前咖啡找到的还算优雅的解决方式就是这种了,欢迎拍砖,并提出更好的解决方案!!
分享到:
- 2009-03-11 11:45
- 浏览 1751
- 评论(2)
- 论坛回复 / 浏览 (2 / 2328)
- 查看更多
相关推荐
总结来说,这个压缩包可能包含了一个使用Struts2作为前端控制器,Spring管理服务和事务,MyBatis处理数据访问的项目实例,其中通过自定义拦截器实现了跨数据库的通用分页功能。这个实例展示了如何将这三个框架有效地...
此外,基于可靠消息的事务,如SAGA模式,也是解决分布式事务一致性问题的一种方法。SAGA将长事务分解为一系列短事务,每个事务执行后发送消息到消息队列,下游服务订阅并处理消息,通过重试机制确保最终一致性。这种...
- **事务管理**:在业务操作前后开启和关闭数据库事务,确保数据的一致性。 - **性能优化**:缓存结果,减少不必要的计算或数据库查询。 - **异常处理**:统一处理异常,提高系统的健壮性。 - **数据验证**:在...
总的来说,这个项目展示了如何在Java Web环境中,利用Struts2、Spring和MyBatis三大框架,构建一个具备通用分页和拦截器功能的应用,为开发者提供了跨数据库的分页解决方案。通过学习和理解这个示例,开发者可以更好...
这主要是为了解决跨数据库或跨服务调用时的数据一致性问题。 #### 三、为什么需要分布式事务? 随着现代应用越来越复杂,尤其是采用微服务架构的应用,每个微服务可能会有自己的数据源。在这种情况下,单个服务...
spring boot简单应用,配置yml文件,实现mysql数据库的连接,对数据进行增删改查,另有登录拦截器。
这暗示了我们可能在测试中使用拦截器来处理数据库相关的逻辑,比如在执行SQL查询前进行事务管理,或者在查询后进行结果的处理和转换。 总的来说,Struts2拦截器为开发者提供了强大的工具,使他们能够优雅地扩展应用...
最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理。给一个方法加一个缓存特性,那这个方法就会进行缓存。 这个也是网上说的面向切面编程AOP。 AOP的概念也很...
2. **事务管理**:开始和结束数据库事务,确保数据的一致性。 3. **性能统计**:记录请求的处理时间,提供性能分析。 4. **AOP(面向切面编程)**:实现跨切面的通用逻辑,如日志、异常处理等。 Spring框架中的拦截...
本文将深入探讨如何使用Mybatis拦截器来记录数据更新历史记录,并将其存储到MongoDB中。 首先,我们来理解Mybatis拦截器的原理。Mybatis的拦截器是基于Java的动态代理机制实现的,它允许我们在特定的执行点(如SQL...
总结,Struts2拦截器是其核心特性之一,它增强了框架的功能性和灵活性,使得开发者能够更轻松地处理诸如数据校验、事务控制等常见问题。理解和掌握拦截器的原理和用法,对于提升Java Web开发的效率和代码质量具有...
总的来说,Activiti的拦截器机制为开发者提供了强大的扩展性,可以在流程执行的各个环节插入自定义的逻辑,实现诸如权限控制、日志记录、性能监控等多种功能。熟练掌握这一机制,能让你在设计和实现复杂的业务流程时...
拦截器在请求处理流程中扮演了重要角色,它允许我们在Action执行前后插入自定义的逻辑,如日志、权限检查、数据校验等。 标题中的"struts拦截器jar包"指的是用于增强Struts 1.x框架功能的特定库,它们是`saif-0.1....
Mybatis分页拦截器就是为了解决这个问题,它通过在SQL执行过程中自动添加分页条件,使得开发者无需手动编写分页SQL,简化了代码,提高了开发效率。 Mybatis的分页拦截器主要有两个核心类:`...
在这个案例中,DAO(Data Access Object)层使用了JPA,这意味着数据库操作被封装在DAO中,通过JPA提供的API来实现,如实体管理、查询语言等,提高了代码的可维护性和数据库操作的灵活性。 Action是Struts2 MVC架构...
拦截器在Struts1中扮演着重要角色,它允许开发者在动作执行前后插入自定义的逻辑,比如日志记录、权限验证、事务管理等。SAIF插件是Struts1中一个特定的拦截器实现,用于增强框架的功能。 **1. Struts1 拦截器原理*...
它涵盖了从JPA的基本使用到AOP拦截器的实现,再到分库分表策略的设计,对于提升大型项目的数据库性能有着重要的参考价值。开发者可以根据自身的业务场景,调整和优化这个示例,以满足特定的需求。
- **事务管理**:开启和关闭数据库事务,确保数据的一致性。 总的来说,Struts2的自定义拦截器机制赋予了开发者高度的灵活性,能够轻松地扩展框架的功能,提高代码的复用性和可维护性。通过深入学习和实践,我们...
SpringMVC是Spring框架的一部分,专门...通过理解SpringMVC中的拦截器机制,我们可以更好地控制和优化Web应用的行为,提高系统的灵活性和可维护性。在实践中,你可以根据项目需求创建自己的拦截器,实现特定的功能。
SSM+拦截器+Mysql基础性框架是一个适合新手入门的Java Web开发组合,它包含了Spring、SpringMVC和MyBatis三个核心组件,以及基于这些组件实现的拦截器技术与MySQL数据库的集成。这个框架提供了完整的后端服务构建...