Drools.D.10:与Spring的集成

10.1. Drools 6.0的重要变化

Drools Spring集成已经经历了与Drools 6.0一致的彻底改变。以下是一些主要的变化


10.2. 与Drools Expert集成

在本节中,我们将解释kie名称空间。

10.2.1. KieModule

kie:kmodule定义了KieBase和相关的KieSession的集合。kmodule标签有一个强制参数’id’。

kmodule标记只能包含以下标记作为子标记。
kie: kbase

参考Drools专家文档中的kmodule.xml文档,了解对kmodule需求的详细解释。

10.2.2. KieBase

10.2.2.1. kie:kbase的参数作为属性
属性描述
nameKieBase的名字
packages这个kbase中包含的以逗号分隔的资源包列表
includes要包含的kbase名称。来自相应kbase的所有资源都包含在这个kbase中。
defaultBoolean (TRUE / FALSE)。默认的kbase,如果没有提供,则假定为FALSE
scopeprototype / singleton。如果没有提供假设为singleton(默认)
eventProcessingMode事件处理模式。有效的选项是STREAM, CLOUD
equalsBehavior有效的选项是IDENTITY, EQUALITY
declarativeAgenda有效的选项是enabled, disabled, true, false
10.2.2.2. kbase标记只能包含以下标记作为子标记。

kie: ksession

10.2.2.3. < kie: kbase >定义的例子

一个kmodule可以包含多个(1…n) kbase元素。

<kie:kmodule id="sample_module">
   <kie:kbase name="kbase1" packages="org.drools.spring.sample">
     ...
   </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>

10.2.3. 重要提示

为了正确初始化kmodule对象(kbase/ksession),必须定义org.kie.spring.KModuleBeanFactoryPostProcessor 或 org.kie.spring.annotations.KModuleAnnotationPostProcessor Bean。

常规的kie-spring post processorbean定义

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>

使用注释时,kie-spring post processorbean定义

<bean id="kiePostProcessor"
          class="org.kie.spring.annotations.KModuleAnnotationPostProcessor"/>

10.2.4. KieSessions

kie:ksession元素定义了KieSessions。同一个标签用于定义有状态(org.kie.api.runtime.KieSession)和无状态(org.kie.api.runtime.StatelessKieSession)会话。

10.2.4.1. kie:ksession的参数作为属性
属性描述
nameksession 的名称
type会话是有状态的还是无状态的?如果该属性为空或缺失,则假定该会话的类型为Stateful。
default这是默认会话吗?
scopeprototype / singleton。如果没有提供假设为singleton(默认)
clockTypeREALTIME / PSEUDO
listeners-ref指定对事件监听器组的引用(请参阅下面的“定义一组监听器”部分)。
<kie:kmodule id="sample-kmodule">
  <kie:kbase name="drl_kiesample3" packages="drl_kiesample3">
    <kie:ksession name="ksession1" type="stateless"/>
    <kie:ksession name="ksession2"/>
  </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
10.2.4.2. Spring Bean范围(用于KieBase和KieSession)

在定义KieBase或KieSession时,您可以选择声明bean的作用域。例如,要在每次需要时强制Spring生成一个新的bean实例,您应该将bean的scope属性声明为“prototype”。类似地,如果您希望Spring在每次需要一个bean实例时都返回相同的bean实例,您应该将bean的scope属性声明为“singleton”。

10.2.5. Kie:ReleaseId

10.2.5.1. kie:releaseId’s parameters as attributes:的参数作为属性
属性描述
idBean的id是要从其他Bean引用的名称。应用标准的Spring ID语义。
groupIdgroupId from Maven GAV
artifactIdartifactId from Maven GAV
versionversion from Maven GAV
<kie:releaseId id="beanId" groupId="org.kie.spring"
            artifactId="named-artifactId" version="1.0.0-SNAPSHOT"/>

10.2.6. Kie:Import

从6.2版开始,kie-spring允许从类路径上的kjar导入kie对象。目前支持两种导入kie对象的模式。

10.2.6.1. 全局导入

import标记将强制自动扫描类路径上的所有jar,初始化Kie对象(Kbase/KSessions),并将这些对象导入到spring上下文中。
全局导入

<kie:import />

####10.2.6.2. 具体导入ReleaseId
使用import标记上的releaseId-ref属性将初始化特定的Kie对象(Kbase/KSessions),并将这些对象导入到spring上下文中。

使用releaseId导入Kie对象

