Reputation: 3
How can I stop rule execution in Drools when find any rule. Rules are like this:
rule "Restore zxGponOltSDi IVR"
when
$log: LogDTO (
nameEvent in (
"zxGponOltSDiRestore"
)
)
then
insert (
new RestoreEventAlarmDTO(
$log.getNameEvent(),
new String[] {"zxGponOltSDi"},
$log.getIp(),
new Date(),
$log.getInterFace()
)
);
//Add something for stopping execution
end
In drl file, there are 34 rules and the execution is taking too long. I´ll need that execution finalizes when find any rule.
package com.claro.cpymes.rule;
import java.io.FileInputStream;
import java.util.Collection;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.*;
import org.drools.runtime.StatefulKnowledgeSession;
import com.claro.cpymes.dto.*;
import com.claro.cpymes.util.Constant;
public class RestoreEvent {
private static Logger LOGGER = LogManager.getLogger(RestoreEvent.class.getName());
KnowledgeBase kbase;
StatefulKnowledgeSession ksession;
public void initialize() throws Exception {
kbase = RestoreEvent.readKnowledgeBase(Constant.PATH_DRL_FILE_RESTORE);
ksession = kbase.newStatefulKnowledgeSession();
}
public RestoreEventAlarmDTO restoreEvent(LogDTO log) {
ksession.insert(log);
ksession.fireAllRules();
Collection<Object> listEventRestore = ksession.getObjects();
RestoreEventAlarmDTO restoreEventAlarm = null;
for (Object obj : listEventRestore) {
if (obj instanceof RestoreEventAlarmDTO) {
restoreEventAlarm = ((RestoreEventAlarmDTO) obj);
ksession.retract(ksession.getFactHandle(obj));
break;
}
}
return restoreEventAlarm;
}
private static KnowledgeBase readKnowledgeBase(String drlFile) throws Exception {
FileInputStream fis = new FileInputStream(drlFile);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newInputStreamResource(fis), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error : errors) {
LOGGER.info(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
}
Upvotes: 0
Views: 2591
Reputation: 31300
It's very simple:
ksession.fireAllRules( 1 );
returns after the first rule firing.
Upvotes: 0