`
jacky6024
  • 浏览: 80609 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

jbpm工作流引擎介绍

阅读更多

自己写的一份jbpm工作流引擎介绍的PPT文档,希望对大家有帮助.

分享到:
评论
27 楼 chengguogen 2011-09-30  
请您给我们作个培训吧,如何?我们需要专业支持。chenggg@founder.com
26 楼 chengguogen 2011-09-30  
请您给我们作个培训吧,如何?我们需要专业支持。
25 楼 xyz20003 2010-05-21  
jbpm4还没有完全成熟,jbpm3上的一些特性还没有完全迁移过来。因为它与jbpm3比较起来更易用,现在才有很多公司选择使用jbpm4。也有一层原因是jbpm4的图形比jbpm3漂亮了。
选择jbpm3还是jbpm4,还是应该根据你们公司本身的技术底子,如果以前有人做过jbpm3,那当然应该选择jbpm3,如果两样都没用过,建议用jbpm4,起码入手会快一点儿。如果公司有钱,建议还是用jbpm3,因为可以买red hat的官方培训和技术支持。
24 楼 qnjian 2010-05-19  
想问一下,现在JBPM4是否已经成熟,可以用于生产环境了?因为现在有一个新项目,在决定使用JBPM3还是4上面临抉择。谢谢!
23 楼 northwind1 2010-03-19  
LZ,我按照你在书中说的方法,使用MyEclipse发布流程,当无论哪种方式,都报如下错误
org.hibernate.MappingException: Could not determine type for: string_max, for columns: [org.hibernate.mapping.Column(MESSAGE_)]
这是怎么回事?我用的数据库是MS SQL2005,JBPM的映射文件中将varchar类型映射为string_max,我想这是
Hibernate不能识别的原因吧,你没遇到过这种问题么?我的邮箱是xjtshine@yahoo.com.cn,希望LZ能为我解惑
22 楼 northwind1 2010-03-19  
LZ,我按照你在书中说的方法,使用MyEclipse发布流程,当无论哪种方式,都报如下错误
org.hibernate.MappingException: Could not determine type for: string_max, for columns: [org.hibernate.mapping.Column(MESSAGE_)]
这是怎么回事?我用的数据库是MS SQL2005,JBPM的映射文件中将varchar类型映射为string_max,我想这是
Hibernate不能识别的原因吧,你没遇到过这种问题么?我的邮箱是xjtshine@yahoo.com.cn,希望LZ能为我解惑
21 楼 alfan001 2010-01-08  
请问高老师,jBPM的并行处理能力如何,能否用来开发有十几万用户的大型工作流系统?也就是说jBPM能否支持大批量用户同时发起工作流程实例,或是数量巨大的流程实例同时运行?谢谢
20 楼 flyinglogs 2009-12-29  
if(param>100)  上面刚写错了!
19 楼 jacky6024 2009-12-29  
您好,我在书里犯的错,SOORY,
    <expression>
     transitionNames = new ArrayList();
     if(param>10){
        transNames.add("to node1");
        transNames.add("to node2");
     }else{
        transNames.add("to node2");
        transNames.add("to node3");
     }
     </expression>

这里的transitionNames = new ArrayList();其中的transitionNames 应该为transNames
18 楼 flyinglogs 2009-12-29  
高哥: <fork name="fork1">
    <script >
    <variable name="transNames" access="write"></variable>
    <expression>
     transitionNames = new ArrayList();
     if(param>10){
        transNames.add("to node1");
        transNames.add("to node2");
     }else{
        transNames.add("to node2");
        transNames.add("to node3");
     }
     </expression>

我也是这样写的,为什么报错?


17:57:29,296 [main] DEBUG NullableType : returning '
      
            transitionNames=new ArrayList();
           if(param>100){
              transNames.add("to node1");
              transNames.add("to node2");
           }else{
              transNames.add("to node3");
              transNames.add("to node4");
           }
       ' as column: EXPRESSION11_4_0_
17:57:29,296 [main] DEBUG NullableType : binding '26' to parameter: 1
17:57:29,296 [main] DEBUG NullableType : returning '6' as column: ID1_8_0_
17:57:29,296 [main] DEBUG NullableType : returning 'transNames' as column: VARIABLE2_8_0_
17:57:29,296 [main] DEBUG NullableType : returning 'write' as column: ACCESS3_8_0_
17:57:29,296 [main] DEBUG NullableType : returning null as column: MAPPEDNAME4_8_0_
17:57:29,296 [main] DEBUG NullableType : returning '26' as column: SCRIPT5_1_
17:57:29,296 [main] DEBUG NullableType : returning '6' as column: ID1_1_
17:57:29,312 [main] DEBUG Script : script input: {taskInstance=null, node=Fork(fork1), param=60, token=Token(/), task=null, executionContext=ExecutionContext[Token(/)]}
17:57:29,453 [main] WARN  Script : exception during evaluation of script expression
Sourced file: inline evaluation of: ``                     transitionNames=new ArrayList();            if(param>100 . . . '' : Attempt to resolve method: add() on undefined variable or class name: transNames : at Line: 8 : in file: inline evaluation of: ``                     transitionNames=new ArrayList();            if(param>100 . . . '' : transNames .add ( "to node3" )

at bsh.UtilEvalError.toEvalError(Unknown Source)
at bsh.UtilEvalError.toEvalError(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHBlock.evalBlock(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BSHIfStatement.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at org.jbpm.graph.action.Script.eval(Script.java:130)
at org.jbpm.graph.action.Script.eval(Script.java:73)
at org.jbpm.graph.action.Script.eval(Script.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157)
at org.jbpm.graph.action.Script$$EnhancerByCGLIB$$5d7ac8d1.eval(<generated>)
at org.jbpm.graph.node.Fork.execute(Fork.java:104)
at org.jbpm.graph.def.Node.enter(Node.java:318)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157)
at org.jbpm.graph.def.Node$$EnhancerByCGLIB$$fb36a297.enter(<generated>)
at org.jbpm.graph.def.Transition.take(Transition.java:151)
at org.jbpm.graph.def.Node.leave(Node.java:393)
at org.jbpm.graph.node.StartState.leave(StartState.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157)
at org.jbpm.graph.def.Node$$EnhancerByCGLIB$$fb36a297.leave(<generated>)
at org.jbpm.graph.exe.Token.signal(Token.java:192)
at org.jbpm.graph.exe.Token.signal(Token.java:140)
at test.TestForkJion.main(TestForkJion.java:24)
org.jbpm.graph.def.DelegationException: Sourced file: inline evaluation of: ``                     transitionNames=new ArrayList();            if(param>100 . . . '' : Attempt to resolve method: add() on undefined variable or class name: transNames
at org.jbpm.graph.def.GraphElement.raiseException(GraphElement.java:382)
at org.jbpm.graph.def.GraphElement.raiseException(GraphElement.java:373)
at org.jbpm.graph.node.Fork.execute(Fork.java:106)
at org.jbpm.graph.def.Node.enter(Node.java:318)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)17:57:29,453 [main] DEBUG NullableType : binding '86' to parameter: 1

at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157)
at org.jbpm.graph.def.Node$$EnhancerByCGLIB$$fb36a297.enter(<generated>)
at org.jbpm.graph.def.Transition.take(Transition.java:151)
at org.jbpm.graph.def.Node.leave(Node.java:393)
at org.jbpm.graph.node.StartState.leave(StartState.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157)
at org.jbpm.graph.def.Node$$EnhancerByCGLIB$$fb36a297.leave(<generated>)
at org.jbpm.graph.exe.Token.signal(Token.java:192)
at org.jbpm.graph.exe.Token.signal(Token.java:140)
at test.TestForkJion.main(TestForkJion.java:24)
Caused by: Sourced file: inline evaluation of: ``                     transitionNames=new ArrayList();            if(param>100 . . . '' : Attempt to resolve method: add() on undefined variable or class name: transNames : at Line: 8 : in file: inline evaluation of: ``                     transitionNames=new ArrayList();            if(param>100 . . . '' : transNames .add ( "to node3" )

at bsh.UtilEvalError.toEvalError(Unknown Source)
at bsh.UtilEvalError.toEvalError(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHBlock.evalBlock(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BSHIfStatement.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at bsh.Interpreter.eval(Unknown Source)
at org.jbpm.graph.action.Script.eval(Script.java:130)
at org.jbpm.graph.action.Script.eval(Script.java:73)
at org.jbpm.graph.action.Script.eval(Script.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157)
at org.jbpm.graph.action.Script$$EnhancerByCGLIB$$5d7ac8d1.eval(<generated>)
at org.jbpm.graph.node.Fork.execute(Fork.java:104)
... 19 more
17:57:29,468 [main] DEBUG JbpmContext : closing jbpmContext org.jbpm.JbpmContext@1cde100
17 楼 jacky6024 2009-10-19  
dongyeyun  根据您的需求,我想您的流程模版可能是下面的样子:
                                        __________
                                       |         |
开始节点-->部门负责人审批-->其他相关部门审批-->decision节点-->中心负责人审批-->结束节点。

这其中,到达“部门负责人审批”节点,在结束该结点的任务时,可以为下面的节点“其他相关部门审批”分配一个任务处理人,可能是“教务部”、“学术部”或“研究部”,在“其他相关部门审批”结束时,可以向流程当中传递两个变量,其中一个变量是决定decision节点是直接到“中心负责人审批”还是回退到“其他相关部门审批”,另一个变量决定如果是回退到“其他相关部门审批”的话,那么这个审批人是“教务部”、“学术部”还是“研究部”。

思路就是这样,供您参考!

       
16 楼 dongyeyun 2009-10-19  
高老师您好:
     我有一个审批流程,其中有一环节是这样的:部门负责人审批---->其他相关部门审批------>中心负责人审批。其中需要依据不同的部门类型(部门类型我已经保存到流程上下文当中)可以流转到不同的“其他”部门。例如:“教务部”需要到“学术部”“研究部”;而“调研部”需要到其他的对应部门,不同的部门流转的节点不一样。总之就是想依据部门的类型动态的生成它的任务节点和转向。您可以给我提供些解决的方案吗?谢谢您宝贵的意见。
15 楼 jacky6024 2009-09-25  
    1、关于findActiveNodesByProcessInstance()方法指获取的该流程实例的什么样的节点啊?ActiveNode指的是什么样的节点啊?
答:ActiveNode指的是当前Node对应的Token没有被Suspend,也就它当前token的Suspended != true,同时当前Node对应的Token没有被end,也就是end is null。

    2、获取处于某一节点处的所有流程实例列表,方法定义如下:
List getProcessInstanceList(String nodeName)这我找了一下相关的方法,好像利用jbpm提供的API并不能获取到,是不需要自己操作jbpm数据库呀?请您指点。
答:这个方法默认是没有的,如果要用,需要自己写。
14 楼 dongyeyun 2009-09-24  
高老师您好:
    我还有些问题要请教您
    1、关于findActiveNodesByProcessInstance()方法指获取的该流程实例的什么样的节点啊?ActiveNode指的是什么样的节点啊?
    2、获取处于某一节点处的所有流程实例列表,方法定义如下:
List getProcessInstanceList(String nodeName)这我找了一下相关的方法,好像利用jbpm提供的API并不能获取到,是不需要自己操作jbpm数据库呀?请您指点。
13 楼 jacky6024 2009-09-23  
dongyeyun 写道
高老师您好:
    在一个流程管理当中,我通过怎样的方法可以实时的查看每一个节点的审批状态那。
例如我现在登录某一节点,这时通过点击“查看”可以看到当前节点之前和之后的节点状态
如:已审核、正在审核、未审核。还请高老师指点。

dongyeyun 您好,在书中有关于流程监控的简单实现,您可以参考一下。
12 楼 dongyeyun 2009-09-23  
高老师您好:
    在一个流程管理当中,我通过怎样的方法可以实时的查看每一个节点的审批状态那。
例如我现在登录某一节点,这时通过点击“查看”可以看到当前节点之前和之后的节点状态
如:已审核、正在审核、未审核。还请高老师指点。
11 楼 jacky6024 2009-08-03  
跟我一起拽 写道
<fork name="fork1">
    <script >
    <variable name="transNames" access="write"></variable>
    <expression>
     transitionNames = new ArrayList();
     if(param>10){
        transNames.add("to node1");
        transNames.add("to node2");
     }else{
        transNames.add("to node2");
        transNames.add("to node3");
     }
     </expression>
呵呵,上面加粗的地方是高老师在书中写错了!正确的应该是流程变量的名称和下面表达式中的变量名称相同哦。

非常感谢您指出我的错误!
10 楼 跟我一起拽 2009-08-03  
<fork name="fork1">
    <script >
    <variable name="transNames" access="write"></variable>
    <expression>
     transitionNames = new ArrayList();
     if(param>10){
        transNames.add("to node1");
        transNames.add("to node2");
     }else{
        transNames.add("to node2");
        transNames.add("to node3");
     }
     </expression>
呵呵,上面加粗的地方是高老师在书中写错了!正确的应该是流程变量的名称和下面表达式中的变量名称相同哦。
9 楼 jacky6024 2009-07-30  
你的操作从表面上看是对的,没有发现有什么错误地方。

这里的transitionNames变量是jBPM在fork节点处理的时候使用的变量名,同时它会将其强转成List类型,所以我们这里要将transitionNames声明为ArrayList,强转完成后它会从这个名为transitionNames的List里取所有的item作为向下流转的Transition名称。
8 楼 eddianliu 2009-07-30  
杰哥,你好,正在看你的那本《深入浅出jbpm》,在fork那里出现一个问题,
你在fork的事例中使用了beanshell来确定流程走向,可是我发布流程的时候,processdefinition.xml报错,定义的transNames的这个variable不识别。如:
<fork name="fork1">
    <script >
    <variable name="transNames" access="write"></variable>
    <expression>
     transitionNames = new ArrayList();
     if(param>10){
        transNames.add("to node1");
        transNames.add("to node2");
     }else{
        transNames.add("to node2");
        transNames.add("to node3");
     }
     </expression>
这一段,请问是否我的jbpm的版本不正确引起还是什么其他原因,另外,这里的transitionNames这个list有什么用意了,整个程序中似乎都没有用到这个变量。还请答复,谢谢!

相关推荐

Global site tag (gtag.js) - Google Analytics