<kie:import releaseId-ref="namedKieSession"/>
<kie:releaseId id="namedKieSession" groupId="org.drools"
            artifactId="named-kiesession" version="7.49.0.Final"/>

Kie扫描功能可以为KieBase的导入与特定的releaseId启用。此特性目前不能用于全局导入。

使用releaseId启用扫描器导入Kie对象

<kie:import releaseId-ref="namedKieSession"
            enableScanner="true" scannerInterval="1000"/>

<kie:releaseId id="namedKieSession" groupId="org.drools"
            artifactId="named-kiesession" version="7.49.0.Final"/>

如果定义并启用了扫描器,就会创建一个隐式的KieScanner对象,并将其插入到spring上下文中。可以从spring上下文中检索它。

从Spring上下文检索KieScanner

// the implicit name would be releaseId#scanner
KieScanner releaseIdScanner = context.getBean("namedKieSession#scanner", KieScanner.class);
releaseIdScanner.scanNow();

为了让releaseId导入特性工作,kie-ci必须在类路径上可用。

10.2.7. 注释

@KContainer, @KBase和@KSession都支持可选的“name”属性。Spring在注入时通常会“get”,所有注入都接收到同一组注释的相同实例。'name’注释强制每个名称都有一个唯一的实例,尽管该名称的所有实例都将是identity equals。

10.2.7.1. @KReleaseId

用于将实例绑定到KieModule的特定版本。如果kie-ci在类路径上,它将自动解析依赖项,并从远程存储库下载。

10.2.7.2. @KContainer

注入类路径KieContainer

@KContainer
private KieContainer kContainer;

为动态KieModule注入KieContainer

@KContainer
@KReleaseId(groupId = "jar1", artifactId = "art1", version = "1.1")
private KieContainer kContainer;

为动态KieModule注入命名的KieContainer

@KContainer(name = "kc1")
@KReleaseId(groupId = "jar1", artifactId = "art1", version = "1.1")
private KieContainer kContainer;
10.2.7.3. @KBase

默认参数(如果给定)映射到value属性,并指定spring xml文件中的KieBase的名称。
从类路径KieContainer中注入默认的KieBase

@KBase
private KieBase kbase;

从动态KieModule注入默认的KieBase

@KBase
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieBase kbase;

为 ‘jar1.KBase1’ KieBase,并排版本加载

