Drools7:如何在kmodule.xml中将drl文件分配给KieBase?

时间:2019-07-31 09:19:18

标签: spring drools

我正试图从 drools 5迁移到drools 7 。在版本6中,spring集成发生了变化。基于documentation drools:resources drools:resource已删除,但是我找不到使用新工具集实现相同行为的方法。我想要的是在drl文件中定义具有不同规则的不同kiebases。

documentation表示可以使用包来定义资源。不幸的是,对于我来说,一个软件包可能包含几个drl文件,我想过滤其中的一些文件。

我在流口水5.x中拥有什么:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:drools-spring="http://drools.org/schema/drools-spring"
       xsi:schemaLocation="http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <drools-spring:kbase id="rules1And3">
        <drools-spring:resources>
            <drools-spring:resource source="classpath:rules/Rules1.drl"/>
            <drools-spring:resource source="classpath:rules/Rules3.drl"/>
        </drools-spring:resources>
    </drools-spring:kbase>

    <drools-spring:kbase id="rules2And3">
        <drools-spring:resources>
            <drools-spring:resource source="classpath:rules/Rules2.drl"/>
            <drools-spring:resource source="classpath:rules/Rules3.drl"/>
        </drools-spring:resources>
    </drools-spring:kbase>


    <bean id="ruleSessionAutoRefundAndPox" factory-bean="rules1And3"
          factory-method="newStatelessKnowledgeSession"/>

    <bean id="ruleSessionNonCashRefund" factory-bean="rules2And3"
          factory-method="newStatelessKnowledgeSession"/>

</beans>

因此,根据规则,这里有3个文件。第一个kbase只有规则1和规则2,第二个只有规则2和rule3。

在7.x中它应该如何“显示”:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:kie="http://drools.org/schema/kie-spring"
       xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://drools.org/schema/kie-spring http://drools.org/schema/kie-spring.xsd">


    <kie:kmodule id="rules">
        <kie:kbase name="rules1And3">   
            <!--loaded drl files-->
        </kie:kbase>
        <kie:kbase name="rules2And3">
            <!--loaded drl files-->
        </kie:kbase>
    </kie:kmodule>

    <!-- maybe these are unnecessary and instead ksessions should been defined within kbase elements-->
    <bean id="sessionRules1And3" factory-bean="rules1And3"
          factory-method="newStatelessKnowledgeSession"/>

    <bean id="sessionRules2And3" factory-bean="rules2And3"
          factory-method="newStatelessKnowledgeSession"/>
</beans>

基于我所看到的,我什至不确定在新版本中是否可以实现完全相同的行为,或者整个方法是错误的,但是我想要的是能够定义为kiebase。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我找不到任何可以明确引用文件的东西。 我所做的是将放置在main / resources中的文件夹下 即:

src / main / resources / rules1 / Rules1.drl

src / main / resources / rules3 / Rules3.drl

,然后kbase定义如下:

<kie:kmodule id="rules">
     <kie:kbase name="rules1And3" packages="rules1,rules3"/>   
     ...
</kie:kmodule>

注意1 :drl文件中的软件包应该正确。即如果它在com / some / package下,则在drl文件中您应该拥有com.some.package包 正常情况下应该如此,但这未在版本5中得到验证

注意2 :如果您有单独的kmodule进行测试,则应该在测试/资源中也包含drl文件,以便能够加载它们。

这就是我要解决的方式,如果有更好的答案,我会接受,但这是可行的。