1

我有一个测试来解组 kiesession,数据在全球,但解组不会返回全球。

代码是:

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"));

流口水规则

 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
4

2 回答 2

1

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

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

于 2015-01-18T21:29:20.147 回答
1

刚刚遇到了这个很棒的行为,所以这里有一个加载解决方案:

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

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);

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

于 2015-12-22T12:06:13.130 回答