@KBase("kbase1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieBase kbase1v10;

@KBase("kbase1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.1")
private KieBase kbase1v11;

为 ‘jar1.ksession1’ KieSession,并排版本加载

@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksession11kb2;

@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.1")
private KieSession ksession11kb2;
10.2.7.4. 为KieSession @KSession

默认参数(如果给定)映射到value属性,并从kmodule.xml或spring xml文件指定KieSession的名称

从类路径KieContainer注入默认的KieSession

@KSession
private KieSession ksession;

从动态KieModule注入默认的KieSession

@KSession
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksession;

为 ‘jar1.ksession1’ KieSession,并排版本加载

@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksessionv10;

@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.1")
private KieSession ksessionv11;

为 ‘jar1.ksession1’ KieSession,使用“name”属性强制创建新实例

@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksession1ks1

@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private KieSession ksession1ks2

为 ‘jar1.ksession1’ KieSession,并排版本加载

@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private StatelessKieSession ksessionv10;

@KSession("ksession1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.1")
private StatelessKieSession ksessionv11;
@KSession(value="ksession1", name="ks1")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private StatelessKieSession ksession1ks1

@KSession(value="ksession1", name="ks2")
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private StatelessKieSession ksession1ks2
10.2.7.5. 为StatelessKieSession @KSession

默认参数(如果给定)映射到value属性,并从kmodule.xml或spring xml文件指定KieSession的名称。

从类路径KieContainer中注入默认的StatelessKieSession

@KSession
private StatelessKieSession ksession;

从动态KieModule注入默认的StatelessKieSession

@KSession
@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")
private StatelessKieSession ksession;
10.2.7.6. 重要提示

在使用注释时,为了正确初始化kmodule对象(kbase/ksession),必须定义一个org.kie.spring.annotations.KModuleAnnotationPostProcessor类型的bean

kie-spring注释后处理器bean定义

<bean id="kiePostProcessor"
            class="org.kie.spring.annotations.KModuleAnnotationPostProcessor"/>

kie-spring注释-组件扫描

<context:component-scan base-package="org.kie.spring.annotations"/>

使用注释时,后处理程序是不同的。

10.2.8. 事件监听器

Drools支持添加3种类型的监听器到KieSessions - AgendaListener, WorkingMemoryListener, ProcessEventListener。

kie-spring模块允许您使用XML标记将这些监听器配置为KieSessions。这些标记具有与实际监听器接口相同的名称,例如,kie:agendaEventListener…., kie:ruleRuntimeEventListener….和 kie:processEventListener….。
kie-spring提供了一些特性,可以将监听器定义为独立的(单独的)监听器,也可以将它们定义为一个组。

11.2.8.1. 定义独立的监听器
11.2.8.2. 属性
属性描述
ref对另一个声明的bean的引用。

监听器配置示例—使用bean:ref。

<bean id="mock-agenda-listener" class="mocks.MockAgendaEventListener"/>
<bean id="mock-rr-listener" class="mocks.MockRuleRuntimeEventListener"/>
<bean id="mock-process-listener" class="mocks.MockProcessEventListener"/>

<kie:kmodule id="listeners_kmodule">
  <kie:kbase name="drl_kiesample" packages="drl_kiesample">
    <kie:ksession name="ksession2">
      <kie:agendaEventListener ref="mock-agenda-listener"/>
      <kie:processEventListener ref="mock-process-listener"/>
      <kie:ruleRuntimeEventListener ref="mock-rr-listener"/>
    </kie:ksession>
  </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
11.2.8.3. 嵌套的元素:

bean
class = String
name = String (optional)

监听器配置示例—使用嵌套bean。

<kie:kmodule id="listeners_module">
  <kie:kbase name="drl_kiesample" packages="drl_kiesample">
   <kie:ksession name="ksession1">
	  <kie:agendaEventListener>
      <bean class="mocks.MockAgendaEventListener"/>
      </kie:agendaEventListener>
    </kie:ksession>
  </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
10.2.8.4。空标记:没有’ref’和没有嵌套bean的声明

当一个监听器定义时没有引用实现bean,也不包含嵌套bean时,底层实现添加了API中定义的侦听器的调试版本。
调试监听器将相应的Event toString消息打印到_System.err. _

监听器配置示例-默认为Knowledge-API提供的调试版本。

<bean id="mock-agenda-listener" class="mocks.MockAgendaEventListener"/>
<bean id="mock-rr-listener" class="mocks.MockRuleRuntimeEventListener"/>
<bean id="mock-process-listener" class="mocks.MockProcessEventListener"/>

<kie:kmodule id="listeners_module">
 <kie:kbase name="drl_kiesample" packages="drl_kiesample">
    <kie:ksession name="ksession2">
      <kie:agendaEventListener />
      <kie:processEventListener />
      <kie:ruleRuntimeEventListener />
    </kie:ksession>
 </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
10.2.8.5. 混合和匹配不同的声明风格

drools-spring模块允许您在同一个KieSession中混合和匹配不同的声明样式。下面的示例提供了更多的清晰度。

监听器配置示例-混合和匹配’ ref’/nested-bean/empty样式。

<bean id="mock-agenda-listener" class="mocks.MockAgendaEventListener"/>
<bean id="mock-rr-listener" class="mocks.MockRuleRuntimeEventListener"/>
<bean id="mock-process-listener" class="mocks.MockProcessEventListener"/>

<kie:kmodule id="listeners_module">
  <kie:kbase name="drl_kiesample" packages="drl_kiesample">
    <kie:ksession name="ksession1">
      <kie:agendaEventListener>
          <bean class="org.kie.spring.mocks.MockAgendaEventListener"/>
      </kie:agendaEventListener>
    </kie:ksession>
    <kie:ksession name="ksession2">
      <kie:agendaEventListener ref="mock-agenda-listener"/>
      <kie:processEventListener ref="mock-process-listener"/>
      <kie:ruleRuntimeEventListener ref="mock-rr-listener"/>
    </kie:ksession>
  </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
10.2.8.6. 定义同一类型的多个侦听器

为一个kiessession定义多个具有相同事件侦听器类型的bean也是有效的。

监听器配置示例—多个相同类型的监听器。

<bean id="mock-agenda-listener" class="mocks.MockAgendaEventListener"/>

<kie:kmodule id="listeners_module">
  <kie:kbase name="drl_kiesample" packages="drl_kiesample">
    <kie:ksession name="ksession1">
      <kie:agendaEventListener ref="mock-agenda-listener"/>
      <kie:agendaEventListener>
          <bean class="org.kie.spring.mocks.MockAgendaEventListener"/>
      </kie:agendaEventListener>
    </kie:ksession>
  </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
10.2.8.7. 定义一组监听器:

drools-spring允许对听者进行分组。当您定义一组侦听器并希望将它们附加到多个会话时,这特别有用。当我们为“测试”定义一组监听器,然后希望将它们切换到“生产”使用时,分组特性也非常有用。

10.2.8.8. 属性
属性描述
ID唯一标识符
10.2.8.9. 嵌套元素

kie:agendaEventListener…
kie:ruleRuntimeEventListener…
kie:processEventListener…

上面提到的子元素可以以任何顺序声明。在一个组中,每种类型只允许有一个声明。

10.2.8.10. 例子:

一组监听器-示例

<bean id="mock-agenda-listener" class="mocks.MockAgendaEventListener"/>
<bean id="mock-rr-listener" class="mocks.MockRuleRuntimeEventListener"/>
<bean id="mock-process-listener" class="mocks.MockProcessEventListener"/>

<kie:kmodule id="listeners_module">
  <kie:kbase name="drl_kiesample" packages="drl_kiesample">
    <kie:ksession name="statelessWithGroupedListeners" type="stateless"
             listeners-ref="debugListeners"/>
  </kie:kbase>
</kie:kmodule>

  <kie:eventListeners id="debugListeners">
  <kie:agendaEventListener ref="mock-agenda-listener"/>
  <kie:processEventListener ref="mock-process-listener"/>
  <kie:ruleRuntimeEventListener ref="mock-rr-listener"/>
</kie:eventListeners>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>

10.2.9. Loggers

Drools支持添加2种类型的记录器KieSessions - ConsoleLogger, FileLogger.
kie-spring模块允许您使用XML标记将这些记录器配置为KieSessions。这些标记与实际的记录器接口具有相同的名称,例如,kie:consoleLogger….和kie:fileLogger….。

10.2.9.1. 定义控制台记录器:

控制台日志记录器可以通过使用kie:consoleLogger/标签。这个标签没有属性,必须直接出现在kie:ksession….元素下面。

定义控制台记录器-示例

<kie:kmodule id="loggers_module">
  <kie:kbase name="drl_kiesample" packages="drl_kiesample">
    <kie:ksession name="ConsoleLogger-statefulSession" type="stateful">
      <kie:consoleLogger/>
    </kie:ksession>
  </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
10.2.9.2. 定义文件记录器:

文件记录器可以通过使用kie:fileLogger/标签。这个标签有以下属性,必须直接出现在一个kie:ksession….元素下面。

样本

属性描述
ID唯一标识符
file磁盘上实际文件的路径
threaded默认值为false。有效值为“true”或“false”。
interval整数。指定将内容从内存刷新到磁盘的时间间隔。

定义一个文件记录器-示例

<kie:kmodule id="loggers_module">
  <kie:kbase name="drl_kiesample" packages="drl_kiesample">
    <kie:ksession name="ConsoleLogger-statefulSession" type="stateful">
      <kie:fileLogger id="fl_logger" file="#{ systemProperties['java.io.tmpdir'] }/log1"/>
      <kie:fileLogger id="tfl_logger" file="#{ systemProperties['java.io.tmpdir'] }/log2"
                          threaded="true" interval="5"/>
    </kie:ksession>
  </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
10.2.9.3. 关闭一个FileLogger

为了防止泄漏,建议关闭_<kie:fileLogger …>_以编程方式。

LoggerAdaptor adaptor = (LoggerAdaptor) context.getBean("fl_logger");
adaptor.close();
10.2.10. 定义批处理命令

kie:batch元素可用于为给定的ksession定义一组批处理命令。这个标签没有属性,必须直接出现在一个kie:ksession….元素下面。支持的命令有

批量命令-使用实例

<kie:kmodule id="batch_commands_module">
  <kie:kbase name="drl_kiesample" packages="drl_kiesample">
    <kie:ksession name="ksessionForCommands" type="stateful">
      <kie:batch>
        <kie:insert-object ref="person2"/>
        <kie:set-global identifier="persons" ref="personsList"/>
        <kie:fire-all-rules max="10"/>
      </kie:batch>
    </kie:ksession>
  </kie:kbase>
</kie:kmodule>

<bean id="kiePostProcessor"
          class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>
10.2.11. 持久性

持久性配置选项
jpa-persistence
transaction-manager
ref = String
entity-manager-factory
ref = String

ksession JPA配置示例

10.2.10. 定义批处理命令

10.2.11. 持久性

10.2.12. 利用Spring的其他特性


10.3. 与jBPM人工任务集成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值