Drools worker Thread 花费太多时间,抛出 sun.nio.fs.UnixException

如何解决Drools worker Thread 花费太多时间,抛出 sun.nio.fs.UnixException

我有一个应用程序,其中我使用 drools 工作台(KIE)在 Java 中进行规则验证。 现在,我遇到了这个在触发规则时创建的流口水工作线程的奇怪问题。在我的应用程序中,规则执行的平均响应时间小于 500 毫秒。最近,我可以观察到有时返回规则响应需要更多时间。这种情况很少发生,但正在发生。最近,预期响应需要大约 29 分钟。这最终使我的应用程序崩溃。我需要处理这个“特殊情况”。

使用 Dynatrace 应用程序,我检查了代码级别发生的过程。我可以看到

 Asynchronous invocation
                 |
                 |___ JRE | java.util.concurrent.FutureTask

只是重复并在每次执行中花费太多时间。我附上了相同的截图。

enter image description here

。而且我也可以观察到很少的错误

异常:sun.nio.fs.UnixException

消息:没有那个文件或目录

堆栈跟踪: sun.nio.fs.UnixNativedispatcher.access0(UnixNativedispatcher.java) sun.nio.fs.UnixNativedispatcher.access(UnixNativedispatcher.java:449) sun.nio.fs.UnixFileSystemProvider.checkAccess(UnixFileSystemProvider.java:306) java.nio.file.Files.exists(Files.java:2385) org.jboss.modules.PathResourceLoader.lambda$ org.jboss.modules.PathResourceLoader$$Lambda$.run org.jboss.modules.PathResourceLoader.doPrivilegedIfNeeded(PathResourceLoader.java:227) org.jboss.modules.PathResourceLoader.getResource(PathResourceLoader.java:139) org.jboss.modules.ModuleClassLoader.loadResourceLocal(ModuleClassLoader.java:349) org.jboss.modules.ModuleClassLoader$1.loadResourceLocal(ModuleClassLoader.java:96) org.jboss.modules.Module.getResourceAsstream(Module.java:784) org.jboss.modules.ModuleClassLoader.findResourceAsstream(ModuleClassLoader.java:556) org.jboss.modules.ConcurrentClassLoader.getResourceAsstream(ConcurrentClassLoader.java:370) java.lang.class.getResourceAsstream(Class.java:2223) org.drools.core.util.asm.ClassFieldInspector.(ClassFieldInspector.java:80) org.drools.core.util.asm.ClassFieldInspector.(ClassFieldInspector.java:72) org.drools.core.base.ClassFieldAccessorFactory.getClassFieldReader(ClassFieldAccessorFactory.java:107) org.drools.core.base.ClassFieldAccessorCache$CacheEntry.getReadAccessor(ClassFieldAccessorCache.java:166) org.drools.core.base.ClassFieldAccessorCache.getReadAcessor(ClassFieldAccessorCache.java:99) org.drools.core.base.ClassFieldAccessorStore.wire(ClassFieldAccessorStore.java:460) org.drools.core.base.ClassFieldAccessorStore.getReader(ClassFieldAccessorStore.java:126) org.drools.core.base.ClassFieldAccessorStore.getReader(ClassFieldAccessorStore.java:103) org.drools.compiler.rule.builder.PatternBuilder.getFieldReadAccessor(PatternBuilder.java:1677) org.drools.compiler.rule.builder.PatternBuilder.addConstraintToPattern(PatternBuilder.java:856) org.drools.compiler.rule.builder.PatternBuilder.buildrelationalExpression(PatternBuilder.java:811) org.drools.compiler.rule.builder.PatternBuilder.buildExpression(PatternBuilder.java:735) org.drools.compiler.rule.builder.PatternBuilder.buildCcdDescr(PatternBuilder.java:719) org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:670) org.drools.compiler.rule.builder.PatternBuilder.processConstraintsAndBinds(PatternBuilder.java:524) org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:329) org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:138) org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:66) org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:89) org.drools.compiler.builder.impl.KNowledgeBuilderImpl.addRule(KNowledgeBuilderImpl.java:1652) org.drools.compiler.builder.impl.KNowledgeBuilderImpl.compileRules(KNowledgeBuilderImpl.java:968) org.drools.compiler.builder.impl.KNowledgeBuilderImpl.compileAllRules(KNowledgeBuilderImpl.java:844) org.drools.compiler.builder.impl.CompositeKNowledgeBuilderImpl.buildrules(CompositeKNowledgeBuilderImpl.java:279) org.drools.compiler.builder.impl.CompositeKNowledgeBuilderImpl.buildPackages(CompositeKNowledgeBuilderImpl.java:103) org.drools.compiler.builder.impl.CompositeKNowledgeBuilderImpl.build(CompositeKNowledgeBuilderImpl.java:91)

我认为这个错误可能是同样的原因。

在理想情况下,我没有看到

异步调用---->JRE | java.util.concurrent.FutureTask

当我通过 Dynatrace 检查时也没有错误。我也附上了截图。

enter image description here

我触发规则的java代码如下:

final KieContainer kContainerTubes = loadRulesBean.getKieContainerMap().get(ConfiguratorConstants.TUBES.toupperCase());
final StatelessKieSession kSessionProduct = kContainerTubes.newStatelessKieSession();
kSessionProduct .execute(products);

这里担心的是这个问题的发生。非常罕见!!!。

解决方法

堆栈跟踪证明您的 KnowledgeBase 是在运行时重新构建的,即您的规则定义在运行时被解析并转换为 Java 类。理想情况下,编译的规则已经与您的应用程序一起部署或由您的应用程序加载(例如,从 Maven 存储库中)。

上述异常是在加载资源编译规则时调用了Files.exists(Path)引起的。此方法在检查文件是否存在时在内部捕获异常。在 Java 8 中,当文件存在时,这比 File.exists() 花费的时间大约长十倍(有关详细信息,请参阅 here)。但我们在这里谈论的是毫秒而不是分钟。过度使用 Files.exists(Path) 的代码可能会受到负面影响,但在您的情况下,实际读取资源及其编译肯定需要更长的时间。只要您没有在日志中看到任何有关缺少资源的错误,此错误就不应该有任何实际问题。在搜索资源时,模块/类加载代码可能会在多个位置搜索该文件,直到在其中一个位置找到该文件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?