Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JSR94加载带有Drools的基于Excel的决策表?_Drools - Fatal编程技术网

如何使用JSR94加载带有Drools的基于Excel的决策表?

如何使用JSR94加载带有Drools的基于Excel的决策表?,drools,Drools,网上有很多关于如何加载Drools DRL规则集的示例。然而,我似乎找不到任何关于如何使用JSR94API以Excel格式加载决策表的说明或示例 有人知道怎么做吗?如果是这样,你能提供一个简单的代码示例吗 下面是我正在使用的一段代码示例。我已经标记了我怀疑某些属性需要设置的区域,并将其作为CreateRuleExecutionSet()的第二个参数传入(尽管这可能不是解决方案) package.com.sample; 导入java.io.InputStream; 导入java.util.Arra

网上有很多关于如何加载Drools DRL规则集的示例。然而,我似乎找不到任何关于如何使用JSR94API以Excel格式加载决策表的说明或示例

有人知道怎么做吗?如果是这样,你能提供一个简单的代码示例吗

下面是我正在使用的一段代码示例。我已经标记了我怀疑某些属性需要设置的区域,并将其作为CreateRuleExecutionSet()的第二个参数传入(尽管这可能不是解决方案)

package.com.sample;
导入java.io.InputStream;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入javax.rules.RuleRuntime;
导入javax.rules.RuleServiceProvider;
导入javax.rules.RuleServiceProviderManager;
导入javax.rules.StatelessRuleSession;
导入javax.rules.admin.LocalRuleExecutionSetProvider;
导入javax.rules.admin.RuleAdministrator;
导入javax.rules.admin.RuleExecutionSet;
导入org.drools.jsr94.rules.RuleServiceProviderImpl;
/**
*这是一个启动决策表的示例类。
*/
公共类决策表JSR94{
//决策表文件的URL(通过类路径)
私有静态最终字符串决策表路径=“/rules/Sample.xls”;
//用于标识规则集的任意URI
私有静态最终字符串BIND_URI=”uri://fake/bind/uri";
public DecisionTableTestJsr94()引发异常{
//初始化所需的服务
RuleServiceProviderManager.registerRuleServiceProvider(RuleServiceProviderImpl.RULE\u服务\u提供程序,RuleServiceProviderImpl.class);
RuleServiceProvider RuleServiceProvider=RuleServiceProviderManager.getRuleServiceProvider(RuleServiceProviderImpl.RULE\u SERVICE\u PROVIDER);
RuleAdministrator ruleAdmin=ruleServiceProvider.getRuleAdministrator();
LocalRuleExecutionSetProvider ruleExecutionSetProvider=ruleAdmin.getLocalRuleExecutionSetProvider(null);
//阅读决策表
InputStream规则=this.getClass().getResourceAsStream(决策表路径);
Map ruleProperties=新建HashMap();
//**(可能需要使用属性映射发生一些事情,但是什么**
RuleExecutionSet RuleExecutionSet=ruleExecutionSetProvider.createRuleExecutionSet(规则,null);
//添加规则
registerRuleExecutionSet(绑定URI,ruleExecutionSet,null);
//启动规则会话
无状态ruleSession ruleSession=null;
ruleSession=(无状态ruleSession)ruleServiceProvider.getRuleRuntime().createRuleSession(绑定URI,null,RuleRuntime.无状态会话类型);
//为测试创建域对象
消息消息=新消息();
message.setStatus(message.HELLO);
System.out.println(“消息为:“+Message.getMessage()+””);//应为null
//通过规则运行对象
List inputList=新建ArrayList();
inputList.add(消息);
规则会话。执行器(输入列表);
//查看规则是否修改了对象
System.out.println(“消息为:“+Message.getMessage()+””);//应具有适当的消息
}
公共静态最终void main(字符串[]args)引发异常{
新的决策表TestJSR94();
}
}

我认为JSR-94提供程序尚未提供决策表实现-您需要使用决策表API将XLS转换为drl格式,然后将其传递给上述代码

因此,如果您使用SpreadsheetCompiler(org.drools.decisiontables包)可以为您完成这项工作-不幸的是,这意味着您必须导入一个drools类(而不是纯JSR-94),这样可能无法达到目的

在任何情况下,JSR-94 api都非常有用,这是它没有作为api规范发展的一个原因。可以说,与使用JSR-94相比,您可以用更少的代码行实现一些主要规则引擎的“存根”(我已经做到了!)

它对我有用的一次是在我编写一个测试工具时,该工具同时适用于JRules和Drools(在这种情况下很有用,因为我在上面的代码中只处理数据——而不是规则本身——JSR-94“可插拔性”使用不同的规则引擎是没有用的——如果你要切换到其他东西,你的规则无论如何都必须重写)


祝你好运!

我不知道JSr是什么,但你肯定可以在JBPM中使用drools决策表。 我有一个类文件,它可以帮助您在代码中添加决策表excel表

package.com.sample;
导入java.util.*;
导入org.drools.*;
导入org.jbpm.*;
公共类ProcessRuleTest{
公共静态最终void main(字符串[]args){
试一试{
//加载知识库
KnowledgeBase kbase=readKnowledgeBase();
StatefulKnowledgeSession ksession=createSession(kbase);
KnowledgeRuntimeLogger记录器=KnowledgeRuntimeLogger工厂
.newFileLogger(ksession,“test”);
//设置参数
Map params=新的HashMap();
HelloProcessModel hpm=新的HelloProcessModel();
hpm.setCount(新整数(“3”);
hpm.setUserlocation(“纽约用户”);
参数put(“hpm”,hpm);
ksession.startProcess(“looptest777”,参数);
ksession.fireAllRules();
logger.close();
}捕获(可丢弃的t){
t、 printStackTrace();
}
}
私有静态KnowledgeBase readKnowledgeBase()引发异常{
ProcessBuilderFactory
.setProcessBuilderFactoryService(新的ProcessBuilderFactoryServiceImpl());
加工厂
.setProcessMarshallerFactoryService(新的ProcessMarshallerFactoryServiceImpl());
ProcessRuntimeFac
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();
    }
}