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;
}