Drools 7.73.0中如何用FileSystemResource避免资源泄漏与文件锁问题?
解决Drools FileSystemResource加载kjar后的文件锁问题
核心解决方案:释放KieContainer资源
当你不再需要使用KieContainer时,调用它的dispose()方法,这会触发Drools内部的资源清理逻辑,释放被锁定的kjar文件:
// 使用完KieContainer后执行 kc.dispose(); // 此时再尝试删除文件即可成功 File testFile = new File(pathKjar); testFile.delete();
为什么会出现文件锁?
调用ks.getRepository().addKieModule(resource)时,Drools会打开kjar文件的输入流读取内容,并且为了后续规则执行的需求,不会立即关闭这些流。只有当KieContainer被销毁时,才会彻底关闭所有关联的文件流,释放文件锁。
可选优化:配置FileSystemResource的资源策略
创建FileSystemResource时,可以通过ResourceConfiguration设置相关属性,强制读取后关闭资源(部分版本生效):
Resource resource = ks.getResources().newFileSystemResource(pathKjar) .setConfiguration(new ResourceConfiguration() { @Override public void setProperty(String name, Object value) { // 设置读取后关闭资源的属性 if ("drools.resource.closeOnRead".equals(name)) { value = true; } } });
不过这个方法的可靠性不如直接调用KieContainer.dispose(),更推荐以容器生命周期管理为主。
补充说明
你用InputStream实现能成功关闭资源,是因为InputStream由你手动控制,可以直接调用close();但FileSystemResource的流是Drools内部管理的,必须通过容器的生命周期方法来释放。
内容的提问来源于stack exchange,提问作者capathmo
相关产品推荐
相关产品推荐

