gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:22:42 37 4
gpt4 key购买 nike

网上有很多关于如何加载 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 非常有用的情况很少见——它没有作为 API 规范发展是有原因的。可以说,与使用 JSR-94 相比,您可以用更少的代码行为一些主要规则引擎实现“ stub ”(我已经做到了!)。

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

祝你好运 !

关于drools - 如何使用 JSR94 使用 Drools 加载基于 Excel 的决策表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2465682/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com