Drools Spring集成已经经历了与Drools 6.0一致的彻底改变。以下是一些主要的变化
在本节中,我们将解释kie名称空间。
kie:kmodule定义了KieBase和相关的KieSession的集合。kmodule标签有一个强制参数’id’。
kmodule标记只能包含以下标记作为子标记。
kie: kbase
参考Drools专家文档中的kmodule.xml文档,了解对kmodule需求的详细解释。
属性 | 描述 |
---|---|
name | KieBase的名字 |
packages | 这个kbase中包含的以逗号分隔的资源包列表 |
includes | 要包含的kbase名称。来自相应kbase的所有资源都包含在这个kbase中。 |
default | Boolean (TRUE / FALSE)。默认的kbase,如果没有提供,则假定为FALSE |
scope | prototype / singleton。如果没有提供假设为singleton(默认) |
eventProcessingMode | 事件处理模式。有效的选项是STREAM, CLOUD |
equalsBehavior | 有效的选项是IDENTITY, EQUALITY |
declarativeAgenda | 有效的选项是enabled, disabled, true, false |
kie: ksession
一个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"/>
为了正确初始化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"/>
kie:ksession元素定义了KieSessions。同一个标签用于定义有状态(org.kie.api.runtime.KieSession)和无状态(org.kie.api.runtime.StatelessKieSession)会话。
属性 | 描述 |
---|---|
name | ksession 的名称 |
type | 会话是有状态的还是无状态的?如果该属性为空或缺失,则假定该会话的类型为Stateful。 |
default | 这是默认会话吗? |
scope | prototype / singleton。如果没有提供假设为singleton(默认) |
clockType | REALTIME / 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"/>
在定义KieBase或KieSession时,您可以选择声明bean的作用域。例如,要在每次需要时强制Spring生成一个新的bean实例,您应该将bean的scope属性声明为“prototype”。类似地,如果您希望Spring在每次需要一个bean实例时都返回相同的bean实例,您应该将bean的scope属性声明为“singleton”。
属性 | 描述 |
---|---|
id | Bean的id是要从其他Bean引用的名称。应用标准的Spring ID语义。 |
groupId | groupId from Maven GAV |
artifactId | artifactId from Maven GAV |
version | version from Maven GAV |
<kie:releaseId id="beanId" groupId="org.kie.spring"
artifactId="named-artifactId" version="1.0.0-SNAPSHOT"/>
从6.2版开始,kie-spring允许从类路径上的kjar导入kie对象。目前支持两种导入kie对象的模式。
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必须在类路径上可用。
@KContainer, @KBase和@KSession都支持可选的“name”属性。Spring在注入时通常会“get”,所有注入都接收到同一组注释的相同实例。'name’注释强制每个名称都有一个唯一的实例,尽管该名称的所有实例都将是identity equals。
用于将实例绑定到KieModule的特定版本。如果kie-ci在类路径上,它将自动解析依赖项,并从远程存储库下载。
注入类路径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;
默认参数(如果给定)映射到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;
默认参数(如果给定)映射到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
默认参数(如果给定)映射到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;
在使用注释时,为了正确初始化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"/>
使用注释时,后处理程序是不同的。
Drools支持添加3种类型的监听器到KieSessions - AgendaListener, WorkingMemoryListener, ProcessEventListener。
kie-spring模块允许您使用XML标记将这些监听器配置为KieSessions。这些标记具有与实际监听器接口相同的名称,例如,kie:agendaEventListener…., kie:ruleRuntimeEventListener….和 kie:processEventListener….。
kie-spring提供了一些特性,可以将监听器定义为独立的(单独的)监听器,也可以将它们定义为一个组。
属性 | 描述 |
---|---|
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"/>
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"/>
当一个监听器定义时没有引用实现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"/>
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"/>
为一个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"/>
drools-spring允许对听者进行分组。当您定义一组侦听器并希望将它们附加到多个会话时,这特别有用。当我们为“测试”定义一组监听器,然后希望将它们切换到“生产”使用时,分组特性也非常有用。
属性 | 描述 |
---|---|
ID | 唯一标识符 |
kie:agendaEventListener…
kie:ruleRuntimeEventListener…
kie:processEventListener…
上面提到的子元素可以以任何顺序声明。在一个组中,每种类型只允许有一个声明。
一组监听器-示例
<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"/>
Drools支持添加2种类型的记录器KieSessions - ConsoleLogger, FileLogger.
kie-spring模块允许您使用XML标记将这些记录器配置为KieSessions。这些标记与实际的记录器接口具有相同的名称,例如,kie:consoleLogger….和kie:fileLogger….。
控制台日志记录器可以通过使用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"/>
文件记录器可以通过使用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"/>
为了防止泄漏,建议关闭_<kie:fileLogger …>_以编程方式。
LoggerAdaptor adaptor = (LoggerAdaptor) context.getBean("fl_logger");
adaptor.close();
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"/>
持久性配置选项
jpa-persistence
transaction-manager
ref = String
entity-manager-factory
ref = String
ksession JPA配置示例