我有一个测试来解决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
版本是:
答案 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);
其中对象是设置环境所需的相应配置对象。