Kie(口水)和#x2B;弹簧&x2B;骆驼+;Excel决策表

Kie(口水)和#x2B;弹簧&x2B;骆驼+;Excel决策表,excel,spring,drools,Excel,Spring,Drools,我目前正在将excel决策表读入以下库中: Drools 5.6.0.final 骆驼2.14.0 弹簧靴1.0.2 jdk7 我们正在将spring boot升级到1.1.5,升级后drools决策表编译开始崩溃,即使分配了2GB的permGen空间 新的spring启动版本似乎导致了某种类加载器循环,它会吃掉它能找到的所有PerGem 若我们使用JDK8,问题就会“消失”,但启动过程在drools决策表编译期间会消耗1,6GB的内存 我尝试将drools升级到6.1.0(KIE),但是我

我目前正在将excel决策表读入以下库中:

  • Drools 5.6.0.final
  • 骆驼2.14.0
  • 弹簧靴1.0.2
  • jdk7
我们正在将spring boot升级到1.1.5,升级后drools决策表编译开始崩溃,即使分配了2GB的permGen空间

新的spring启动版本似乎导致了某种类加载器循环,它会吃掉它能找到的所有PerGem

若我们使用JDK8,问题就会“消失”,但启动过程在drools决策表编译期间会消耗1,6GB的内存

我尝试将drools升级到6.1.0(KIE),但是我不能再使用基于excel的决策表了,因为似乎再也没有办法配置Spring/Camel/drools bean了。或者至少没有提供任何关于如何实现这一点的线索

有没有人知道如何让drools 5.6.0在JDK 7下更高效地工作,或者如何允许JDK 8下的excel决策表使用drools/Kie 6+

JDK 7 permGen上的异常stacktrace错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'excelDTABLE_KBase': Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: PermGen space
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:687)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
    at my.domain.Application.main(Application.java:54)

Caused by: java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at org.drools.rule.JavaDialectRuntimeData$PackageClassLoader.fastFindClass(JavaDialectRuntimeData.java:624)
    at org.drools.util.CompositeClassLoader$CachingLoader.load(CompositeClassLoader.java:254)
    at org.drools.util.CompositeClassLoader$CachingLoader.load(CompositeClassLoader.java:237)
    at org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:88)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at org.drools.rule.JavaDialectRuntimeData.wire(JavaDialectRuntimeData.java:434)
    at org.drools.rule.JavaDialectRuntimeData.wire(JavaDialectRuntimeData.java:429)
    at org.drools.rule.JavaDialectRuntimeData.onBeforeExecute(JavaDialectRuntimeData.java:257)
    at org.drools.rule.DialectRuntimeRegistry.onBeforeExecute(DialectRuntimeRegistry.java:139)
    at org.drools.compiler.PackageBuilder.reloadAll(PackageBuilder.java:1202)
    at org.drools.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:951)
    at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:938)
    at org.drools.compiler.PackageBuilder.addPackageFromDecisionTable(PackageBuilder.java:451)
    at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:715)
    at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:51)
    at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:40)
    at org.drools.container.spring.beans.KnowledgeBaseBeanFactory.afterPropertiesSet(KnowledgeBaseBeanFactory.java:110)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:687)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)

提供的解决方案是使用kie和spring boot的drool决策表

仅供参考,请注意,跨条件共享的对象必须跨这些条件合并单元格

@Configuration
public class DroolConfig {

    private KieServices kieServices = KieServices.Factory.get();

    private KieFileSystem getKieFileSystem() throws IOException {
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        String xls[] = new String[] {"wallet.xls","offer.xls"}; // path to file
        for(int i=0 ; i< xls.length; i++) {
            kieFileSystem.write(ResourceFactory.newClassPathResource(xls[i]));
        }
        return kieFileSystem;

    }

    @Bean
    public KieContainer getKieContainer() throws IOException {
        System.out.println("Container created...");
        getKieRepository();
        KieBuilder kb = kieServices.newKieBuilder(getKieFileSystem());
        kb.buildAll();
        KieModule kieModule = kb.getKieModule();
        KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId());
        return kContainer;

    }

    private void getKieRepository() {
        final KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(new KieModule() {
            public ReleaseId getReleaseId() {
                return kieRepository.getDefaultReleaseId();
            }
        });
    }

    @Bean
    public KieSession getKieSession() throws IOException {
        System.out.println("session created...");
        return getKieContainer().newKieSession();

    }

}

6.4.0.1最终版本
org.kie
基亚皮
${drools.version}
org.drools
流涎核
${drools.version}
org.drools
drools编译器
${drools.version}
org.drools
drools决策表
${drools.version}
org.kie
基茨
${drools.version}

您的决策表可能过度紧张。(这以前发生过。)您能提供一些关于决策表产生的行数(=规则)的统计信息吗?更好的是,提供不同表的数量以及每个表的行数和列数。有问题的excel包含一个规则,其中包含460个、13个条件列和一个操作列。它是双语的,所以我尝试删除一种语言的条件,但PermGen空间错误仍然存在,因此即使在230行中,规则似乎也太复杂了。在启动期间,我总共有38个决策表文件被编译成spring/camel Bean,并且总是相同的(按字节大小排列,第二大)文件是PermGen空间错误的原因。每行生成一条规则,从而生成一个静态Java类。文件的数量无关紧要,列的数量也无关紧要,如果它像你写的那么小。-您可能需要寻找其他生成规则的方法。问题与spring boot和+Drools在将决策表编译成类时如何为drool的对象加载类有关。由于Spring boot 1.0.2一切正常。但是使用SpringBoot 1.1.5 PermGen会发生错误。
@RestController
public class MegaOfferController {
    @Autowired
    private KieSession session;

    @PostMapping("/order")
    public Order orderNow(@RequestBody Order order) {
        session.insert(order);
        session.fireAllRules();
        return order;
    }
<properties>
        <drools.version>6.4.0.Final</drools.version>
</properties>
    <dependencies>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>${drools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>${drools.version}</version>
        </dependency>


        <dependency>
    <groupId>org.drools</groupId>
     <artifactId>drools-decisiontables</artifactId>
     <version>${drools.version}</version>
   </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-ci</artifactId>
            <version>${drools.version}</version>
         </dependency>

    </dependencies>