加载
public static KnowledgeBase getAgentBase(){
// 资源管理配置,静态工厂方式进行获取
ResourceChangeScannerConfiguration resourceConfig = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
// 获取对象手动设置
// 这个时间单位是秒,需要注意
resourceConfig.setProperty("drools.resource.scanner.interval", "10");
// try{
// Properties properties = new Properties();
// properties.load(new FileInputStream("file"));
// // 也可以通过properties直接进行配置设置,自动识别
// resourceConfig = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration(properties);
// }catch(Exception e){
//
// }
// 资源服务外部进行管理,通过配置服务底层会自动进行资源管理
ResourceFactory.getResourceChangeScannerService().configure(resourceConfig);
// 也可以外部变量接收,这样或许比较容易明白
// 不过这个服务只能说会自动管理,我们能做到的是开启和配置,运行时机底层自动管理
// ResourceChangeScanner resourceChangeScannerService = ResourceFactory.getResourceChangeScannerService();
// ResourceChangeScannerConfiguration resourceChangeScannerConfig = resourceChangeScannerService.newResourceChangeScannerConfiguration();
// resourceChangeScannerService.configure(resourceChangeScannerConfig);
// 这种也不是不可以,看个人习惯
// ResourceFactory.getResourceChangeScannerService().configure(ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration(new Properties()));
// 开启资源管理服务
ResourceFactory.getResourceChangeScannerService().start();
// 外部服务通知功能,如果不开启不会传递给外部
ResourceFactory.getResourceChangeNotifierService().start();
// 这次是agent配置
KnowledgeAgentConfiguration agentConfig = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
// 也可以通过properties进行配置,一样的套路
// agentConfig = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(new Properties());
agentConfig.setProperty("drools.agent.scanDirectories", "true");
agentConfig.setProperty("drools.agent.newInstance", "true");
// 可以直接生成
KnowledgeAgent agent = KnowledgeAgentFactory.newKnowledgeAgent("agent");
// 也可以通过传入配置实例化
// 这个就比上面的亲民了,不是一个见机行事的,完全的是掌控在我们手中
agent = KnowledgeAgentFactory.newKnowledgeAgent("agent", agentConfig);
// 也可以添加监听器,不过有点多啊,先点一下就行了
// agent.addEventListener(new KnowledgeAgentEventListener() );
// 这个需要注意,agent只支持changeset方式的资源,否则真心不好管理啊
agent.applyChangeSet(ResourceFactory.newClassPathResource("rule.xml", DroolsTest.class));
// 直接get就出来KnowledgeBase了
return agent.getKnowledgeBase();
}
意义
1. 资源汇总
之前的change-set好像只是资源的汇总管理,或许有人觉得还不如直接手动管理方便。
但是程序打包以后,外部配置就显得十分方便了
2. 资源变化
而且,有了change-set的统一管理,有统一入口,实现资源的刷新成为可能。
由于入口是固定的,对于内容的重加载,就能够对规则的修改实现"热"加载。
配置
1. 资源设置
资源管理服务,需要开启管理服务和通知服务。
通过和代理交互,达成"热"加载。
2. 代理设置
和资源服务对接,也要对应设置。
3. 设置方式
- 都是静态方式获取
- 都可以properties设置
- 资源注入,自动管理。代理创建,自己使用。
注意
注意啥呢,注意这个"热"加载的"热"。
1. 一般的热加载都是监听修改,然后通知修改相关服务缓存。
2. 然后就是比较low的就是定期刷新,加载肯定是有延时的
PS: drools的是定期刷新,这个是第一个需要注意的点。
在knowledgeBase使用过程当中,和agent是弱关联的。
当agent监听到变化时,任然是在内部,只有再次getKnowledgeBase重新生成Base才会把感知到的修改传达到只是库中。
那么接下来的session也必然是要重新获取的。
PS:这个是第二个需要注意的点。
所以:PS:定期重新获取知识库和session,否则变化能够监听,却不能够反馈到逻辑中。