Come faccio a caricare una tabella di decisione basata su Excel con Drools utilizzando JSR94?

StackOverflow https://stackoverflow.com/questions/2465682

  •  20-09-2019
  •  | 
  •  

Domanda

C'è un mucchio di esempi sul web su come caricare un set di regole Drools DRL. Tuttavia, non riesco a trovare nessuna istruzioni o esempi su come caricare una tabella di decisione in formato Excel utilizzando l'API JSR94.

Qualcuno sa come fare questo? Se è così, si potrebbe fornire un semplice esempio di codice?

Ecco un esempio di codice con cui sto lavorando sotto. Ho segnato l'area che ho il sospetto che alcune proprietà hanno bisogno di ottenere l'installazione e passato come secondo parametro a createRuleExectuionSet () (anche se questo potrebbe non essere la soluzione).

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();
    }
}
È stato utile?

Soluzione

Non credo che il provider di JSR-94 fornisce un'implementazione tavolo decisione ancora - si avrebbe bisogno di utilizzare l'API tabella di decisione di convertire la XLS al formato DRL, che si potrebbe poi passare al codice di cui sopra.

Quindi, se si utilizza SpreadsheetCompiler (pacchetto org.drools.decisiontables) che potrebbe fare per voi -, purtroppo, che significa che si deve importare una classe Drools (non pura JSR-94) in modo che possa annullare l'obiettivo.

In ogni caso, è raro che l'API JSR-94 è molto utile - c'è un motivo per cui non è progredita come spec API. Si potrebbe probabilmente implementare "stub" per alcuni principali motori di regole in meno linee di codice che utilizzare JSR-94 (l'ho fatto!).

L'unica volta che è stato utile per me è stato quando stavo scrivendo uno strumento di test che ha lavorato sia per JRules e Drools (è stato utile in questo caso perché ero solo a che fare con i dati - non regole stesse - nel codice di cui sopra - il "innestabilità" JSR-94 di un diverso motore di regole è inutile - se si dovesse passare a qualcosa di diverso le regole dovrebbero essere riscritti in ogni caso).

In bocca al lupo!

Altri suggerimenti

Beh non so per JSR ma sicuramente è possibile utilizzare tabella di sbava decisione JBPM. Ho un file di classe che può aiutare di aggiungere la vostra tabella di decisione eccellere foglio nel codice si spera.

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 linea di kbuilder.add (ResourceFactory.newClassPathResource ( "LoopConditionRules.xls") , in questo codice è il modo per aggiungere file di DRL nel progetto, può essere alla ricerca di questo si può ottenere suggerimento per il progetto JSR. Tutto il meglio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top