在深入 Fusion 示例之前,我想展示当前与 Drools5 模板 的集成。当您有许多遵循某种模式(s)的规则时,规则模板非常有用。此外,当您在规则模式或操作中存在重复的硬编码值时,您也可以使用模板。虽然 Seam numberguess 示例不是规则模板的最佳示例,但对于简单的示例来说足够好了。
如果我们查看基础 numberguess.drl DRL,我们可以看到一些硬编码的值,例如 guessCount 设置为 9,guess 增量值为 1,我们还看到硬编码的值为 win
和 lose
,所有这些我们希望从我们的规则资源中外部化。 这就是 我们的新规则模板可能的样子。如果我们查看规则 lose
,我们可以看到一些相关更改
rule Lose when Game(guessCount == @{guesscount} ) then if ( decision.getOutcome()==null ) { decision.setOutcome("@{losetext}"); } end
请参阅 Drools 文档 了解模板语法的进一步解释。
为了扩展我们的模板,我们必须提供一个数据源。在 Seam 中,这种扩展由实现 TemplateDataProvider 接口的自定义 Seam 组件驱动
public Collection<Map<String,Object>> getTemplateData();
对于这个简单的示例,我们实现了一个带有硬编码值的模板数据提供程序
@Name("numberGuessTemplateDataProvider") public class NumberGuessTemplateDataProvider implements TemplateDataProvider { Collection<Map<String, Object>> templateData = new ArrayList<Map<String,Object>>(); @Create public void init() { // We use a Map which provides the values for substituting template parameters. // It should have a (String) key set matching all of the parameter names. // Values can be from any class, as long as they provide a good toString() method Map<String, Object> m1 = new HashMap<String, Object>(); m1.put("wintext", "win"); // substitutes the @{wintext} template parameter m1.put("losetext", "lose"); // substitutes the @{losetext} template parameter m1.put("guesscount", 9); // substitutes the @{guesscount} template parameter m1.put("increment", 1); // substitutes the @{increment} template parameter templateData.add(m1); } // getters and setters }
现在剩下的事情就是在 components.xml 中进行配置。首先我们定义我们的知识库
<drools:knowledge-base name="kbase" knowledge-builder-config="kbuilderconfig.properties" knowledge-base-config="kbaseconfig.properties"> <drools:rule-resources> <value>classpath;numberguesstemplate.drl;DRL;numberGuessTemplateDataProvider</value> </drools:rule-resources> <drools:event-listeners> <value>org.drools.event.knowledgebase.DefaultKnowledgeBaseEventListener</value> </drools:event-listeners> </drools:knowledge-base>
请注意,我们只将我们的模板数据提供程序名称添加到规则资源字符串中...就是这样。最后要做的就是定义我们的状态知识会话,如前一篇博客中所示。