【问题标题】:Can we run drools 5 and drool 6 in parallel in same application ( drools- spring ) integration application我们可以在同一个应用程序(drools-spring)集成应用程序中并行运行 drools 5 和 drool 6
【发布时间】:2015-04-23 05:37:57
【问题描述】:

我有基于 drools 5 规则引擎的现有应用程序,需要迁移到 drools 6,但我们不能一次性完成,即我们必须分多个阶段完成。 所以我的要求是我想在同一个应用程序中支持 drool 5 和 drool 6 并行执行。

For that i  have created sample poc 
1) Created drools spring integration application having both drools 5 and drool 6 spring integration configuration files .

For Drools 5 : 
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:oxm="http://www.springframework.org/schema/oxm"
    xmlns:drools="http://drools.org/schema/drools-spring"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.1.xsd
      http://www.springframework.org/schema/util
      http://www.springframework.org/schema/util/spring-util-3.1.xsd
      http://www.springframework.org/schema/oxm
      http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd
      http://drools.org/schema/drools-spring org/drools/container/spring/drools-spring-1.2.0.xsd
      http://camel.apache.org/schema/spring
      http://camel.apache.org/schema/spring/camel-spring.xsd">

    <drools:grid-node id="node" />
      <drools:kbase id="drools5Kbase" node="node">
        <drools:resources >
            <!-- <drools:resource type="DRF" source="classpath:rules/distribution/regulatory/Test.rf" /> -->
            <drools:resource type="DRL" source="classpath:rules/Sample.drl" />
        </drools:resources>     
     </drools:kbase>    

</beans>


****Drools 6 :**** 

<kie:kmodule id="Drools6POC">

        <kie:kbase name="rules-two" packages="rules.two" />

        <kie:kbase name="drools6KieBase" packages="rules, process" includes="rules-two">
            <!--<kie:ksession name="ksessionRules">
                <kie:fileLogger file="drools.log" threaded="true" interval="10" />
                <kie:listeners>
                    <kie:ruleRuntimeEventListener ref="org.kie.api.event.rule.DebugRuleRuntimeEventListener" />
                    <kie:agendaEventListener ref="org.kie.api.event.rule.DebugAgendaEventListener" />
                    <kie:processEventListener ref="org.drools.core.event.DebugProcessEventListener" />
                </kie:listeners>
            </kie:ksession> 
            -->     
        </kie:kbase>

    </kie:kmodule>  


2) Added maven depencies for both drools 5 and drools 6 by changing drools 5 standard jar's group id and arctifact id in order to avoid version overwite 

3) With above  configuration drools 6 working fine but while loading drools 5 spring configuration file getting error 

INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@70c44470: defining beans [node,drools5Kbase,drools5RuleSet]; root of factory hierarchy
Apr 20, 2015 12:11:33 PM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@70c44470: defining beans [node,drools5Kbase,drools5RuleSet]; root of factory hierarchy
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'drools5Kbase': Invocation of init method failed; nested exception is org.drools.RuntimeDroolsException: Unable to load dialect 'org.drools.compiler.rule.builder.dialect.mvel.MVELDialectConfiguration:mvel:org.drools.compiler.rule.builder.dialect.mvel.MVELDialectConfiguration'
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.sample.service.ProcessAndRuleService.main(ProcessAndRuleService.java:55)
Caused by: org.drools.RuntimeDroolsException: Unable to load dialect 'org.drools.compiler.rule.builder.dialect.mvel.MVELDialectConfiguration:mvel:org.drools.compiler.rule.builder.dialect.mvel.MVELDialectConfiguration'
    at org.drools.compiler.PackageBuilderConfiguration.addDialect(PackageBuilderConfiguration.java:310)
    at org.drools.compiler.PackageBuilderConfiguration.buildDialectConfigurationMap(PackageBuilderConfiguration.java:295)
    at org.drools.compiler.PackageBuilderConfiguration.init(PackageBuilderConfiguration.java:184)
    at org.drools.compiler.PackageBuilderConfiguration.<init>(PackageBuilderConfiguration.java:162)
    at org.drools.builder.impl.KnowledgeBuilderFactoryServiceImpl.newKnowledgeBuilderConfiguration(KnowledgeBuilderFactoryServiceImpl.java:22)
    at org.drools.builder.KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(KnowledgeBuilderFactory.java:74)
    at org.drools.container.spring.beans.KnowledgeBaseBeanFactory.afterPropertiesSet(KnowledgeBaseBeanFactory.java:80)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    ... 12 more
Caused by: java.lang.ClassCastException: org.drools.compiler.rule.builder.dialect.mvel.MVELDialectConfiguration cannot be cast to org.drools.compiler.DialectConfiguration
    at org.drools.compiler.PackageBuilderConfiguration.addDialect(PackageBuilderConfiguration.java:305)
    ... 20 more


4) Pom.xml 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>TestDroolsVersion</groupId>
  <artifactId>TestDroolsVersion</artifactId>
  <version>1.0.0</version>
  <name>TestDroolsVersion</name>
  <description>TestDroolsVersion</description>

      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <drools6.version>6.1.0.Final</drools6.version>
         <spring.framework.version>3.1.0.RELEASE</spring.framework.version>
         <mvel2.version>2.1.0.drools4</mvel2.version>

      </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.kie</groupId>
                <artifactId>kie-maven-plugin</artifactId>
                <version>${drools6.version}</version>
                <extensions>true</extensions>


            </plugin>
        </plugins>
    </build> 

    <dependencies>
    <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>6.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>6.1.0.Final</version>
        </dependency>



        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-ci</artifactId>
            <version>6.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>6.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jbpm</groupId>
            <artifactId>jbpm-bpmn2</artifactId>
            <version>6.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.0.2</version>
        </dependency>


        <!-- START : Drools 5  -->

            <dependency>
            <groupId>org.drools.custom</groupId>
            <artifactId>drools-core-custom</artifactId>
            <version>5.3.1.Final</version> 
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.drools.custom</groupId>
            <artifactId>drools-compiler-custom</artifactId>
            <version>5.3.1.Final</version> 
            <exclusions>
                <exclusion>
                    <groupId>org.mvel</groupId>
                    <artifactId>mvel2</artifactId>
                </exclusion>
            </exclusions>
            <scope>provided</scope>
        </dependency> 


        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-spring</artifactId>
                <version>5.3.1.Final</version> 
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>



    </dependencies>


</project>


Your help will be appriciated .

1) Can we support drools 5 and drool 6 in parallel in same classpath 

2) If yes is there any way or any one have any sample 

Thanks and regards 
Sri

【问题讨论】:

    标签: spring drools-guvnor


    【解决方案1】:

    可以在同一个容器上运行多个版本的 drools,但在这种情况下,两个版本都安装在同一个程序集中。

    使用 maven 可以有一个父 pom 项目和一个多模块子项目结构。在这种情况下,Drools 编译器上不会有任何类路径冲突,这将起作用。否则同一项目中的冲突版本将需要 maven 排除,我确信这将正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      相关资源
      最近更新 更多