【适用范围】
EOS5.x
【内容】
在某EOS项目中因为自定义工作流组织机构接口的BUG出现了这样两个问题,在此做一个小结,希望大家引以为戒。
一、 Jboss连接池连接被用光
1) 环境说明:
1. EOS 5.3(2857)和客户原来的程序(Struts)一起使用,Struts的程序扩展名全部改为了.doo
2. 应用服务器是jboss,点击用EOS实现的功能(查询工作流的我的工作项)的时候,出现了连接被用完的情况,日志中可以看到
eos日志中抛异常:10:47:29,437 ERROR [CtRscImportOrgRole] [@level][ERROR][@other][获取数据库连接时发生错误,请参看日志!][@timestamp][2007.11.27 at 10:47:29 437][@sender][defaultAppID.cn.com.ctsi.common.CtRscImportOrgRole][]
com.primeton.tp.core.dataservice.DataBaseException: 数据库操作错误 : No ManagedConnections available within configured blocking timeout ( 30000 [ms] ); - nested throwable: (javax.resource.ResourceException: No ManagedConnections available within configured blocking timeout ( 30000 [ms] ))
3.sybase数据库的最大连接数是150,EOS数据库连接池最大连接数是100,Struts的最大连接数和最小连接数都没有设置。
4. 目前工作流参与者接口他们是重新实现的。
2). 问题现象
1. 点击查询工作流的我的工作项的时候,出现了连接被用完的情况。所有EOS相关的操作都不能正常进行。
2. 如果点击EOS其他程序,则不会出现连接被用完的情况。
3. 如果我直接调用工作流参与者实现类查询参与者,不出现问题,执行标准构件BL_commonQueryPersonBizEntity时就会出现上面问题
初步定位是工作流参与者实现类没有释放连接导致。
3). 解决步骤
1. 在每一个接口实现方法的获取连接处和释放连接处都添加日志输出,发现方法getAllSuperiorOrganization()获取了连接,但是没有释放连接。深入跟进去终于发现问题
rs.close();
ps.close();
}
}catch(SQLException sqlEx){
TPLogger.log(this,TPLogger.LEVEL_DEBUG,"","获取所有上级组织机构参与者时候发生数据库错误,请参看日志!",logctxt,sqlEx);
}finally{
if(rs != null)
rs.close();
if(ps != null)
ps.close();
if(con != null)
con.close();
}
上述为代码片断,如红色代码所示在上面 rs 和 pr 已经关闭了,但是rs 和pr 却不为null,所以在finally中再次调用???rs.close();时会抛出异常,导致con没有关闭。
因为只有用标准构件BL_commonQueryPersonBizEntity去查询我的工作项的时候才会去执行方法getAllSuperiorOrganization(),直接调工作流参与者实现类查询参与者方法不涉及到这个方法。
这个代码是客户中的一个高手写的,也难免会出现问题,所以,万不得已要写涉及数据库连接的java代码时一定要万分小心。
二、 环节参与者是部门,但是此部门下的人却不能查到待领取工作项,用的构件是BL_querySelfBizEntity。
1. 某流程的环节1的参与者是部门,orgID=-1
2. 某员工1的id是1,部门id是 -1
3. 我用员工1登录系统,用构件BL_querySelfBizEntity去查询这个人的待领取工作项,但是查不到
4. 我到管理控制台跟踪查询的sql,如下:
SELECT distinct T1.create_time,T1.req_finish_time,T1.form_id,T1.title,T1.initiator_depart_id,T1.req_ack_time,T1.form_type,T1.PROCESSINSTID,T1.content,T1.finish_time,T1.code,T1.contact_way,T1.owner_id,T1.import_time,T1.initiator_name,T1.parent_form_id,WFWorkItem.processInstName,WFWorkItem.activityInstID,WFWorkItem.activityInstName,WFWorkItem.processDefID,WFWorkItem.processDefName,WFWorkItem.processChName,WFWorkItem.activityDefID,WFWorkItem.currentState,WFWorkItem.workItemID,WFWorkItem.startTime,WFWorkItem.finalTime,WFWorkItem.isTimeOut,WFWorkItem.extend2
FROM v_busi_form_owner T1, WFWorkItem, WFWIParticipant WHERE
T1.PROCESSINSTID=WFWorkItem.processInstID AND WFWorkItem.workItemID = WFWIParticipant.workItemID AND WFWorkItem.workItemType=?
AND ( WFWorkItem.workItemID = WFWIParticipant.workItemID AND (( WFWorkItem.currentState=4 AND WFWIParticipant.partiInType="GET" AND ( (WFWIParticipant.extend1 IN ( "P{1}") AND ( WFWorkItem.bizState = 0))))) )
这个sql,只是去查了WFWIParticipant.extend1 IN ( "P{1}") 的记录,但是没有去查此员工部门的工作项。
仔细查了一下,终于发现问题,工作流组织机构模型中有个接口是getAllSuperiorOrganization(查询指定机构的所有上级机构,包括本机构),但是客户实现的时候,没有包括本机构。调整之后,一切正常。
【备注】
|