Drools KnowledgeBase已弃用

我正在将Drools Rules引擎集成到我的应用程序中。 我发现开始的99%的例子看起来像:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newUrlResource( url ), ResourceType.DRL ); if ( kbuilder.hasErrors() ) { System.err.println( builder.getErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( builder.getKnowledgePackages() ); StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession(); ksession.insert( new Fibonacci( 10 ) ); ksession.fireAllRules(); ksession.dispose(); 

我有类似的工作,但我的问题是KnowledgeBase被标记为已弃用,这对我来说是一个红旗,我做错了。 现在, KnowledgeBaseFactory.newKnowledgeBase()未标记为已弃用,但它也返回KnowledgeBase类型。

那么,由于不推荐使用KnowledgeBase,我应该使用什么?

这是我发现使用6.x的代码:

  KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = kieServices.newKieFileSystem(); FileInputStream fis = new FileInputStream( pathToSomeDrl ); kfs.write( "src/main/resources/simple.drl", kieServices.getResources().newInputStreamResource( fis ) ); KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll(); Results results = kieBuilder.getResults(); if( results.hasMessages( Message.Level.ERROR ) ){ System.out.println( results.getMessages() ); throw new IllegalStateException( "### errors ###" ); } KieContainer kieContainer = kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() ); KieBase kieBase = kieContainer.getKieBase(); KieSession kieSession = kieContainer.newKieSession(); 

KnowledgeBase引用仍留在文档中,但它确实已被弃用。

坦克Llaune为您的答案。 对我来说它有效

1.- Spring上下文获取许多资源

                 

2.-获取知识库

 public class KnowledgeBase { private KieContainer kieContainer = null; private KieServices kieServices = null; KieFileSystem kfs = null; private static Logger logger = LoggerFactory.getLogger( KnowledgeBase.class ); public KnowledgeBase() { kieServices = KieServices.Factory.get(); kfs = this.kieServices.newKieFileSystem(); logger.info( "Create new Container base" ); } /** * Reads object KieFileSystem that contains all files loaded from alfresco * @see http://docs.jboss.org/drools/release/6.2.0.CR4/drools-docs/html/KIEChapter.html */ public void buildKbase() { KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll(); Results results = kieBuilder.getResults(); if ( results.hasMessages( Message.Level.ERROR ) ) { for ( Message message : results.getMessages() ) { System.out.println( "ERROR in Drools parsing: " + message ); logger.error( "ERROR in Drools parsing: " + message ); } throw new IllegalArgumentException( "Could not parse knowledge base for decison table resource" ); } else { logger.info( "Added decision table:" + results.getMessages() + " with no errors" ); } kieContainer = kieServices.newKieContainer( kieBuilder.getKieModule().getReleaseId() ); } /** * Init all Decision tables that are declared in the spring context */ private void initDecisionTables( List decisionTables ) { for ( DroolsResource resource : decisionTables ) { try { kfs.write( "src/main/resources/" + resource.getResourceName(), resource.getResource() ); } catch ( Exception e ) { logger.error( "Could not parse file base for decison table resource: " + resource.getResourceName() + " Thrown Exception is [" + GeneralUtils.mensajeError( e ) + "]" ); throw new IllegalArgumentException( "Could not parse file base for decison table resource: " + resource.getResourceName() ); } } decisionTables = null; // not needed any more free memory for resources } /** * Init all Rules that are declared in the spring context */ private void initDrls( List drls ) { for ( DroolsResource resource : drls ) { try { kfs.write( "src/main/resources/" + resource.getResourceName(), resource.getResource() ); } catch ( Exception e ) { logger.error( "Could not parse file base for decison table resource: " + resource.getResourceName() + " Thrown Exception is [" + GeneralUtils.mensajeError( e ) + "]" ); throw new IllegalArgumentException( "Could not parse file base for decison table resource: " + resource.getResourceName() ); } } drls = null; // not needed any more free memory for resources } /** * Creates a new stateless session. Can be called from spring also */ public StatelessKieSession newStatelessSession() { logger.info( "Create a new stateless session" ); return kieContainer.getKieBase().newStatelessKieSession(); } /** * Creates a new stateful session. Can be called from spring also */ /*public StatefulKnowledgeSession newStatefulSession() { logger.info("Create a new stateful session"); return kieBase.newStatefulKnowledgeSession(); }*/ public void runRules( Object inputData ) throws Exception { KieSessionConfiguration kieConfiguration = kieServices.newKieSessionConfiguration(); StatelessKieSession ksession = kieContainer.getKieBase().newStatelessKieSession( kieConfiguration ); logger.info( "Fire the rules with data:" + inputData.toString() ); ksession.execute( inputData ); } public void runRules( StatelessKieSession ksession, Object inputData ) throws Exception { logger.info( "Fire the rules with data in session:" + inputData.toString() ); ksession.execute( inputData ); } public void setDecisionTables( List decisionTables ) { initDecisionTables( decisionTables ); } public void setDrls( ArrayList drls ) { initDrls( drls ); } } 

3.-所以你可以用pojo运行任何规则。

 kbase.runRules(ObjectDeclaredInYourRule);