2010-03-17 9 views
5

Hay un montón de ejemplos en la web de cómo cargar un conjunto de reglas Drools DRL. Sin embargo, no puedo encontrar instrucciones o ejemplos de cómo cargar una tabla de decisiones en formato Excel utilizando la API JSR94.¿Cómo cargo una tabla de decisión basada en Excel con Drools usando JSR94?

¿Alguien sabe cómo hacer esto? Si es así, ¿podría proporcionar un ejemplo de código simple?

Aquí hay una pieza de código de muestra con la que estoy trabajando a continuación. Marqué el área en la que sospecho que algunas propiedades deben configurarse y pasarse como el segundo parámetro para crearRuleExectuionSet() (Aunque esa puede no ser la solución).

package com.sample; 

import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.rules.RuleRuntime; 
import javax.rules.RuleServiceProvider; 
import javax.rules.RuleServiceProviderManager; 
import javax.rules.StatelessRuleSession; 
import javax.rules.admin.LocalRuleExecutionSetProvider; 
import javax.rules.admin.RuleAdministrator; 
import javax.rules.admin.RuleExecutionSet; 

import org.drools.jsr94.rules.RuleServiceProviderImpl; 

/** 
* This is a sample class to launch a decision table. 
*/ 
public class DecisionTableTestJsr94 { 

    // URL to the Decision Table file (via the classpath) 
    private static final String DECISION_TABLE_PATH = "/rules/Sample.xls"; 

    // An arbitrary URI to identify the rule set 
    private static final String BIND_URI = "uri://fake/bind/uri"; 

    public DecisionTableTestJsr94() throws Exception{ 
     // Initialize the needed services 
     RuleServiceProviderManager.registerRuleServiceProvider(RuleServiceProviderImpl.RULE_SERVICE_PROVIDER, RuleServiceProviderImpl.class); 
     RuleServiceProvider ruleServiceProvider = RuleServiceProviderManager.getRuleServiceProvider(RuleServiceProviderImpl.RULE_SERVICE_PROVIDER); 
     RuleAdministrator ruleAdmin = ruleServiceProvider.getRuleAdministrator(); 
     LocalRuleExecutionSetProvider ruleExecutionSetProvider = ruleAdmin.getLocalRuleExecutionSetProvider(null); 

     // Read the decision table 
     InputStream rules = this.getClass().getResourceAsStream(DECISION_TABLE_PATH); 
     Map ruleProperties = new HashMap(); 

     // ** (probably something needs to happen hear with a properties Map, but what? ** 

     RuleExecutionSet ruleExecutionSet = ruleExecutionSetProvider.createRuleExecutionSet(rules, null); 

     // Add the rules 
     ruleAdmin.registerRuleExecutionSet(BIND_URI, ruleExecutionSet, null); 

     // Start the rule session 
     StatelessRuleSession ruleSession = null; 
     ruleSession = (StatelessRuleSession) ruleServiceProvider.getRuleRuntime().createRuleSession(BIND_URI, null, RuleRuntime.STATELESS_SESSION_TYPE); 

     // Create a domain object for the test 
     Message message = new Message(); 
     message.setStatus(Message.HELLO); 
     System.out.println("Message is: '" + message.getMessage() + "'"); // should be null 

     // Run the object through the rules 
     List<Message> inputList = new ArrayList<Message>(); 
     inputList.add(message); 
     ruleSession.executeRules(inputList); 

     // See if the rules modified the object 
     System.out.println("Message is: '" + message.getMessage() + "'"); // should have the appropriate message 
    } 

    public static final void main(String[] args) throws Exception { 
     new DecisionTableTestJsr94(); 
    } 
} 

Respuesta

4

No creo que el proveedor de JSR-94 proporciona una implementación Tabla de decisiones hasta el momento - que tendría que utilizar la API de tabla de decisión para convertir el XLS al formato DRL, que luego se podría pasar a la anterior código.

Así que si utiliza SpreadsheetCompiler (paquete org.drools.decisiontables) que podría hacerlo por usted, lamentablemente eso significa que tiene que importar una clase drools (no JSR-94 puro) por lo que puede vencer el propósito.

