Drools开源业务规则引擎(六)- Drools Flow中RuleFlow文件即*.rf文件介绍

文章目录

  • Drools开源业务规则引擎(六)- RuleFlow文件即*.rf文件介绍
    • 1.\<header>
      • 1.1.\<imports>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 1.2.\<globals>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 1.3.\<functionImports>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 1.4.\<variables>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 1.5.\<exceptionHandlers>
        • a.标签格式
        • b.属性说明
        • c.示例代码
    • 2.\<nodes>
      • 2.1.\<start>/\<end>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.2.\<metaData>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.3.\<triggers>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.4.\<constraint>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.5.\<eventFilter>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.6.\<actionNode>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.7.\<ruleSet>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.8.\<split>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.9.\<join>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.10.\<timerNode>
        • a.标签格式
        • b.属性说明
        • c.示例代码
      • 2.11.\<eventNodeNode>
        • a.标签格式
        • b.属性说明
        • c.示例代码
    • 3.\<connections>
      • 标签格式
      • 属性说明
      • 示例代码
    • 4.案例代码
      • 4.1.依赖导入
      • 4.2.规则文件(DRL)
      • 4.3.规则流文件(DRF)
      • 4.4.测试方法

Drools开源业务规则引擎(六)- RuleFlow文件即*.rf文件介绍

Drools Flow简介:

​ Drools 4.0有一个简单的“RuleFlow”功能,用于编排规则。Drools 5.0引入了一个强大的(可扩展的)工作流引擎。它允许用户使用规则和流程来指定他们的业务逻辑(在流程和规则之间可以进行强大的交互),并提供一个统一的环境。

