- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Drools 5.6.0,我准备升级到 6.0,所以这个问题与两个版本都相关。
我在 google 上搜索了很多有关在多线程 环境中使用 Drools 的信息,但我仍然不确定如何继续。在以下场景中,我试图找到一种方法来使用使用大量静态事实预初始化的单例 StatefulKnowledgeSession 作为 Web 服务的业务逻辑。
我想知道下面进一步描述的场景是否有最佳实践。
我在服务器启动时创建一个 StatefulKnowlegdeSession 单例
在初始化 时,我将超过 100.000 个事实插入到 StatefulKnowlegdeSession 中。我称这些为“静态事实”,因为它们永远不会被规则修改。静态事实更像是一组大查找表。
现在规则引擎被放置到一个网络服务 (Tomcat) 中。 Web 服务接收一个 Request 对象,该对象将被插入到 KnowledgeSession 中。在 fireAllRules() 之后,我希望 KnowledgeSession 计算一个输出对象,该对象将作为 Web 服务响应返回。
Response 的计算使用了静态事实。这些规则创建了许多临时对象,这些对象使用insertLogical() 插入到工作内存中。这确保一旦我在 Web 服务调用结束时收回原始 Request 对象,所有垃圾都会从工作内存中移除。
现在的问题是我将如何在多线程服务器中实现它?
我只想使用一个 StatefulKnowledgeSession 实例(单例),因为静态事实很大,可能会成为内存问题。
我不能使用在每次 Web 服务调用开始时新创建的 StatelessKnowledgeSessions,因为插入所有静态事实会花费太长时间。
我知道 StatefulKnowlegdeSession 不是线程安全的。此外,分区选项不再受支持。
但是,不同的线程可以使用不同的 WorkingMemoryEntryPoints/EntryPoints。我可以使用入口点的池,每个 Web 服务调用都将使用池中的一个实例来插入 Web 服务请求。
这也意味着我需要增加我的规则 (?) 每个规则都使用一个特定的入口点,或者至少是第一条规则,匹配网络服务请求对象:
rule “entry rule for WORKER-1” // rule to be duplicated for entry points WORKER-2, WORKER-3,...
when
$req : Request () from entry-point “WORKER-1”
$stat : StaticFact( attr = $req.getAttr() )
then
insertLogical( new SomeTemporaryStuff ( $req ) );
end
rule “subsequent rule”
when
$tmp : SomeTemporaryStuff()
then
...go on with the calculation and create a Response at some point...
end
后续规则会在工作内存中创建临时对象,在这一点上,如果我用数十个并发请求轰炸引擎,我真的很害怕弄乱一些东西。
最佳答案
我不会使用多个入口点。将请求排队到运行 session 的线程。如果您想使用多核,请运行多个服务或服务线程。
对于您的 10 万个事实,请仔细检查其字段的表示方式。 String.intern() 可能会提供可观的节省。可以共享其他对象——因为它都是静态的。通常,在这种情况下,元素构造期间的一些额外开销在以后是有益的,例如,更少的 GC 开销。
(否则这是一个非常好的总结,几乎是运行此场景的“方法”。+1
关于java - Drools 单例 StatefulKnowledgeSession 作为 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22509997/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!