-1

We are using DROOLS 7.5.0.Final as one one of our rule engine processing service. Lately we are observing various errors like

o.a.maven.integration.MavenRepository ; Unable to resolve artifact: com.mykaarma:K64b6ca28991386000168199a:1.0

java.lang.RuntimeException: Cannot find KieModule: com.mykaarma:K64a83022b89e45000124d602:1.0

This errors come whenever there is some load on our service , as a result our service gets restarted . we are unable to find out the root cause of issue

Following is the setup

pom.xml :

   <org.drools.version>7.5.0.Final</org.drools.version>
    <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-ci</artifactId>
            <version>${org.drools.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
                    <artifactId>protobuf-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-verifier</artifactId>
            <version>${org.drools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>${org.drools.version}</version>
        </dependency>


  public KieContainer getKieContainer(Long dealerId)
    {
        String releaseId = mongoRuleHelper.getRuleSet(dealerId, PROJECT_NAME);
        KieServices ks =  KieServices.Factory.get();
        KieContainer kieContainer = null;
        try {
                kieContainer = ks.newKieContainer(ks.newReleaseId("com.mykaarma", "K" + releaseId, "1.0"));
            } catch(Exception e) {
                logger.error("Error in creating container!!!,e);
                kieContainer = ks.newKieContainer(ruleHelper.createKJarWithMultipleResources("K" + ruleSet, PROJECT_NAME, dealerId));
            }
        return kieContainer;
    }

Firstly the error comes at line

kieContainer = ks.newKieContainer(ks.newReleaseId("com.mykaarma", "K" + releaseId, "1.0")); 

, then in the fallback it take around one minute to execute the following line

  ks.newKieContainer(ruleHelper.createKJarWithMultipleResources("K" + releaseId, PROJECT_NAME, dealerId)); --> we recreate the jar 

Use of kie container :

  KieContainer kieContainer = getKieContainer(dealerId);
   KieSession kieSession = container.newKieSession();
    kieSession.insert(dmsFilterRequest);
    DmsFilterResponse dmsFilterResponse = new DmsFilterResponse();
    kieSession.insert(dmsFilterResponse);
    int executedCount  = kieSession.fireAllRules(); 
     kieSession.dispose();
    kieSession.destroy();

The service has been given around 10GB of ram but it still gets restarted during the load . We have around 5000 rules loaded in the memory and receive ~ 150,000 requests per day .

EDIT :

How we are creating the jars :

  public ReleaseId createKJarWithMultipleResources(String id, String projectName, Long dealerId) {
        
        LOGGER.info("Creating jar for projectName={}, dealerId={}", projectName, dealerId);
        KieServices ks = KieServices.Factory.get();
        KieModuleModel kproj = ks.newKieModuleModel();
        KieFileSystem kfs = ks.newKieFileSystem();
        kfs.writePomXML(getPom("com.mykaarma", id, "1.0"));
        String ruleSetId = id.substring(1);
        List<Rule> rules = mongoRuleHelper.getRules(ruleSetId.equalsIgnoreCase("null") ? null : ruleSetId);
        LOGGER.info("Fetched rules for ruleSetId={}", ruleSetId);
        
        List<RuleData> ruleDataList = null;
        int i = 0;
        for(Rule rule : rules) {
            String drlContent;
            if(rule.getResourceType() == null || rule.getResourceType() != RuleResourceType.DRT) {
                drlContent = rule.getRule();
            } else {
                drlContent = generateDrlFromRuleTemplate(dealerId, rule, ruleDataList);
            }

            if(StringUtils.isBlank(drlContent)) {
                continue;
            }

            kfs.write("src/main/resources/com/mykaarma/" + id.replaceAll("\\.", "/")
                    + "/" + i + ".drl", drlContent);
            i++;
        }
        LOGGER.info("Generated drl for rules");
        
        KieBaseModel kBase1 = kproj.newKieBaseModel(id)
                .setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
                .setEventProcessingMode(EventProcessingOption.STREAM);

        kBase1
                .newKieSessionModel(id + ".KSession1")
                .setType(KieSessionModel.KieSessionType.STATEFUL)
                .setClockType(ClockTypeOption.get("pseudo"))
                .setDefault(true); // KieSessionModel 

        kfs.writeKModuleXML(kproj.toXML());
        LOGGER.info("Added xml file to kfs");
        
        KieBuilder kieBuilder = ks.newKieBuilder(kfs).buildAll();
        LOGGER.info("Built jar");
        
        Results results = kieBuilder.getResults();
            if( results.hasMessages( org.kie.api.builder.Message.Level.ERROR ) ){
                throw new IllegalStateException( "### errors ###" + results.getMessages() );
            }
        KieModule kieModule = kieBuilder.getKieModule();
        ReleaseId rid = kieModule.getReleaseId();
        return rid;
    }
vipulk10
  • 117
  • 3
  • 15

0 Answers0