En cualquier caso, es raro que la api JSR-94 sea muy útil; hay una razón por la que no ha progresado como una especificación API. Podría decirse que podría implementar "stubs" para algunos motores de reglas principales en menos líneas de código que utilizando JSR-94 (¡lo he hecho!).

La única vez que fue útil para mí fue cuando estaba escribiendo una herramienta de prueba que funcionaba tanto para JRules como para Drools (fue útil en ese caso porque solo manejaba datos, no reglas, en el código anterior - la "capacidad de conexión" JSR-94 de un motor de reglas diferente no sirve de nada; si tuviera que cambiar a otra cosa, sus reglas deberían ser reescritas de todos modos).

¡Buena suerte!

1

Bueno, no sé para JSr, pero seguramente se puede utilizar la tabla de decisión drools en JBPM. Tengo un archivo de clase que puede ayudarte a agregar la hoja de Excel de tu tabla de decisiones en tu código con suerte.

package com.sample; 

import java.util.*; 

import org.drools.*; 

import org.jbpm.*; 

public class ProcessRuleTest { 

    public static final void main(String[] args) { 
     try { 
      // load up the knowledge base 
      KnowledgeBase kbase = readKnowledgeBase(); 
      StatefulKnowledgeSession ksession = createSession(kbase); 
      KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory 
        .newFileLogger(ksession, "test"); 

      // set the parameters 
      Map<String, Object> params = new HashMap<String, Object>(); 
      HelloProcessModel hpm = new HelloProcessModel(); 
      hpm.setCount(new Integer("3")); 
      hpm.setUserlocation("NewYorkUser"); 
      params.put("hpm", hpm); 
      ksession.startProcess("looptest777",params); 

      ksession.fireAllRules(); 
      logger.close(); 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 

    private static KnowledgeBase readKnowledgeBase() throws Exception { 
     ProcessBuilderFactory 
       .setProcessBuilderFactoryService(new ProcessBuilderFactoryServiceImpl()); 
     ProcessMarshallerFactory 
       .setProcessMarshallerFactoryService(new ProcessMarshallerFactoryServiceImpl()); 
     ProcessRuntimeFactory 
       .setProcessRuntimeFactoryService(new ProcessRuntimeFactoryServiceImpl()); 
     BPMN2ProcessFactory 
       .setBPMN2ProcessProvider(new BPMN2ProcessProviderImpl()); 
     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory 
       .newKnowledgeBuilder(); 
     kbuilder.add(ResourceFactory.newClassPathResource("processRuleslooptest777.bpmn"), 
       ResourceType.BPMN2); 

     DecisionTableConfiguration config = KnowledgeBuilderFactory.newDecisionTableConfiguration(); 
     config.setInputType(DecisionTableInputType.XLS); 
     kbuilder.add(ResourceFactory.newClassPathResource("LoopConditionRules.xls"), ResourceType.DTABLE, config); 


     /* 
     * Add drl file 
     */ 
     //kbuilder.add(ResourceFactory.newClassPathResource("LoopConditionRules.drl"), ResourceType.DRL); 

     return kbuilder.newKnowledgeBase(); 
    } 

    private static StatefulKnowledgeSession createSession(KnowledgeBase kbase) { 
     Properties properties = new Properties(); 
     properties 
       .put("drools.processInstanceManagerFactory", 
         "org.jbpm.process.instance.impl.DefaultProcessInstanceManagerFactory"); 
     properties.put("drools.processSignalManagerFactory", 
       "org.jbpm.process.instance.event.DefaultSignalManagerFactory"); 
     KnowledgeSessionConfiguration config = KnowledgeBaseFactory 
       .newKnowledgeSessionConfiguration(properties); 
     return kbase.newStatefulKnowledgeSession(config, 
       EnvironmentFactory.newEnvironment()); 
    } 
} 

La línea de kbuilder.add (ResourceFactory.newClassPathResource ("LoopConditionRules.xls"), en este código es la manera de añadir un archivo drl en el proyecto, puede estar buscando en este se puede conseguir para su insinuar Proyecto jsr. Todo lo mejor

Cuestiones relacionadas