泰康人寿Filenet 流程BPM 若干问题的解决之一
设计
工作流数据库大小限制
工作流数据库对流程中可以存储的数据的大小进行了限制,既有对某个字段的限制也有对总体大小的限制。以下表格描述了MS SQL Server 2000, Oracle9i和DB2对流程存储的数据大小的限制,以及Process Engine(PE)本身的限制。
|
MS SQL Server 2000 |
Oracle 9i |
DB2 |
String类型字段 |
8000 ( varchar ) |
4000 ( varchar2 ) |
32672 ( varchar ) |
数据库每行 |
8060 |
No Limit |
Variable |
数据库表最大列数 |
255 |
255 |
255 |
Blob |
512K |
512K |
512 |
PE数据库对流程数据大小限制
如上表,DB2数据库每行数据大小限制为Variable。这个变量由PE设定支持的Page Size大小决定:
PE 支持的Page Sizes 数据库每行数据大小限制
8K 8101
16K 16293
32K 32677
Roster暴露字段长度设置
当在Roster以及Event Log中暴露的字段在流程执行过程中存入的数据大小超过暴露时定义的长度时,会造成流程异常,甚至是日志丢失。
解决办法是增加字段在暴露时的长度,但同时也要考虑所有暴露字段的大小以及总大小不要超过上表数据。
当所有暴露字段总长度超过上表长度限制时,也会造成流程异常或是日志丢失。
解决办法是数据库PageSize扩容。只要对原有数据进行备份(扩容前导出至中间表,扩容后再导入),Page Size扩容不会对Roster或Event Log中数据造成影响。
流程的并行设计
由split节点引出所有路线都在join节点汇合。
由split节点引出的路线部份在join节点汇合。
经过split节点的路线不可以不经过对应的join节点而直接返回split节点
经过join节点的路线不可以不经过对应的split节点而直接返回join节点。
所有经过join节点的路线必须先经过对应的split节点。
系统节点
并行路线的join节点处存在一个VWWorkObject,并且此VWWorkObject存在于系统队列Delay(0)中。
如果Delay节点的输入时间早于流程到达Delay节点时的系统时间,将可能导致下一Component节点任务被锁定而不能自动执行。当时间类型字段未赋初值时,PE默认值为流程传输时间。
BPM中/static/upload/old_blog/attachments, datafields, event logs, indexes, operations, queues, rosters, workflow groups的定义名称必须满足以下要求:
1. 以字母开头,只能包含字母,数字和下划线,不能包含格和特殊字符。
2. 不能使用 F_ 或者 VWV 作为开头。
3. 包含字符个数不能超过30个。?
流程中进行赋值的字段值不可以为NULL,否则会导致流程异常。如果组件节点上的输入参数为NULL时,流程将停在组件节点上不能执行。
子 视图(SubMap)使用系统节点返回方法(Return)返回主视图(Workflow),Return方法参数为boolean类型。当参数为 false时,返回主视图,并继续执行下一节点;当参数为true时,重复执行子视图。如下图为重载后的Malfunction子视图,当Return方 法参数为true时,流程返回主流程发生异常的节点,再次执行后进入Malfunction子视图。
开发
Queue, Roster, Event Log查询时,作为查询条件的字段必须在查询对象中暴露。
F_WobNum查询条件: MS SQL: 查询条件 F_WobNum = 0x'C4BCB36717A2D3119E0F00C04F8C7570' |
或者也可以用另外一种方式:
String wobNum = "C4BCB36717A2D3119E0F00C04F8C7570" ; Object[ ] substitutuionVars = { new VWWorkObjectNumber(wobNum) } ; qQuery = vwQueue.createQuery(null, null, null, VWQueue.QUERY_NO_OPTIONS, |
使用setFieldValue方法对字符串数组类型字段赋值
当数组字段长度不变时:vwWorkObject.setFieldValue("FieldName", Object); 当数组字段长度变化时:vwWorkObject.setFieldValue("FieldName", Object, true); |
Processor的bug:
在执行Workplace的Processor时,在CustomLaunchModuleJSP.jsp页
面会报NullPointerException错。
请将: WcmStepElementState stepState = WcmStepElementState.getInstance(eprocessDataProvider); VWStepElement stepElement = stepState.getVWStepElement(); 替换为: WcmStepElementState stepState = eprocessDataProvider.getStepElementState(); VWStepElement stepElement = stepState.getVWStepElement(); |
同样的问题也发生在CustomLaunchModule.java。
解锁其它用户的锁:
已经被其它用户锁定的任务是不能被直接解锁的,但是如果有权限可以先覆盖锁再解锁。
firstElement.doLock( true ); VWStepElement[] elements = { firstElement }; VWStepElement.doUnlockMany( elements, false, false ); |
提示"Security attributes disallow access"时,请检查当前系统时间与PE系统时间是否一致,或是相差是否超过15分钟。
流程问题
更新Component Queue。
当 调用方法的包名不变,类名不变,调用方法名及参数的个数、类型、顺序等不变时,可以通过先停止Component Manager,然后替换Jar包后重 启Component Manager的方法更新这个组件。以上任何一个发生改变时,均需要重新注册组件完成组件的更新。
Component Queue 异常,异常信息:Unable to find target Method ****. 找不着目标方法时,检查代码中的参数与流程中的参数类型、顺 序、个数是否匹配,方法名是否一致。如果完全一致,则重新打包,将此Component Queue重新注册一次就能解决此异常。
Component节点参数存在表达式,并且表达式有误时,会导致Component异常或是滞留。例如以下错误:
timetostring(systemtime, “yyy/MM/dd”)
timetostring(systemtime, “yyyy/MM/dd HH:mm:ss”) |
Component节点参数存在值为Null时,会导致Component异常或是滞留。
流程传输失败。
1. 首先打开流程,验证流程是否通过?
2. 检查PE状态是否正常。
流程跟踪器异常。流程跟踪器打开后,能看到流程,但找不到当前活动节点,通常是由于事件日志异常造成。查询事件日志,查看日志是否异常,是否在某节点日志中断。这通常是由于字段赋值过长,或是人为因素造成。
注册Component Queue,配置Component Adaptor时,点击Configuration无效,通常需要先注册其它引用的Jar包。如下图:
注册Component Queue时,Commit Change失败?
失败信息如下:
Undefined work performer operation, work class =
payinfochangeNew, instruction sheet = Workflow, authored Instruction ID = 47……
|
这表明:已经存在被传输的流程(work class = payinfochangeNew)使用了这个Component Queue中的方法,并且这个方法与修改后的方法不兼容(方法名、参数发生变化导致)。
解决办法:将这个流程定义(非流程实例)中的Component Queue上调用的方法删除,保留一个空的Component节点,检入流程后传输。传输完成后再次 Commit Change。
当有大量活动流程正在进行时,进行流程传输或其它操作可能会导致Region锁定。
正确的操作是:传输流程前要停止所有运行流程的操作(停止ComponentManager,停止应用程序)。误操作导致Region锁定,
解决办法:
以泰康人寿DB2数据库为例,连接至PE数据库VWDB,
重置表 VWISOLREG 中F_MODSERVERNAME, F_MODTIMESTAMP, F_MODSTATE字段为空即可。
$ db2 describe table VWISOLREG |
Column name Type schema Type name Length scale Nulls ------------------------------ --------- ------------------ -------- ----- ------ ------ ------ ------ ------ ------ ------ F_REGIONNUM SYSIBM INTEGER 4 0 No F_TIMESTAMP SYSIBM INTEGER 4 0 No F_WSTIMESTAMP SYSIBM INTEGER 4 0 Yes F_TABLESCreateD SYSIBM DECIMAL 3 0 No F_MODOPERATION SYSIBM DECIMAL 3 0 No F_MODSERVERNAME SYSIBM VARCHAR 256 0 Yes F_MODTIMESTAMP SYSIBM INTEGER 4 0 No F_MODSTATE SYSIBM DECIMAL 3 0 Yes |
db2 "update VWISOLREG set F_MODOPERATION=0, F_MODSERVERNAME=NULL, F_MODTIMESTAMP=-2000000000, F_MODSTATE=NULL where F_REGIONNUM=1" |
From:一号门
Previous:delphi 监控 USB 端口(附源码下载)
COMMENTS