如何获得KieSession所需的所有全局变量?

时间:2019-02-05 12:38:22

标签: java drools kie

我正在使用Drools,并且正在KieSession中插入很多全局变量。

kieSession.setGlobal("foo", foo);
kieSession.setGlobal("bar", bar);
kieSession.setGlobal("baz", baz);
//...

我用作全局对象的每个对象都以Spring bean的形式存在,所以我想到,如果我有一个期望全局变量的列表,我可以简单地“自动装配”会话。

Map<String, Class<?>> globals = getGlobals(kieSession);
globals.forEach((name, clazz) -> 
    kieSession.setGlobal(name, beanFactory.getBean(clazz))
);

有一个名为getGlobals的方法,但它似乎只返回已插入的全局变量。

通过附加调试器,我可以看到KieBase内部存在这些值的映射,并且我编写了一种通过反射来获取它的方法:

@SuppressWarnings("unchecked")
@SneakyThrows //Lombok turns the checked exceptions into unchecked
private Map<String, Class<?>> getGlobals(final KieSession session)
{
    final KieBase kieBase = session.getKieBase();
    final Field globals = kieBase.getClass().getDeclaredField("globals");
    globals.setAccessible(true);
    return (Map<String, Class<?>>) globals.get(kieBase);
}

这行得通,但除非绝对必要,否则我不愿反思。

是否有更好的方法可以做到这一点?如果没有,为什么将这些信息封装起来以使我通常无法访问它有充分的理由?

1 个答案:

答案 0 :(得分:2)

您可以从KiePackage获取全局变量。只需迭代从KieBase获得的KiePackages。

final Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();
for (KiePackage kiePackage : kiePackages)
{
    final Collection<Global> globalVariables = kiePackage.getGlobalVariables();
    //...
}