在构建时将DRL编译为Java时,可以维护事实类型的Drools元数据吗?

时间:2019-02-28 17:14:52

标签: java maven jboss drools kie

在maven编译阶段使用generateModel=YES选项将DRL编译为Java时,不维护类型声明的元数据。我在下面概述的一个简单示例中复制了此内容。 是否需要一些其他配置来保存元数据并在Java类定义中进行复制?

示例的设置如下:

我有一个简单的Drools&maven项目,其中包含一个DRL文件和一个具有main()方法的Java类,该方法仅加载类路径容器并打印其内容。

在没有drools-model-compiler插件或没有指定generateModel属性的情况下进行构建和运行时,可以从DRL事实类型中正确读取元数据。输出给出了容器的以下内容:

Base: all
  Session: all.stateful
  Package: ollij93
    Rule: AimplB
    FactType: ollij93.FactA
        MetaData: myMetaData = VALUEA
    FactType: ollij93.FactB
        MetaData: myMetaData = VALUEB

但是,当使用在构建中指定的-DgenerateModel=YES进行构建时,输出显示getMetaData()返回null:

Base: all
  Session: all.stateful
  Package: ollij93
    Rule: AimplB
    FactType: ollij93.FactA
        No MetaData
    FactType: ollij93.FactB
        No MetaData

以下示例的来源:

rules.drl:

package ollij93;

declare FactA
  @myMetaData(VALUEA)
end

declare FactB
  @myMetaData(VALUEB)
  a : FactA @key
end

rule AimplB
  when $a : FactA()
  then
    kcontext.insertLogical(new FactB($a));
end

Run.java:

package ollij93;

import java.util.Map;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.definition.KiePackage;
import org.kie.api.definition.rule.Rule;
import org.kie.api.definition.type.FactType;
import org.kie.api.runtime.KieContainer;

public class Run {

    public static void main(String[] args) {
        KieServices kServices = KieServices.Factory.get();

        KieContainer kContainer = kServices.getKieClasspathContainer();

        for (String baseName : kContainer.getKieBaseNames()) {
            System.out.println("Base: " + baseName);
            KieBase kbase = kContainer.getKieBase(baseName);
            for (String sessionName : kContainer.getKieSessionNamesInKieBase(baseName)) {
                System.out.println("  Session: " + sessionName);
            }
            for (KiePackage p : kbase.getKiePackages()) {
                System.out.println("  Package: " + p.getName());

                for (Rule r : p.getRules()) {
                    System.out.println("    Rule: " + r.getName());
                }

                for (FactType f : p.getFactTypes()) {
                    System.out.println("    FactType: " + f.getName());
                    Map<String, Object> mData = f.getMetaData();
                    if (mData == null) {
                        System.out.println("        No MetaData");
                    } else {
                        for (String key : mData.keySet()) {
                            System.out.println("        MetaData: " + key + " = " + mData.get(key));
                        }
                    }
                }
            }
        }
    }
}

0 个答案:

没有答案