【问题标题】:Drools marshall/unmarshall not save global流口水编组/解组不保存全局
【发布时间】:2015-01-09 20:53:41
【问题描述】:

我有一个用于解组 kiesession 的测试,数据在 Global 中,但 unmarshall 不会返回全局。

代码是这样的:

Java 测试

    KieServices kieServices = KieServices.Factory.get();

    KieContainer kContainer = kieServices.getKieClasspathContainer();

    KieBase kBase1 = kContainer.getKieBase("KBase1");
    KieSession kieSession1 = kContainer.newKieSession("KSession2_1");

    Map<String, Object> map = new ConcurrentHashMap<String, Object>();

    int tam = 10000;

    for (int i = 0; i < tam; i++) {
        map.put("map" + i, i);
    }

    kieSession1.setGlobal("map", map);

    for (int i = 0; i < tam; i++) {

        Client client = new Client();
        client.setName("test");
        client.setEdad(10);

        kieSession1.insert(client);
    }

    kieSession1.fireAllRules();

    Marshaller marshaller = MarshallerFactory.newMarshaller(kBase1);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        marshaller.marshall(baos, kieSession1);
    } catch (IOException e) {
        fail("error");
    }

    byte[] data = baos.toByteArray();

    try {
        baos.close();
    } catch (IOException e) {
        fail("error");
    }
    //
    kieSession1.dispose();

    InputStream is = new ByteArrayInputStream(data);
    try {

        kieSession1 = marshaller.unmarshall(is);
    } catch (ClassNotFoundException e) {
        fail("error");
    } catch (IOException e) {
        fail("error : " + e);
    } finally {
        try {
            is.close();
        } catch (IOException e) {
        }
    }

    assertEquals(tam, kieSession1.getFactCount());

    assertNotNull("No existe Global !!", kieSession1.getGlobal("map"));

Drools 规则

 global java.util.Map map

 rule "test"

    when
    then
        System.out.println("test !!" + map.size());
end

版本是:

  • org.drools:drools-compiler:jar:6.1.0.Final
  • org.drools:drools-core:jar:6.1.0.Final
  • org.kie:kie-api:jar:6.1.0.Final.1.2
  • org.kie:kie-internal:jar:6.1.0.Final

【问题讨论】:

  • 看起来好像定义中没有包含全局变量。

标签: marshalling global drools unmarshalling kie


【解决方案1】:

全局变量不会插入到工作内存中,因此它们不会与 KieSession 的状态一起保存。

每次恢复 KieSession 的状态时都必须插入全局变量。

【讨论】:

  • 有什么理由吗?对我来说这是一个错误,但也许我不理解背后的逻辑
  • 嗨@iflores,没有错误,全局变量有不同的目的。 Drools documentation "通常,它们用于提供规则使用的数据或服务,尤其是规则结果中使用的应用程序服务,并从规则返回数据,如规则结果中添加的日志或值,或用于规则交互与应用程序一起进行回调。”
【解决方案2】:

刚刚遇到这种令人敬畏的行为,所以这里有一个加载解决方案:

您可以在加载会话之前通过在环境中注册解析器来初始化全局变量:

Environment environment = kieServices.getEnvironment();
        MapGlobalResolver resolver = new MapGlobalResolver(droolsProvider.globals());
        environment.set(EnvironmentName.GLOBALS, resolver);

无论如何,MapGlobalResolver 都是默认的解析器。通过使用这种方法,解析器将使用正确的全局变量进行预初始化。就个人而言,我正在考虑编写一个 InjectionResolver 以便 Guice 按需注入全局变量,但这可能并不适合每个人的需要。

然后加载就像传入正确的环境一样简单:

KieSession loadedKieSession = kieServices.getKieService().getStoreServices().loadKieSession(session.getId(), kieBase, ksConf, environment);

其中的对象是设置环境所需的相应配置对象。

【讨论】:

  • 你能给出这个或任何例子的任何参考吗?
  • 对不起,我在 15 年写了这篇文章,从那时起就无法访问我的代码了。上面的示例,据我所知,只是配置会话并演示如何在恢复的会话上设置全局变量
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2017-04-10
  • 2022-10-17
  • 2016-05-08
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多