2015-04-23 18 views
2

我有基於drools 5規則引擎的現有應用程序並需要遷移到drools 6,但我們無法一次完成,即我們必須在多個階段做。 所以我的要求是我想在同一個應用程序中並行支持droosl 5和drool 6。我們可以在同一個應用程序(drools-spring)集成應用程序中並行運行drools 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.s[email protected]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.s[email protected]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 

回答

0

可以在同一個容器上運行多個版本的drools,但在這種情況下,兩個版本都安裝在同一個程序集中。

使用maven可以有一個父pom項目和一個多模塊子項目結構。在這種情況下,Drools編譯器中不會出現任何類路徑衝突,這會起作用。否則,在同一個項目中衝突的版本將需要maven排除,我敢肯定這會正常工作。

相關問題