Drools从7.33.0升级至7.60.0时遇Stream Closed Exception求助
Drools升级后"Stream Closed"异常解决方法
问题根源
你在调用kfs.write()后立即关闭了FileInputStream,但Drools 7.60.0版本的KieBuilder.buildAll()会延迟读取资源流,此时流已关闭,导致IO异常。旧版本7.33.0可能是立即读取并缓存了流内容,所以提前关闭流不会有问题,但新版本的资源加载逻辑发生了变化。
解决方案
方案1:用try-with-resources自动管理流生命周期
利用Java的try-with-resources语法,确保流在buildAll()执行完成后才被关闭:
KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = kieServices.newKieFileSystem(); try (FileInputStream fis = new FileInputStream(fileEntry.getPath())) { kfs.write("src/main/resources/" + fileEntry.getName(), kieServices.getResources().newInputStreamResource(fis)); KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); } catch (IOException e) { e.printStackTrace(); }
方案2:改用FileResource替代InputStreamResource
直接通过文件路径创建FileResource,由Drools内部管理文件读取,无需手动处理流:
KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = kieServices.newKieFileSystem(); kfs.write("src/main/resources/" + fileEntry.getName(), kieServices.getResources().newFileResource(fileEntry.getPath())); KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
内容的提问来源于stack exchange,提问作者NewbieCoder
相关产品推荐
相关产品推荐

