Java drools中是否有API通过传递值来动态创建drl文件?

Java drools中是否有API通过传递值来动态创建drl文件?,java,drools,drools-guvnor,kie,Java,Drools,Drools Guvnor,Kie,我知道如何使用所有方法在KIE workbench中创建DRL文件。但我的问题是,如果不使用KIE工作台,我们是否可以使用所需的值创建.drl文件。如果有任何可能性,请建议我。同样的方式告诉我任何API都与此相关。提前感谢。标准工具不会生成DRL文件。相反,它们鼓励您使用在运行时应用于数据的模板 您应该查看决策表文档(特殊结构的电子表格): 。。。和规则模板: 我用两种不同的方式解释你的问题 1.不使用KIE工作台就可以为Drools编写规则吗? 是的,它应该支持导入规则,所以您所需要做的就是

我知道如何使用所有方法在KIE workbench中创建DRL文件。但我的问题是,如果不使用KIE工作台,我们是否可以使用所需的值创建.drl文件。如果有任何可能性,请建议我。同样的方式告诉我任何API都与此相关。提前感谢。

标准工具不会生成DRL文件。相反,它们鼓励您使用在运行时应用于数据的模板

您应该查看决策表文档(特殊结构的电子表格):

。。。和规则模板:


我用两种不同的方式解释你的问题

1.不使用KIE工作台就可以为Drools编写规则吗? 是的,它应该支持导入规则,所以您所需要做的就是打开一个文本编辑器并开始键入。规则以文本形式编写,使用相当简单的语法,您可以在大约1-2小时的阅读中理解。我不知道您的环境是什么样子,但应该有一种机制来解析和导入新规则。您编写的所有规则都将在文本编辑器中开始,如下所示:

rule "<name>"
    <attribute>
when
    <conditional element>
then
    <action>
end
规则“”
什么时候
然后
结束
您将添加到条件和操作中。当然,您必须知道您可以创建哪些条件,这些条件仅限于您的环境和操作

2.是否可以通过某种API创建规则并以编程方式使用它们? 是的,我一直在使用JavaAPI进行处理。我们使用两种类型的规则,静态和动态。静态的有预屏蔽的条件,并且被写入以反复执行相同的比较(LHS),并在每次满足条件时执行相同的操作(RHS)。动态对象是根据用户在创建时指定的一组最小对象类型和比较(LHS)动态创建的。这些操作(RH)是预先封装的,但根据整体规则使用的需要选择使用。整个规则被创建为文本,然后在添加到要计算的规则列表之前传递给Drools解析器


希望这能有所帮助。

另一种选择是从工厂开始使用“descr”API:

org.drools.compiler.lang.api.DescrFactory
这些API构建Drools AST,它可以直接传递给编译器, 绕过解析器。AST还可以使用
helper class
org.drools.compiler.lang.DrlDumper

Decesion表对我有效,或者您可以尝试使用新的drools工作台

我使用了DrlDescr转储方法,但它没有更新drl文件,有人知道为什么吗

代码:- pkg1.addRule(规则); 系统输出打印LN(dDump.dump(pkg1))

您可以使用。请尝试以下示例代码:

package com.sample;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

import org.drools.lang.DrlDumper;
import org.drools.lang.api.DescrFactory;
import org.drools.lang.descr.PackageDescr;

@SuppressWarnings("restriction")
public class Drl_Creator {
    public static void main(String str[]){
        PackageDescr pkg = DescrFactory.newPackage()
                   .name("org.drools.example")
                   .newRule().name("Xyz")
                       .attribute("ruleflow-grou","bla")
                   .lhs()
                       .and()
                           .pattern("Foo").id( "$foo", false ).constraint("bar==baz").constraint("x>y").end()
                           .not().pattern("Bar").constraint("a+b==c").end().end()
                       .end()
                   .end()
                   .rhs( "System.out.println();" ).end()
                   .getDescr();
        DrlDumper dumper=new DrlDumper();
        String drl=dumper.dump(pkg);
        System.out.print(drl);
        try{
            // create new file
            File file = new File("src/main/rules/test.drl");
            file.createNewFile();
            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(drl);
            // close connection
            bw.close();
            System.out.println("File Created Successfully");
         }catch(Exception e){
             System.out.println(e);
         }
    }
}

甚至我也使用了@apandey846建议的相同实现。我只想补充一件事:如果您想导入所需的类,可以按如下方式进行:

               PackageDescr pkg = DescrFactory.newPackage()                        
               .newImport("classname").target().end()
               .name("org.drools.example")
               .newRule().name("Xyz")
                   .attribute("ruleflow-grou","bla")
               .lhs()
                   .and()
                       .pattern("Foo").id( "$foo", false ).constraint("bar==baz").constraint("x>y").end()
                       .not().pattern("Bar").constraint("a+b==c").end().end()
                   .end()
               .end()
               .rhs( "System.out.println();" ).end()
               .getDescr();
要在LHS中添加多个条件,可以执行以下操作:

               pattern("eval").constraint("condition1").end().
               pattern("eval").constraint("condition2").end().
               pattern("eval").constraint("condition3").end().

希望有帮助……)

他们实际上并不创建DRL,但你应该阅读决策表和模板的文档。嘿@Steve谢谢你的快速回复。你能给我提供文档链接吗?谢谢。这还不足以以合理的精度回答一个问题。谢谢@Steve的回答。但我所寻找的需求与此场景不同。你给了我正确的东西,通过决策表实现规则。可能是我的要求不够好。再次感谢。:)如果我需要在包名之后添加导入类或包语句,我将如何添加?谢谢。请添加更多关于选项2的详细信息?比如“将规则创建为文本,然后在添加到要计算的规则列表之前传递给Drools解析器”要使用的库。很抱歉,我无法将其格式化。
KnowledgeBuilder kb=KnowledgeBuilderFactory.newKnowledgeBuilder();add(ResourceFactory.newByteArrayResource(ruleset.getBytes()),ResourceType.DRL)