Drools marshall / unmarshall不能拯救全球

时间:2015-01-09 20:53:42

标签: marshalling global drools unmarshalling kie

我有一个测试来解决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 Rule

 global java.util.Map map

 rule "test"

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

版本是:

  • org.drools:滴料编译:罐:6.1.0.Final
  • org.drools:滴料芯:罐:6.1.0.Final
  • org.kie:纪伊-API:罐:6.1.0.Final.1.2
  • org.kie:纪伊内部:罐:6.1.0.Final

2 个答案:

答案 0 :(得分:1)

全局变量未插入工作记忆中,因此它们不会以KieSession的状态保存。

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

答案 1 :(得分: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);

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