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代码再做文件实在没意思)搞了几个小时,总算可以访问了。到此记录下