java多规则自动分配任务实现,demo09: 任务: 1、人工任务 2、脚本任务 3、Java服务任务 4、Web服务任务 5、业务规则任务 6、邮件任务 7、Http任务 8、Mule任务 9、C...

本文详细介绍了在Java流程引擎中实现的各种任务类型,包括人工任务、脚本任务、服务任务、业务规则任务、邮件任务、Http任务、Camel任务、手动任务、Java接收任务、Shell任务、执行监听器、任务监听器、多实例和补偿处理器。重点讨论了各任务类型的特性和配置,如脚本任务的脚本格式、服务任务的线程安全、业务规则任务的规则执行、邮件任务的配置、Http任务的使用以及多实例的动态完成条件。同时,文章提供了示例代码和测试用例,帮助读者理解和实践。
摘要由CSDN通过智能技术生成

环境:

1、原理

1.1 用户任务

​一个用户任务被用来模拟需要由人来完成的工作。当流程执行到达此类用户任务时,将在分配给该任务的任何用户或组的任务列表中创建新任务。

1.2 脚本任务

1.2.1 脚本任务是一种自动活动。当进程执行到达脚本任务时,将执行相应的脚本。

1.2.2 属性:

name:任务属性,用于指示任务的名称

type:任务属性,其值必须为“script”以指示任务的类型

scriptFormat:指示脚本语言的扩展属性(例如,javascript,groovy)

script:要执行的脚本,定义为名为“script”的字段元素中的字符串

autoStoreVariables:可选的任务属性标志(默认值:false),指示脚本中定义的变量是否将存储在执行上下文中(请参阅下面的注释)

resultVariableName:可选的任务属性,当存在时,将在Execution上下文中使用脚本评估结果存储具有指定名称的变量(请参阅下面的注释)

1.2.3 flowable支持三种脚本任务类型:Javascript、groovy、juel。

通过指定脚本和scriptFormat来定义脚本任务类型,其中Groovy脚本引擎与groovy-all JAR捆绑在一起,必须引入相关依赖:

org.codehaus.groovy

groovy-all

2.5.4

pom

1.2.4 脚本中的变量:

var sum = a+b;

execution.setVariable("sum",sum);

​也可以简单地调用execution.setVariable("variableName", variableValue),在脚本中设置流程变量。默认情况下,变量不会自动储存(请注意,在一些早期版本中是会储存的!)。可以将scriptTask的autoStoreVariables参数设置为true,以自动保存任何在脚本中定义的变量(例如上例中的sum)。然而这并不是最佳实践。最佳实践是显式调用execution.setVariable(),因为在JDK近期的一些版本中,某些脚本语言不能自动保存变量。查看这个链接了解更多信息。

​此参数的缺省值是false,这意味着如果从脚本任务定义中省略该参数,则所有声明的变量将仅在脚本的持续时间内存在。

1.2.5 脚本任务的结果

​脚本任务的返回值,可以通过为脚本任务定义的*'flowable:resultVariable'*属性设置为流程变量。可以是已经存在的,或者新的流程变量。如果指定为已存在的流程变量,则流程变量的值会被脚本执行的结果值覆盖。如果不指定结果变量名,则脚本结果值将被忽略。

1.3 服务任务

1.3.1 有四种方法声明如何调用Java逻辑:

指定实现了JavaDelegate或ActivityBehavior的类

调用解析为委托对象(delegation object)的表达式

调用方法表达式(method expression)

对值表达式(value expression)求值

1.3.2 字段注入与线程安全

​通常情况下,在服务任务中使用Java委托与字段注入是线程安全的。然而,有些情况下不能保证线程安全。这取决于设置,或Flowable运行的环境。

当使用flowable:class属性时,使用字段注入总是线程安全的(译者注:仍不完全安全,如对于多实例服务任务,使用的是同一个实例)。对于引用了某个类的每一个服务任务,都会实例化新的实例,并且在创建实例时注入一次字段。在不同的任务或流程定义中多次使用同一个类没有问题。

当使用flowable:expression属性时,不能使用字段注入。只能通过方法调用传递变量。总是线程安全的。

当使用flowable:delegateExpression属性时,委托实例的线程安全性,取决于表达式解析的方式。如果该委托表达式在多个任务或流程定义中重复使用,并且表达式总是返回相同的示例,则字段注入不是线程安全的。

1.3.3 线程安全最简单的解决方法是:

使用表达式代替直接使用Java委托,并将所需数据通过方法参数传递给委托。

或者,在每次委托表达式解析时,返回委托类的新实例。这意味着这个bean的scope必须是prototype(原型)(例如在委托类上加上@Scope(SCOPE_PROTOTYPE)注解)。

1.3.4 异常处理

抛出业务异常

​可以在服务任务或脚本任务的用户代码中抛出BPMN错误。可以在Java委托、脚本、表达式与委托表达式中,抛出特殊的FlowableException:BpmnError。引擎会捕获这个异常,并将其转发至合适的错误处理器,如错误边界事件或错误事件子流程。

默认映射是一个不指定类的映射,可以匹配任何Java异常:

发生异常时,将流程执行路由至另一条路径

ThrowingDelegate将会抛出BussinessException业务异常,errorcode为localError,Flowable会将BussinessException类,转换为带有指定错误代码的BPMN错误,边界错误捕获事件会捕获到此异常,并继续后续操作。

1.4 业务规则任务

​业务规则任务(business rule task)用于同步地执行一条或多条规则。Flowable使用名为Drools Expert的Drools规则引擎执行业务规则。目前,业务规则中包含的.drl文件,必须与定义了业务规则服务并执行规则的流程定义一起部署。这意味着流程中使用的所有.drl文件都需要打包在流程BAR文件中,与任务表单等类似。要了解如何为Drools Expert创建业务规则,请访问位于JBoss Drools的Drools文档。

​如果想要使用自己的规则任务实现,比如希望通过不同方法使用Drools,或者想使用完全不同的规则引擎,则可以使用BusinessRuleTask的class或expression属性。这样它会与服务任务的行为完全相同。

​要执行与流程定义在同一个BAR文件中部署的一条或多条业务规则,需要定义输入与结果变量。输入变量可以用流程变量的列表定义,使用逗号分隔。输出变量只能有一个变量名,将执行业务规则后的输出对象存储至流程变量。请注意结果变量会包含对象的List。如果没有指定结果变量名,默认为org.flowable.engine.rules.OUTPUT。

1.5 邮件任务

​Flowable让你可以通过自动的邮件服务任务(email task),增强业务流程。可以向一个或多个收信人发送邮件,支持cc,bcc,HTML文本,等等。请注意邮件任务不是BPMN 2.0规范的“官方”任务(所以也没有专用图标)。因此,在Flowable中,邮件任务实现为一种特殊的服务任务。

1.6 Http任务

​Http任务(Http task)用于发出HTTP请求,增强了Flowable的集成能力。请注意Http任务不是BPMN 2.0规范的“官方”任务(所以也没有专用图标)。因此,在Flowable中,Http任务实现为一种特殊的服务任务。

1.7 Camel任务

1.7.1 Camel任务

​Camel任务(Camel task)可以向Camel发送消息,增强Flowable的集成特性。请注意Camel任务不是BPMN 2.0规范的“官方”任务(所以也没有专用图标)。因此,在Flowable中,Camel任务实现为一种特殊的服务任务。还请注意,需要在项目中包含F

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值