`
xuhuankeven
  • 浏览: 34957 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论
阅读更多
最近在项目中碰到了不少眼生的错误、异常,由于赶工未作详细记录。现想起来是一笔无形的损失。。因今天在家闲来无事,特开此头,希望把以后遇见的问题做一个记录,以供他日、他人查询。
记录模板:
日期:
配置环境:
异常信息:
解决方案:
=========================================================================
日期:2010-06-17
配置环境:Seam2.0+Spring2+jbpm4+Tomcat6.0
异常信息:null ,空值错误。因为项目中需要在流程节点中进行业务处理,但在处理过程中需要进行对数据库的插入与查询等操作,因而需要公司项目中封装的一个XXDao的工具类。但实验了四种方式依旧在节点处理过程中取不到XXDao,一直报空值错误。
1:刚开始我们用注解,因为考虑到整个项目是在Seam大框架下,而Seam的上下文范围很大,jbpm又是集成到项目中的,感觉行得通,但失败了。老大提示Jbpm的流程处理过程脱离了Seam上下文,不能在custom节点处理类中进行注解(老实说,现在还是不明白:jbpm的运行期依旧是在Seam框架之下。。。。)。
2:于是转而投向流程变量,相通过吧XXDao的实例放入流程变量,再在custom节点处理类 中取出来使用,但依旧为成功。
3:想到Seam的注解是在使用时才实例化,创建对象,既然第一种方式不成功,第二种方式失败也是必然的。于是蒙头懵脑地采用Java最原始的方式new出实例,但依旧不成功。后来经过老大指点才发现XXDao中封装了一个Seam的组件,本身这个组件是依赖Seam注解的,因而XXDao不能new。
4:本已绝望,准备采用手写JDBC的方式来实现了,但老大又提出了一个方案,使用Spring来想类中注入需要的Seam组件XXDao。通过在spring-bean.xml配置<seam:instance name="XXDao..">但最终因为下班,未作深入实验。回来查阅相关资料才发现Seam与Spring的集成又是一片新天地。。。。值得研究。。
解决方案:第二天老大提示使用第二种方式,即通过流程变量传递XXDao对象,再在类中取出来使用,是可以实现的。
结果我在我的机子上实验,一切正常,在另外一台机子上也能使用,唯独上次那台依旧保留着他时好时坏的风格。。。。很是恼人。。。
=========================================================================
日期:2010-06-18
配置环境:Seam2.0+Spring2+jbpm4+Tomcat6.0
异常信息:couldn't deserialize object,启动流程后吧一个对象放入流程变量,在流程执行过程中正常,但是在custom节点处理时,从流程中取出流程变量时报不能反序列化object对象,思来想去找不出原由,而且普通的String,Long等类型都可以正常传递,流程变量中传入的对象都是实现了序列化的。最终在不同机子上实验时各有失败与成功。在网上搜索,似乎碰到类似问题的很少。只是在贩卖你的论坛  http://old.family168.com/bbs/dv_rss.asp?s=xhtml&boardid=6&id=1314上碰到一个相似帖子,跟帖的也只是说这是jbpm4的一个bug,并未贴出解决方案。在jboss官网 http://community.jboss.org/thread/119969 也有一张雷同帖子,大牛们也只是做了少许 理论上的解释,看上去很懵(本身英文不是很好)。
解决方案:暂时也就只能归结于jbpm4的bug了。因为只有一台机子出现这种异常,似乎这么归结有点欠妥。。。那就是RP问题吧。。。。。。
=========================================================================
日期:2010-06-25
配置环境:Seam2.0+Spring2+jbpm4+Tomcat6.0+mysql
异常信息:duplicate entry '22' for key 1,一开始就报已经存在值22,因为是在jbpm的表里面,所以首先想到的是jbpm的相关问题。翻来覆去把jbpm的表结构研究了一番,发现jbpm保存流程实例的时候是先向jbpm4_execution里面插入数据,又同时向jbpm4_hist_proinst和jbpm4_hist_actinst插入数据,同时开启流程时又向jbpm4_hist_task历史任务表中插入数据,表jbpm4_hsit_proinst和jbpm4_hist_actinst中插入的数据一般情况下不会删除。对于某一流程实例的不同状态(比如活动状态---active和结束状态---ended)只是用字段进行标示,而jbpm4_execution中的数据则是在流程实例执行完毕后删除,而jbpm4_execution表中的主键又是自增长的。就算是这样但也不应该出现重复值呀。中途忽略了一个细节,出现这种情况的很多都是在数据库重启后出现的。为什么是在数据库重启后呢。经过查证资料才发现这是mysql的一个bug。由于版本不同,有的版本在mysql数据库重启时相应表中的自增长字段并没有保存到磁盘中去,因而重启后mysql的一种解决方案是重新查找出相应表中自增长字段最大值,然后再以此自增。回到刚才的三张表中,很显然这样如果我处理完成最后一个流程重启数据库后,表jbpm4_execution中插入数据时,历史表也同时插入,然而历史表中依然保持着之前的处理流程,因为表jbpm4_hist_proinst和jbpm4_hist_actinst保存着jbpm4_execution的外键引用,这样再插入数据时肯定会出现重复数据。
解决方案:找到了 原因首先想要的是得打解决方法:
1: 在网上查找了一下,基本上都建议单建一张表用来保存相应表中当前的自增长值。用触发器实现,但老大考虑到这种方式在项目中的改动比较大,所以放弃了。
2:想了想,如果表jbpm4_execution表在流程处理完成后不删除相应数据,也就不会存在这种情况了。。但因为查找不到相应的配置,这样改动的话,必然需要修改jbpm的源码,出于对这个开源框架的理解尚浅,怕驾驭不到框架的改动,因而也放弃了。
3:还有一种方案就是修改mysql数据库的引擎模式。像前面说到的,因为版本差异mysql的默认数据库引擎也不同。项目中用到的是5.0版本恰好是innoDB模式引擎(具体名称忘了,下次补上),其自增长值并未保存与磁盘,而是放在内存中。如果转为MyISAM模式引擎,则可解决此问题。但老总的一句话又让我们放弃了这个解决方案:MyISAM模式引擎对事务的支持很不完美。
4:最终依旧未解决
=========================================================================
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics