Drools marshall/unmarshall 不保存全局
Drools marshall/unmarshall not save global
我有一个解组 kiessession 的测试,数据在全球,但解组不是 return 全局。
代码是:
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
全局变量不会插入到工作内存中,因此它们不会与 KieSession 的状态一起保存。
每次恢复 KieSession 的状态时都必须插入全局变量。
只是 运行 进入这个令人敬畏的行为,所以这是加载的解决方案:
您可以在加载会话之前通过向环境注册解析器来初始化全局变量:
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);
其中对象是设置环境所需的相应配置对象。
我有一个解组 kiessession 的测试,数据在全球,但解组不是 return 全局。
代码是:
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
全局变量不会插入到工作内存中,因此它们不会与 KieSession 的状态一起保存。
每次恢复 KieSession 的状态时都必须插入全局变量。
只是 运行 进入这个令人敬畏的行为,所以这是加载的解决方案:
您可以在加载会话之前通过向环境注册解析器来初始化全局变量:
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);
其中对象是设置环境所需的相应配置对象。