​ 从Drools5.2版本起,Drools Flow项目和jBPM项目已合并到jBPM项目中,称为jBPM5(官方文档地址:https://docs.jboss.org/jbpm/v5.0/userguide)。jBPM 5.0已经发布,Drools项目将使用jBPM5作为引擎来支持流程功能。Drools Flow作为一个子项目将不再存在,但其愿景将继续作为jBPM项目的一部分,仍然允许(可选但)业务规则、业务流程和复杂事件处理之间的高级集成以及所有三种范式的统一环境。

​ *.rf文件可以说是在Drools6.4版本之前的规则流文件,Drools6.4及之后的版本中 *.rf 是已经淘汰了,但功能和bpmn2是一样的。由于 *.rf文件在可读性上比bpmn2要强一些,所以本文会先从简单的rf文件入手,以便大家方便理解《Drools开源业务规则引擎(五)- jBPM流程图元素介绍》,同时,一些简单的流程也可以通过rf文件去实现,并且不需要可视化工具,也可以手搓代码。

1.<header>

<header> 元素用来定义流程文件的元数据信息。

子标签/元素

  • <imports>:导入外部的类和包。可以使用这些导入的类和包来定义规则和行为。

  • <globals>:定义全局变量,这些变量在整个流程中均可使用。

  • <variables>:定义自定义属性,并在流程中进行配置和使用。

  • <functionImports>:定义自定义的函数。

  • <exceptionHandlers>:用于定义处理流程中发生的异常情况的异常处理程序。

1.1.<imports>

a.标签格式
  <xs:element name="imports"><xs:complexType><xs:sequence minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:import"/></xs:sequence></xs:complexType></xs:element><!-- 导入的import -->	<xs:element name="import"><xs:complexType><xs:attribute name="name" type="xs:string" use="required"/></xs:complexType></xs:element>
b.属性说明
  • name:导入外部的类和包名。
c.示例代码
<header><imports><import name="com.ahao.project.input.UserIn"/></imports>
</header>

1.2.<globals>

a.标签格式
<xs:element name="globals"><xs:complexType><xs:sequence minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:global"/></xs:sequence></xs:complexType>
</xs:element>
<xs:element name="global"><xs:complexType><xs:attribute name="identifier" type="xs:string" use="required"/><xs:attribute name="type" type="xs:string" use="required"/></xs:complexType>
</xs:element>
b.属性说明
  • identifier:全局变量的标识符(名称)。
  • type:全局变量的类型。
c.示例代码
 <header><globals><global identifier="output" type="com.ahao.project.output.UserOut"/></globals></header>

1.3.<functionImports>

a.标签格式
<xs:element name="functionImports"><xs:complexType><xs:sequence minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:functionImport"/></xs:sequence></xs:complexType></xs:element><xs:element name="functionImport"><xs:complexType><xs:attribute name="name" type="xs:string" use="required"/></xs:complexType></xs:element>
b.属性说明
  • name:带类型的函数名称。
c.示例代码
  <functionImports><functionImport name="com.ahao.project.util.StrUtil.stringPrint"/></functionImports>

1.4.<variables>

a.标签格式
  <!-- 对应类型:org.jbpm.process.core.context.variable.Variable --><xs:element name="variables"><xs:complexType><xs:sequence minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:variable"/></xs:sequence></xs:complexType></xs:element><xs:element name="variable"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:type"/><xs:element ref="drools:value"/></xs:choice><xs:attribute name="name" type="xs:string" use="required"/></xs:complexType></xs:element><xs:element name="type"><xs:complexType><xs:attribute name="name" type="xs:string" use="required"/><xs:attribute name="className" type="xs:string" /></xs:complexType></xs:element><xs:element name="value"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element>
b.属性说明
  • name:变量名称。
    • type:变量类型。
      • name:类型的全路径类名(org.jbpm.process.core.datatype.impl.type包下)。
      • className:类名。
    • value:变量值。
c.示例代码
		<variables><variable name="str"><type name="org.jbpm.process.core.datatype.impl.type.StringDataType" className="String"/><value>测试内容</value></variable></variables>

1.5.<exceptionHandlers>

a.标签格式
  <!-- 对应类型:org.jbpm.compiler.xml.processes.ExceptionHandlerHandler --><xs:element name="exceptionHandler"><xs:complexType><xs:sequence minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:action"/></xs:sequence><xs:attribute name="faultName" type="xs:string" use="required"/><xs:attribute name="type" type="xs:string" use="required"/><xs:attribute name="faultVariable" type="xs:string"/></xs:complexType></xs:element><!-- org.jbpm.workflow.core.node.ActionNode --><xs:element name="action"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"><xs:attribute name="name" type="xs:string"/><xs:attribute name="type" type="xs:string"/><xs:attribute name="dialect" type="xs:string"/></xs:extension></xs:simpleContent></xs:complexType></xs:element>
b.属性说明
  • faultName:要处理的异常的类型或名称。
  • type:ExceptionHandler类型。
    • 可选值:action。
  • faultVariable:可选的变量名称,用来存储异常对象的引用。
  • exceptionHandler:定义了处理Java.lang.Exception类型异常的处理逻辑。
c.示例代码
  <header><exceptionHandlers><exceptionHandler faultName="java.lang.NullPointerException" type="action"><action dialect="java" type="expression">System.out.println("+++++++异常了+++++++++");</action></exceptionHandler></exceptionHandlers></header>

可以在流程中加入以下action节点,所抛出的异常会被上面的异常处理器捕获

Integer i = null; System.out.println("-----流程节点123-------"); System.out.println(i.toString());

在这里插入图片描述

2.<nodes>

规则流(RuleFlow)文件中定义节点的元素。节点表示流程中的一个步骤或活动,可以是任务、决策点、子流程等等。

公共属性

  • id:指定节点的唯一标识符。
  • name:指定节点的名称。
  • xy:指定节点在画布上的位置。
  • widthheight:指定节点的宽度和高度。

以上是节点的公共属性,后续小节将不会再过多说明。

子标签

<xs:element ref="drools:start"/>
<xs:element ref="drools:end"/>
<xs:element ref="drools:actionNode"/>
<xs:element ref="drools:ruleSet"/>
<xs:element ref="drools:split"/>
<xs:element ref="drools:join"/>
<xs:element ref="drools:milestone"/>
<xs:element ref="drools:subProcess"/>
<xs:element ref="drools:workItem"/>
<xs:element ref="drools:timerNode"/>
<xs:element ref="drools:humanTask"/>
<xs:element ref="drools:composite"/>
<xs:element ref="drools:forEach"/>
<xs:element ref="drools:eventNode"/>
<xs:element ref="drools:fault"/>
<xs:element ref="drools:state"/>
<xs:element ref="drools:dynamic"/>

2.1.<start>/<end>

<start>表示规则流的起点节点,<end>表示规则流的结束节点。

a.标签格式
  <!-- 起始节点 --><xs:element name="start"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:metaData"/><xs:element ref="drools:triggers"/></xs:choice><xs:attribute name="id" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="x" type="xs:string"/><xs:attribute name="y" type="xs:string"/><xs:attribute name="width" type="xs:string"/><xs:attribute name="height" type="xs:string"/></xs:complexType></xs:element><!-- 结束节点 --><xs:element name="end"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:metaData"/></xs:choice><xs:attribute name="id" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="x" type="xs:string"/><xs:attribute name="y" type="xs:string"/><xs:attribute name="width" type="xs:string"/><xs:attribute name="height" type="xs:string"/><xs:attribute name="terminate" type="xs:string"/></xs:complexType></xs:element>
b.属性说明
  • <nodes>公共属性。
c.示例代码
<nodes><start id="1" name="Start"  height="40"/><end id="4" name="End" x="372" y="77" width="80" height="40" />
</nodes>

2.2.<metaData>

在规则引擎中用于为规则和规则流(RuleFlow)等元素定义和存储元数据。元数据是与规则和规则流相关的附加信息,可以帮助规则引擎对规则进行管理、优化和执行。

元数据可以包含各种类型的信息,例如规则的作者、版本号、创建日期、规则状态等等。这些信息可以用于文档生成、规则管理、规则版本控制、规则访问控制或其他目的。

a.标签格式
  <xs:element name="metaData"><xs:complexType><xs:choice minOccurs="0" maxOccurs="1"><xs:element ref="drools:value"/></xs:choice><xs:attribute name="name" type="xs:string" use="required"/></xs:complexType></xs:element>
b.属性说明
  • name:名称。
  • value:值。
c.示例代码
<nodes><start id="1" name="Start"  height="40" ><metaData name="author"><value>AHAO</value></metaData></start>
</nodes>

2.3.<triggers>

触发器,用来在特定条件下触发某个节点的条件或事件。

a.标签格式
  <!-- 对应类型:org.jbpm.compiler.xml.processes.TriggerHandler --><xs:element name="triggers"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:trigger"/></xs:choice></xs:complexType></xs:element><xs:element name="trigger"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:constraint"/><xs:element ref="drools:eventFilters"/><xs:element ref="drools:mapping"/></xs:choice><xs:attribute name="type" type="xs:string" use="required"/></xs:complexType></xs:element>
b.属性说明
  • type:触发器类型。
    • 可选值:constraint,event。
c.示例代码
<triggers><trigger type="constraint"><constraint dialect="mvel" type="rule" priority="1">UserIn(age > 10)</constraint></trigger>
</triggers>

2.4.<constraint>

用于在规则引擎中定义规则条件。它指定了规则的条件表达式,只有当条件满足时,规则引擎才会执行该规则所定义的动作。

a.标签格式
  <xs:element name="constraint"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"><xs:attribute name="toNodeId" type="xs:string"/><xs:attribute name="toType" type="xs:string"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="priority" type="xs:string"/><xs:attribute name="type" type="xs:string"/><xs:attribute name="dialect" type="xs:string"/></xs:extension></xs:simpleContent></xs:complexType></xs:element>
b.属性说明
  • toNodeId:在条件满足时要执行的目标节点。
  • toType:目标类型。
  • name:名称。
  • priority:优先级。
  • type:指定条件类型。
    • 可选值:rule,code。
  • dialect:语义。
    • 可选值:mvel,java,JavaScript。
c.示例代码
<!-- rule mvel -->
<constraint type="rule" dialect="mvel" priority="1">UserIn(age > 10)
</constraint><!-- code java -->
return person.getAge() > 20;
<!-- code mvel -->
return person.age > 20;
<!-- code JavaScript -->
person.age > 20

2.5.<eventFilter>

过滤事件的类型,只有满足特定事件类型的事件才能在规则流中进行处理。对应org.jbpm.process.core.event.EventTypeFilter 类型。

a.标签格式
  <xs:element name="eventFilters"><xs:complexType><xs:sequence minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:eventFilter"/></xs:sequence></xs:complexType></xs:element><xs:element name="eventFilter"><xs:complexType><xs:attribute name="type" type="xs:string" use="required"/><xs:attribute name="eventType" type="xs:string" use="required"/></xs:complexType></xs:element>
b.属性说明
  • type:事件过滤类型。
    • 可选值:eventType。
  • eventType:事件类型。
c.示例代码
<eventFilters><eventFilter type="eventType" eventType="MyEventType"/>
</eventFilters>

2.6.<actionNode>

执行某种特定行为或操作的行为节点。

a.标签格式
  <xs:element name="actionNode"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:metaData"/><xs:element ref="drools:action"/></xs:choice><xs:attribute name="id" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="x" type="xs:string"/><xs:attribute name="y" type="xs:string"/><xs:attribute name="width" type="xs:string"/><xs:attribute name="height" type="xs:string"/></xs:complexType></xs:element><xs:element name="action"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"><xs:attribute name="name" type="xs:string"/><xs:attribute name="type" type="xs:string"/><xs:attribute name="dialect" type="xs:string"/></xs:extension></xs:simpleContent></xs:complexType></xs:element>
b.属性说明
  • name:名称。
  • type:行为类型。
    • 可选值:expression。
  • dialect:语义。
    • 可选值:java,mvel。
c.示例代码
<actionNode id="12">
<!--      <action type="expression" dialect="java" name="行为节点">-->
<!--        System.out.println("行为节点-全局变量[java]:"+output.getAgeStages());-->
<!--      </action>--><action type="expression" dialect="mvel" name="行为节点">System.out.println("行为节点-全局变量[mvel]:"+output.ageStages);</action>
</actionNode>

2.7.<ruleSet>

规则集,表示一组相关的规则的集合。

a.标签格式
<xs:element name="ruleSet"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:metaData"/><xs:element ref="drools:timers"/></xs:choice><xs:attribute name="id" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="x" type="xs:string"/><xs:attribute name="y" type="xs:string"/><xs:attribute name="width" type="xs:string"/><xs:attribute name="height" type="xs:string"/><xs:attribute name="ruleFlowGroup" type="xs:string"/></xs:complexType></xs:element>
b.属性说明
  • ruleFlowGroup:规则流分组,对应于drl文件中的ruleflow-group属性。
c.示例代码
<ruleSet id="2" name="规则流分组1" ruleFlowGroup="Group1">
</ruleSet>

2.8.<split>

分支节点,用于创建分支,将规则流的执行流程拆分成多个并行的分支(相当于网关)。

a.标签格式
<xs:element name="split"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:metaData"/><xs:element ref="drools:constraints"/></xs:choice><xs:attribute name="id" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="x" type="xs:string"/><xs:attribute name="y" type="xs:string"/><xs:attribute name="width" type="xs:string"/><xs:attribute name="height" type="xs:string"/><xs:attribute name="type" type="xs:string"/></xs:complexType>
</xs:element>
b.属性说明
  • type:以下是可选类型。(org.jbpm.workflow.core.node.Split)。
    • 0:TYPE_UNDEFINED。未定义类型
    • 1:TYPE_AND。所有的分支路径都必须满足条件,才能够通过分裂节点。
    • 2:TYPE_XOR。只有一个分支路径能够满足条件,才能够通过分裂节点。
    • 3:TYPE_OR。至少有一个分支路径能够满足条件,就可以通过分裂节点。
c.示例代码
<split id="123" type="2"><constraints><constraint toNodeId="2" type="rule" dialect="mvel">UserIn(age &lt;= 10)</constraint><constraint toNodeId="3" type="rule" dialect="mvel">UserIn(age > 10)</constraint></constraints>
</split>

2.9.<join>

合并节点,用于定义流程的合并行为。(相当于合并网关,配合<split>标签一起使用)

a.标签格式
  <xs:element name="join"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:metaData"/></xs:choice><xs:attribute name="id" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="x" type="xs:string"/><xs:attribute name="y" type="xs:string"/><xs:attribute name="width" type="xs:string"/><xs:attribute name="height" type="xs:string"/><xs:attribute name="type" type="xs:string"/><xs:attribute name="n" type="xs:string"/></xs:complexType></xs:element>
b.属性说明
  • type:以下是可选类型。(org.jbpm.workflow.core.node.Join)。
    • 0:TYPE_UNDEFINED。未定义类型
    • 1:TYPE_AND。合并节点要求所有传入的分支都执行完毕后,才能够继续执行合并节点之后的操作。
    • 2:TYPE_XOR。只有一个分支路径能够满足条件,才能够执行合并节点之后的操作。
    • 3:TYPE_DISCRIMINATOR。只有一个分支路径能够满足条件,才能够执行合并节点之后的操作。
    • 4:TYPE_N_OF_M。至少有n个分支路径能够满足条件,才能够执行合并节点之后的操作。
    • 5:TYPE_OR。至少有一个分支路径能够满足条件,才能够执行合并节点之后的操作。
  • n:满足条件分支数量。(当类型为TYPE_N_OF_M生效)
c.示例代码
<join id="1234" type="5"></join>

2.10.<timerNode>

定时器节点,在指定的时间点或时间间隔执行后续操作。

a.标签格式
  <xs:element name="timerNode"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:metaData"/></xs:choice><xs:attribute name="id" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="x" type="xs:string"/><xs:attribute name="y" type="xs:string"/><xs:attribute name="width" type="xs:string"/><xs:attribute name="height" type="xs:string"/><xs:attribute name="delay" type="xs:string"/><xs:attribute name="period" type="xs:string"/></xs:complexType></xs:element>
b.属性说明
  • delay:延迟时间
  • period:循环周期
c.示例代码
<timerNode id="5" delay="1s" period="1d"/>

2.11.<eventNodeNode>

事件节点需要指定节点感兴趣的事件类型。它还可以定义变量的名称,该变量将接收与该事件相关联的数据。这允许流程中的后续节点访问事件数据,并根据这些数据采取适当的操作。

a.标签格式
<xs:element name="eventNode"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:metaData"/><xs:element ref="drools:eventFilters"/></xs:choice><xs:attribute name="id" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string"/><xs:attribute name="x" type="xs:string"/><xs:attribute name="y" type="xs:string"/><xs:attribute name="width" type="xs:string"/><xs:attribute name="height" type="xs:string"/><xs:attribute name="variableName" type="xs:string"/><xs:attribute name="scope" type="xs:string"/></xs:complexType></xs:element>
b.属性说明
  • variableName:变量名称

  • scope:发送事件信号的方式

    • Internal:内部

      • kcontext.getProcessInstance().signalEvent(type, eventData);
        
    • external:外部

      • ksession.signalEvent(type, eventData);
        
c.示例代码
 <eventNode id="61" variableName="str" scope="external"><eventFilters><eventFilter type="eventType" eventType="myEvent"/></eventFilters></eventNode>
<!--kieSession.signalEvent("myEvent","Singal Event");
-->

3.<connections>

用于定义规则流中不同节点之间的连接关系。在规则引擎中,规则流可以被看作是一系列规则节点的有向图,并且节点之间的连接定义了规则执行的先后顺序。 <connections> 元素应该包含一个或多个 <connection> 子元素,每个 <connection> 元素定义了两个节点之间的连接。

标签格式

<xs:element name="connections"><xs:complexType><xs:sequence minOccurs="0" maxOccurs="unbounded"><xs:element ref="drools:connection"/></xs:sequence></xs:complexType>
</xs:element>
<xs:element name="connection"><xs:complexType><xs:attribute name="from" type="xs:string" use="required"/><xs:attribute name="to" type="xs:string" use="required"/><xs:attribute name="fromType" type="xs:string"/><xs:attribute name="toType" type="xs:string"/><xs:attribute name="bendpoints" type="xs:string"/></xs:complexType>
</xs:element>

属性说明

  • from:连接的起始节点(id)。
  • to:连接的目标节点(id)。
  • fromType:表示起始节点的类型。
  • toType:表示目标节点的类型。
  • bendpoints:连接的弯曲点。

示例代码

  <nodes><start id="1" name="Start"  height="40" /><end id="2" name="End" height="40" /></nodes><connections><connection from="1" to="2" /></connections>

4.案例代码

4.1.依赖导入

        <dependency><groupId>org.jbpm</groupId><artifactId>jbpm-bpmn2</artifactId><version>7.6.0.Final</version></dependency>

4.2.规则文件(DRL)

package drools.ruleflow;
dialect  "mvel"// 导入输入类型
import com.ahao.project.input.UserIn;
global com.ahao.project.output.UserOut output;rule "group1"
ruleflow-group "Group1"
when$in:UserIn(age <= 10)
thenoutput.setAgeStages("<=10");
endrule "group2"
ruleflow-group "Group2"
when$in:UserIn()
thenoutput.setAgeStages(">>>>>10");
end

4.3.规则流文件(DRF)

<?xml version="1.0" encoding="UTF-8"?>
<process xmlns="http://drools.org/drools-5.0/process"xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"type="RuleFlow" name="RuleFlow_Demo" id="RFDemo" package-name="drools.ruleflow"><header><imports><import name="com.ahao.project.input.UserIn"/><import name="com.ahao.project.util.DateTimeUtil"/></imports><globals><global identifier="output" type="com.ahao.project.output.UserOut"/></globals><variables><variable name="str"><type name="org.jbpm.process.core.datatype.impl.type.StringDataType" className="String"/><value>测试内容</value></variable></variables><exceptionHandlers><exceptionHandler faultName="java.lang.NullPointerException" type="action"><action dialect="java" type="expression">System.out.println("+++++++异常了+++++++++");</action></exceptionHandler></exceptionHandlers></header><nodes><start id="1" name="Start" height="40"><metaData name="TriggerMapping"><value>AHAO</value></metaData><triggers><trigger type="event"><eventFilters><eventFilter type="eventType" eventType="None"/></eventFilters></trigger></triggers></start><actionNode id="12"><!--      <action type="expression" dialect="java" name="行为节点">--><!--        System.out.println("行为节点-全局变量[java]:"+output.getAgeStages());--><!--      </action>--><action type="expression" dialect="mvel" name="行为节点">System.out.println("行为节点-全局变量[mvel]:"+output.ageStages);</action></actionNode><split id="123" type="2"><constraints><constraint toNodeId="2" type="rule" dialect="mvel">UserIn(age &lt;= 10)</constraint><constraint toNodeId="3" type="rule" dialect="mvel">UserIn(age > 10)</constraint></constraints></split><join id="1234" type="3"></join><ruleSet id="2" name="Verify" x="162" y="77" width="80" height="40" ruleFlowGroup="Group1"></ruleSet><ruleSet id="3" name="Calculation" x="267" y="77" width="80" height="40" ruleFlowGroup="Group2"/><actionNode id="41"><!--      <action type="expression" dialect="java" name="行为节点">--><!--        System.out.println("行为节点-全局变量[java]:"+output.getAgeStages());--><!--      </action>--><action type="expression" dialect="mvel" name="结束行为节点">System.out.println(DateTimeUtil.now()+": 结束行为!!!!!");</action></actionNode><eventNode id="61" variableName="str" scope="external"><eventFilters><eventFilter type="eventType" eventType="None"/></eventFilters></eventNode><timerNode id="5" delay="1s"/><actionNode id="42"><!--      <action type="expression" dialect="java" name="行为节点">--><!--        System.out.println("行为节点-全局变量[java]:"+output.getAgeStages());--><!--      </action>--><action type="expression" dialect="mvel" name="结束前行为节点">System.out.println(DateTimeUtil.now()+": 结束前!!!!");</action></actionNode><end id="4" name="End" x="372" y="77" width="80" height="40"/></nodes><connections><connection from="1" to="12"/><connection from="12" to="123"/><connection from="123" to="2"/><connection from="123" to="3"/><connection from="2" to="1234"/><connection from="3" to="1234"/><connection from="1234" to="41"/><connection from="41" to="61"/><connection from="61" to="5"/><connection from="5" to="42"/><connection from="42" to="4"/></connections></process>

4.4.测试方法

    @Testpublic void test() throws InterruptedException {// 获取文件内容String drl = ResourceUtil.fileContent("classpath:drools/ruleflow/rule-flow.drl");String rf = ResourceUtil.fileContent("classpath:drools/ruleflow/RuleFlowDemo.rf");KieHelper kieHelper = new KieHelper();KieBaseConfiguration kieBaseConfiguration = kieHelper.ks.newKieBaseConfiguration();// 加入文件内容,以便编译文件kieHelper.addContent(drl, ResourceType.DRL);kieHelper.addContent(rf,ResourceType.DRF);KieBase kieBase = kieHelper.build(kieBaseConfiguration);KieSession kieSession = kieBase.newKieSession();// 创建规则输出对象UserOut output = new UserOut();kieSession.setGlobal("output", output);// 创建规则输入对象UserIn input = new UserIn();input.setAge(19);// 执行规则kieSession.insert(input);// 指定流程idkieSession.startProcess("RFDemo");kieSession.fireAllRules();// 触发事件kieSession.signalEvent("None","2");kieSession.signalEvent("None","2");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open3D 计算点云FPFH特征

目录 一、概述 1.1法线估计 1.2SPFH&#xff08;Simplified Point Feature Histograms&#xff09;计算 1.3FPFH计算 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2计算数据 一、概述 FPFH&#xff08;Fast Point Feature Histogram&#xff0…

安全策略与用户认证综合实验

一、实验拓扑 二、实验需求 1,DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问. 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMz区的FTP服务器和HTTP服务器,仅能ping通10.0.3.10 4,办公区…

nginx初理解

没有ngix时&#xff0c;有两台服务器&#xff0c;供访问 1. 现在有两台服务器上同样的路径下都放了一个&#xff0c; 都能通过ip加端口访问到页面 后端项目 &#xff08;查看tomcat中的配置中的 server.xml&#xff0c;能找到项目路径&#xff09; tomacat 也都有 两个…

C++ | Leetcode C++题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<string> summaryRanges(vector<int>& nums) {vector<string> ret;int i 0;int n nums.size();while (i < n) {int low i;i;while (i < n && nums[i] nums[i - 1] …

pytorch-RNN实战-正弦曲线预测

目录 1. 正弦数据生成2. 构建网络3. 训练4. 预测5. 完整代码6. 结果展示 1. 正弦数据生成 曲线如下图&#xff1a; 代码如下图&#xff1a; 50个点构成一个正弦曲线随机生成一个0~3之间的一个值&#xff08;随机的原因是防止每次都从相同的点开始&#xff0c;50个点的正弦曲…

《C++设计模式》状态模式

文章目录 一、前言二、实现一、UML类图二、实现 一、前言 状态模式理解最基本上的我觉得应该也是够用了&#xff0c;实际用的话&#xff0c;也应该用的是Boost.MSM状态机。 相关代码可以在这里&#xff0c;如有帮助给个star&#xff01;AidenYuanDev/design_patterns_in_mode…

【PTA天梯赛】L1-005 考试座位号(15分)

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法刷题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录 题目题解try1 编译错误正确题解 总结 题目 题目链接 题解 try1 编译错误 #include<bits/stdc.h> using namespace std;typedef…

sdwan是硬件还是网络协议?

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;并不是一个硬件产品或单一的网络协议&#xff0c;而是结合了软件、硬件和网络技术的一种解决方案。SD-WAN的核心在于其软件定义的特性&#xff0c;它通过软件来控制和管理广域网的…

ENSP软件中DHCP的相关配置以及终端通过域名访问服务器

新建拓扑 配置路由器网关IP 设备配置命令&#xff1a;<Huawei> Huawei部分为设备名 <>代表当下所在的模式&#xff0c;不同模式下具有不同的配置权限<Huawei> 第一级模式&#xff0c;最低级模式 查看所有参数<Huawei>system-view 键入系统视图…

鸿蒙开发:每天一个小bug----鸿蒙开发路由跳转踩坑

一、前言 报错内容显示找不到页面 &#xff0c;肯定我们页面没写对呗&#xff01; 可能是这几个原因:1.main_pages.json没配置路由 {"src": ["pages/02/UserInfoClass","pages/02/AppStorageCase02"] } 2.跳转路径没写对 错误&#xff1a;…

Excel第29享:基于sum嵌套sumifs的多条件求和

1、需求描述 如下图所示&#xff0c;现要统计12.17-12.23这一周各个人员的“上班工时&#xff08;a1&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 首先&#xff0c;确定逻辑&#xff1a;“对多个条件&#xff08;日期、人员&#xff09;进行“工时”…

形态学图像处理

1 工具 1.1 灰度腐蚀和膨胀 当平坦结构元b的原点是(x,y)时&#xff0c;它在(x,y)处对图像f的灰度腐蚀定义为&#xff0c;图像f与b重合区域中的最小值。结构元b在位置(x,y)处对图像f的腐蚀写为&#xff1a; 类似地&#xff0c;当b的反射的原点是(x,y)时&#xff0c;平坦结构元…

react学习——24redux实现求和案例(精简版)

1、目录结构 2、count/index.js import React, {Component} from "react"; //引入store,用于获取数据 import store from ../../redux/store export default class Count extends Component {state {count:store.getState()}componentDidMount() {//监测redux中的…

传言称 iPhone 16 Pro 将支持 40W 快速充电和 20W MagSafe

目前&#xff0c;iPhone 15 和 iPhone 15 Pro 机型使用合适的 USB-C 电源适配器可实现高达 27W 的峰值充电速度&#xff0c;而 Apple 和授权第三方的官方 MagSafe 充电器可以高达 15W 的功率为 iPhone 15 机型进行无线充电。所有四款 iPhone 15 机型均可使用 20W 或更高功率的电…

PHP计件工资系统小程序源码

解锁高效管理新姿势&#xff01;全面了解计件工资系统 &#x1f525; 开篇&#xff1a;为什么计件工资系统成为企业新宠&#xff1f; 在这个效率至上的时代&#xff0c;企业如何精准激励员工&#xff0c;提升生产力成为了一大挑战。计件工资系统应运而生&#xff0c;它以其公…

【小沐学Python】在线web数据可视化Python库:Bokeh

文章目录 1、简介2、安装3、测试3.1 创建折线图3.2 添加和自定义渲染器3.3 添加图例、文本和批注3.4 自定义您的绘图3.5 矢量化字形属性3.6 合并绘图3.7 显示和导出3.8 提供和筛选数据3.9 使用小部件3.10 嵌入Bokeh图表到Flask应用程序 结语 1、简介 https://bokeh.org/ https…

算法力扣刷题记录 四十【226.翻转二叉树】

前言 继续二叉树其余操作&#xff1a; 记录 四十【226.翻转二叉树】 一、题目阅读 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例…

CAS介绍

CAS是计算机科学中的一个概念&#xff0c;全称是Compare-And-Swap&#xff08;比较并交换&#xff09;&#xff0c;它是一种原子操作&#xff0c;用于多线程环境下的同步机制。在Java中&#xff0c;你可以使用java.util.concurrent.atomic包下的类&#xff0c;如AtomicInteger来…

绝对值不等式运用(C++)

货仓选址 用数学公式表达题意&#xff0c;假设有位置a1~an,假设选址在x位置处&#xff0c;则有&#xff1a; 如何让这个最小&#xff0c;我们把两个式子整合一下&#xff0c;利用绝对值不等式&#xff1a; 我们知道&#xff1a; 如下图所示&#xff1a;到A&#xff0c;B两点&…

用python生成词频云图(python实例二十一)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.词频云图 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…