JSR94를 사용하여 Drools와 함께 Excel 기반 의사 결정 테이블을 어떻게로드합니까?

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

  •  20-09-2019
  •  | 
  •  

문제

웹에는 Drools DRL 규칙 세트를로드하는 방법에 대한 많은 예가 있습니다. 그러나 JSR94 API를 사용하여 Excel 형식으로 의사 결정 테이블을로드하는 방법에 대한 지침이나 예제를 찾을 수는 없습니다.

누구 든지이 작업을 수행하는 방법을 아는 사람이 있습니까? 그렇다면 간단한 코드 예제를 제공 할 수 있습니까?

다음은 아래에서 작업하고있는 샘플 코드입니다. 나는 일부 속성이 설정을 받아야하고 CreaterUleexectuionset ()의 두 번째 매개 변수로 전달되어야한다고 생각하는 영역을 표시했습니다 (솔루션은 아닐 수도 있음).

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();
    }
}
도움이 되었습니까?

해결책

JSR -94 제공 업체가 아직 의사 결정 테이블 구현을 제공한다고 생각하지 않습니다. 의사 결정 테이블 API를 사용하여 XLS를 DRL 형식으로 변환 한 다음 위의 코드로 전달할 수 있습니다.

따라서 SpreadSheetCompiler (org.drools.decisiontables 패키지)를 사용하는 경우 불행히도 목적을 물리 칠 수있는 Drools 클래스 (순수한 JSR -94가 아님)를 가져와야합니다.

어쨌든 JSR -94 API가 매우 유용한 것은 드 rare니다. API 사양으로 진행되지 않은 이유가 있습니다. JSR-94를 사용하는 것보다 적은 줄의 코드 라인으로 몇 가지 주요 규칙 엔진에 대해 "스터브"를 구현할 수 있습니다.

나에게 유용한 것은 Jrules와 Drools 모두에서 일한 테스트 도구를 작성할 때였습니다 (이 경우에는 규칙 자체가 아닌 데이터 만 다루고 있었기 때문에 위의 코드에서 JSR- 94 다른 규칙 엔진의 "플러그 가능성"은 사용하지 않습니다. 다른 것을 다른 것으로 전환하려면 규칙을 다시 작성해야합니다).

행운을 빕니다 !

다른 팁

글쎄, 나는 JSR에 대해서는 잘 모르겠지만 반드시 JBPM에서 Drools 의사 결정 테이블을 사용할 수 있습니다. 코드에 의사 결정 테이블 Excel 시트를 추가하는 데 도움이되는 클래스 파일 하나가 있습니다.

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());
    }
}

라인 kbuilder.add (resourcefactory.newclasspathresource ( "loopconditionRules.xls"), 이 코드에서 프로젝트에 DRL 파일을 추가하는 방법은 JSR 프로젝트에 대한 힌트를 얻을 수 있습니다. 모두 제일 좋다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top