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

How can I get all of the globals required by a KieSession?

我正在使用 Drools,我正在将相当多的全局变量插入 KieSession

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

我正在使用的每个 object 都作为一个 Spring bean 存在,所以我突然想到,如果我有一个预期的全局变量列表,我可以简单地 "autowire" session.

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

有一个名为 getGlobals 的方法,但它只出现在 return 已经插入的全局变量中。

通过附加调试器,我可以看到 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);
}

这行得通,但除非绝对必要,否则我宁愿不求助于反射。

有没有更好的方法来完成这个?如果不是,是否有充分的理由封装此信息以致于我无法正常访问它?

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

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