package droolsRule;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import kafka.producer2.KafkaProducerTest;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.agent.KnowledgeAgent;
import org.drools.agent.KnowledgeAgentConfiguration;
import org.drools.agent.KnowledgeAgentFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.Resource;
import org.drools.io.ResourceChangeScannerConfiguration;
import org.drools.io.ResourceFactory;
import org.drools.io.impl.UrlResource;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import bean.DroolsResult;
import bean.Reg;
public class RuleFilter {
public StatefulKnowledgeSession ksession = null;
public KnowledgeRuntimeLogger logger = null;
public KnowledgeAgent kagent = null;
public RuleFilter()
{
}
public void getKsessionObj() throws Exception
{
}
public void dispose()
{
ksession.dispose();
logger.close();
ksession = null;
logger = null;
}
public StatefulKnowledgeSession readKnowledgeBase(String path) throws Exception {
if(kagent == null)
{
ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
sconf.setProperty("drools.resource.scanner.interval", "10");
ResourceFactory.getResourceChangeScannerService().configure(sconf);
ResourceFactory.getResourceChangeScannerService().start();
ResourceFactory.getResourceChangeNotifierService().start();
// KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
// aconf.setProperty("drools.agent.scanDirectories", "true");
// aconf.setProperty("drools.agent.newInstance", "true");
// UrlResource urlResource2 = (UrlResource)ResourceFactory.newUrlResource("http://localhost:8080/guvnor-5.6.0.Final-tomcat-6.0/org.drools.guvnor.Guvnor/package/heatbeat/LATEST/ChangeSet.xml");
// urlResource2.setBasicAuthentication("enabled");
// urlResource2.setUsername("admin");
// urlResource2.setPassword("admin");
// urlResource2.setResourceType(ResourceType.PKG);
}
//String path = "http://192.168.61.104:8080/guvnor-5.6.0.Final-tomcat-6.0/org.drools.guvnor.Guvnor/package/stormETL/LATEST";
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
UrlResource urlResource = ((UrlResource) ResourceFactory.newUrlResource(path));
urlResource.setBasicAuthentication("enabled");
urlResource.setUsername("admin");
urlResource.setPassword("admin");
kbuilder.add(urlResource, ResourceType.PKG);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeAgentConfiguration conf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
Authenticator.setDefault(new Authenticator() {
// Check https://issues.jboss.org/browse/JBRULES-3465 for any future changes.
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"admin",
"admin".toCharArray());
}
});
kagent = KnowledgeAgentFactory.newKnowledgeAgent("kagent2",conf);
kagent.applyChangeSet(ResourceFactory.newUrlResource("http://localhost:8080/guvnor-5.6.0.Final-tomcat-6.0/org.drools.guvnor.Guvnor/package/heatbeat/LATEST/ChangeSet.xml"));
kagent.addEventListener(new MYEventListener());
// KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
KnowledgeBase kbase = kagent.getKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
ksession = kbase.newStatefulKnowledgeSession();
logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
return ksession;
}
public void runRroolsRule(KafkaProducerTest kafkaProducter,Object fact,String value,StatefulKnowledgeSession ksession) throws Exception
{
long startTime = System.currentTimeMillis();
DroolsResult dMessage = new DroolsResult();
// ksession.setGlobal("kafkaProducerObj", kafkaProducter);
ksession.setGlobal("dMessage", dMessage);
ksession.setGlobal("value", value);
ksession.insert(fact);
ksession.fireAllRules();
dMessage = (DroolsResult)ksession.getGlobal("dMessage");
System.out.print("~~~~~~~~" + dMessage.getFilterResult());
System.out.println("||||||||||||" + ksession.getFactCount());
dMessage = null;
if(ksession.getFactCount() > 10000)
{
dispose();
ksession = null;
logger = null;
//initDrools();
}
long endTime = System.currentTimeMillis();
System.out.println("filter use time:" + (endTime - startTime));
}
//http://192.168.61.104:8080/guvnor-5.6.0.Final-tomcat-6.0/org.drools.guvnor.Guvnor/package/heatbeat/LATEST/SCENARIOS
public static void main(String[] args) throws Exception{
KafkaProducerTest kafkaProducerObj = new KafkaProducerTest();
RuleFilter rf = new RuleFilter();
StatefulKnowledgeSession ksession = rf.readKnowledgeBase("http://192.168.61.104:8080/guvnor-5.6.0.Final-tomcat-6.0/org.drools.guvnor.Guvnor/package/stormETL/LATEST");
kafkaProducerObj.init();
long startTime = System.currentTimeMillis();
for(int i = 0;i<10;i++)
{
Reg reg = new Reg();
String str = "123";
reg.setImei1("1111111111111111");
reg.setMeid("111");
//System.out.println(i);
rf.runRroolsRule(kafkaProducerObj, reg, str,ksession);
// reg = null;
System.out.println("!!!!!!!!!!!!!!!!!!" + i);
}
long endTime = System.currentTimeMillis();
System.out.println("all use time is:" + (endTime - startTime));
}
}
今天做DROOLS 通过网络访问changset(大多是通过文件方式访问,但是感觉既然用上了guvnor代码再做文件实在没意思)搞了几个小时,总算可以访问了。到此记录下