2015-01-09 64 views
1

我有一个测试解除kiesession,在全球数据,但unmarshall不会返回全球。Drools马歇尔/ 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:滴料编译:罐: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
+0

看起来好像全局并没有被定义。 – laune 2015-01-10 07:45:34

回答

1

全局未插入到工作内存,因此它们没有保存在KieSession的状态。

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

+0

有什么理由呢?对我来说这是一个错误,但也许我不理解背后的逻辑 – iflores 2015-01-22 13:25:30

+0

Hi @iflores,没有错误,全局变量有不同的目的。 [Drools文档](http://docs.jboss.org/drools/release/6.1.0.Final/drools-docs/html_single/index.html#d0e5849) “通常,它们用于提供数据或服务规则使用的规则,尤其是规则后果中使用的应用程序服务,以及从规则返回数据,例如规则后果中添加的日志或值,或规则与应用程序进行交互,执行回调。 – antmendoza 2015-02-14 16:33:04

0

恰好碰到了这真棒行为,所以这里的加载一个解决方案:

您可以初始化的全局之前与环境注册解析器加载会话:

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

凡对象是建立环境,需要相应的配置对象。