LuBen Park

早起的鸟儿有虫吃,那早起的虫儿呢? ------- 程序员修炼之道

导航

NetBPM工作流Q&A (不断更新)

  

NetBPM工作流Q&A(不断更新)

Made by LuBen:2007年8月12日


目录

写在前面

如何打包par包

流程定义是不是不支持中文?

流程图片大小是不是不能超过8k?

动态委托类不能用么?

关于流程图形化设计的支持

action的参数不能超过3个

关于processinstance的endtime为空值

关于子流程向父流程传送属性

不断更新中...


前言

       在NetBPM的实践与应用中,大家一定会遇到各种各样的问题,笔者特建此帖, 聚集了一些典型问题,并作了初步解答。本帖将不断更新,大家有什么问题,可以在目录中寻找,若没有类似问题答案,欢迎留言讨论,对某些问题有好的解决方法等也可以留言,我将更新到目录中;-) 原文地址:http://www.cnblogs.com/LuBen/archive/2007/08/12/852382.html,转载就保留。

如何打包par包

       流程定义组件接口能够识别的包是zip压缩包,rar压缩包不能识别。 .par只是让流程定义压缩包区分其他压缩包的后缀,其实是不是.par不重要,重要的是zip压缩格式,并且包内文件结构符合nPdl要求。 所以要打包.par包,用普通压缩软件winrar进行zip压缩即可;-)

流程定义不支持中文?

      作为中国用户,在流程定义文件中使用中文是难以避免的,比如把流程的 名称取为"请假流程"而不是"holiday"。大家一定想到了XML编码,没错,把processdefinition.xml和webinterface.xml保存 为unicode编码就可以了(注:光在文件中这样写<?xml version="1.0" encoding="unicode" ?>是不行的,因为XML文件本身的编码格式也需要为unicode;-))。我们可以使用记事本打开XML文件,然后把编码如图所示改为unicode,然后保存即可:

 

流程图片大小不能超过8k?

       如果您使用的SQL Server2000数据库(其他数据库没有验证;-)),那么就会遇到一个问题: 流程图片大小不能超过8000字节,在web显示上也只能显示8000字节的图片;-) 为什么呢?实际上,如果图片超过8000字节,在流程定义包解析保存时, 数据库中也只保存了8000字节,多余的字节被忽略掉了,这是由于Nhibernate配置文件映射引起的。 解决的办法如下:修改Nhibernate映射文件ProcessBlockImpl.hbm.xml文件: 

1        <property
2            name="Image"
3            type="binary"
4            update="true"
5            insert="true"
6            column="image"
7        />

为:

1        <property
2            name="Image"
3            type="BinaryBlob"
4            update="true"
5            insert="true"
6            column="image"
7        />

动态委托类不能用么?

      动态委托类不能用,也是如上小节中流程图片大小一样原因 引起的,在库中只加载了8000字节的程序集,导致动态加载委托类不可用。解决办法如下:修改NHibernate映射文件AssemblyFileImpl.hbm.xml:

1        <property
2            name="Bytes"
3            type="binary"
4            update="true"
5            insert="true"
6            column="bytes"
7        />

为:

1        <property
2            name="Bytes"
3            type="BinaryBlob"
4            update="true"
5            insert="true"
6            column="bytes"
7        />

关于流程图形化设计的支持

       NetBPM支持图形化设计,源码在CVS GPD模块中。流程设计器由JAVA写成,若您对JAVA比较熟悉,可以对它进行扩充;-)
       注意:GPD源码,NetBPM作者不进行维护支持工作。

action的参数不能超过3个

       经过测试,流程定义时,action参数定义数目不能超过3个,如果超过3个,则在加载流程压缩包时将出错。如:

 1 <action event="process-instance-end" 
 2        handler="NetBpm.Workflow.Delegation.Impl.Action.EmailAction, NetBpm"   on-exception="log">
 3         <!--
 4              <parameter name="four">previousActor</parameter>
 5          -->
 6    <parameter name="one">previousActor</parameter>
 7    <parameter name="two">您提交了请假申请</parameter>
 8    <parameter name="three">you requested a holiday from ${start date} to ${end date} with comment ${comment}</parameter>
 9 </action>
10

       去掉注释,则action参数达到4个,此时加载报错。 此BUG还没有修复,暂时的解决方法为:用类似${start date}的语法定义要用到的属性,然后定义解析该语法的工具类,以替代达到目的。
        修改by LuBen 20070821: 
        并不是action的参数个数问题;-) 加载出现如下错误

  • NetBpm.Util.DB.DbException : NHibernate.ADOException while performing database operation 'iterate(select max( pd.Version ) from pd in class NetBpm.Workflow.Definition.Impl.ProcessDefinitionImpl where pd.Name = ? ,请假流程Holiday,type)' : could not insert: [NetBpm.Workflow.Delegation.Impl.DelegationImpl#246]
  • couldn't continue to parse the process archive

          是因为加载的值比数据库字段设计的值要小, 在NBPM_DELEGATION表中cofiguration字段设计为255, 而加上第四个参数后, 加载的值已经超过了255,而在源码中并没有捕获ArgumentOutOfRangeException,  所以会报这个看似不相干的错误. 其他类似超过数据库字段设计都会报这个错误, 知道原因了, 修改即可.

    关于processinstance的endtime为空值

           流程结束时源码中存在一个小BUG,流程结束后processinstance的endtime一直为空值,不会在流程结束时赋值。 解决方法为,在NetBpm.Workflow.Execution.Impl命名空间下,修改ExecutionEngineImpl类中ProcessEndState方法部分如下:
     

    .........
    1            FlowImpl rootFlow = (FlowImpl) executionContext.GetFlow();
    2            rootFlow.ActorId = null;
    3            rootFlow.End = DateTime.Now;
                     // 添加红色该句
    4            ((ProcessInstanceImpl)executionContext.GetProcessInstance()).End = DateTime.Now;
    5            rootFlow.Node = endState; // setting the node is not necessary if this method is called
    6            // from processTransition, but it is necessary if this method is
    7            // called from cancelProcessInstance in the component-impl.
    ..............

    关于子流程向父流程传送属性

           在IProcessInvocationHandler接口定义了CollectResults(IProcessInvocationContext processInvocationContext)方法, 此方法用来在子流程结束时,收集子流程要向父流程传递的属性值,但是引擎对收集后的属性保存实现不完全,需要作出修改。

    更新.....

  • posted on 2007-08-12 11:48  LuBen  阅读(8971)  评论(30编辑  收藏  举报