apache / incubator-kie-kogito-runtimes

Kogito Runtimes - Kogito is a cloud-native business automation technology for building cloud-ready business applications.
http://kogito.kie.org
Apache License 2.0
514 stars 199 forks source link

Loading rules into Knowledge Builder from String is failing #700

Closed surajrrao closed 3 years ago

surajrrao commented 3 years ago

Below is the code used add rules from string into knowledge base

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add( ResourceFactory.newByteArrayResource(alertServiceDrlStr.getBytes()),
                  ResourceType.DRL );
    kbuilder.add( ResourceFactory.newByteArrayResource(factTypesDrlStr.getBytes()),
            ResourceType.DRL );

    if ( kbuilder.hasErrors() ) {
        System.out.println( kbuilder.getErrors().toString() );
        throw new RuntimeException( "Unable to compile rules\"." );
    }

Seeing below exception on startup

Exception in thread "main" java.lang.UnsupportedOperationException at org.drools.statics.StaticComponentsSupplier$DummyByteArrayClassLoader.defineClass(StaticComponentsSupplier.java:49) at org.drools.core.base.ClassFieldAccessorFactory.getClassFieldReader(ClassFieldAccessorFactory.java:118) at org.drools.core.base.ClassFieldAccessorCache$CacheEntry.getReadAccessor(ClassFieldAccessorCache.java:180) at org.drools.core.base.ClassFieldAccessorCache.getReadAcessor(ClassFieldAccessorCache.java:97) at org.drools.core.base.ClassFieldAccessorStore.wire(ClassFieldAccessorStore.java:287) at org.drools.core.base.ClassFieldAccessorStore.getReader(ClassFieldAccessorStore.java:109) at org.drools.core.base.ClassFieldAccessorStore.getReader(ClassFieldAccessorStore.java:87) at org.drools.compiler.rule.builder.PatternBuilder.registerReadAccessor(PatternBuilder.java:1782) at org.drools.compiler.rule.builder.QueryBuilder.build(QueryBuilder.java:47) at org.drools.compiler.rule.builder.RuleBuilder.preProcess(RuleBuilder.java:86) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.buildRuleBuilderContext(KnowledgeBuilderImpl.java:1236) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.buildRuleBuilderContexts(KnowledgeBuilderImpl.java:1218) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileAllQueries(KnowledgeBuilderImpl.java:1059) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileRules(KnowledgeBuilderImpl.java:1051) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileKnowledgePackages(KnowledgeBuilderImpl.java:879) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addPackage(KnowledgeBuilderImpl.java:870) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addPackageFromDrl(KnowledgeBuilderImpl.java:522) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addKnowledgeResource(KnowledgeBuilderImpl.java:696) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:2182) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:2171) at com.sample.brm.BootstrapRuleEngine.init(BootstrapRuleEngine.java:120) at com.sample.brm.DroolsApplication.main(DroolsApplication.java:13)

mariofusco commented 3 years ago

You're using Kogito with the old Drools 7 API and it isn't supposed to work this way. You should process and compile the drl files generating the executable model through our maven plugin instead. If you want to keep using those old APIs you could try to exclude drools-core-static and add drools-core-dynamic among your dependencies (which is how Drools v7 works) but this is strongly discouraged and if you do this there is actually no point in using Kogito.

surajrrao commented 3 years ago

@mariofusco thanks for replying. Here is my requirement, let me know if this makes sense to go with Kogito

  1. Manage all DRL in MongoDB
  2. Load all needed DRL during startup
  3. And refresh the rules as & when it gets updated on the DB
mariofusco commented 3 years ago

I believe this use case doesn't make much sense in Kogito which is mainly made to work with precompiled DRL (and Java classes, namely the executable model, generated out of them). I think that Drools will be a better fit for your use case.