当前位置: 首页 > 知识库问答 >
问题:

Drools KieSession在将对象插入到基于定时器的规则会话时导致内存泄漏

南门飞
2023-03-14

我们想用Drools来做一个延迟工作。因此,我使用定时器(INT:5S)来实现这一点。但是,在我将一个事实对象插入到KieSession之后,KieSession将启动一个独立的“thread-xx”来处理这个延迟作业,但是这个线程将永远不会结束,尽管规则已经在5s之后执行。

是否有一些选项,使那些定时器线程关闭后执行?我知道drl文件中的drools.halt(),但是,它将停止整个会话,而不是这个kiesession中的每个线程。

下面是我的代码:

1.主体班

        KieServices ks = KieServices.Factory.get();
        final KieContainer kContainer = ks.getKieClasspathContainer();
        final KieSessionConfiguration ksconf = ks.newKieSessionConfiguration();
        ksconf.setOption(TimedRuleExectionOption.YES);
        final KieSession kSession = kContainer.newKieSession("ksession-rules", ksconf);

        for (int i = 0; i < 100000; i++) {
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    Message message = new Message();
                    message.setStatus(Message.HELLO);
                    kSession.insert(message);
                    kSession.fireUntilHalt();
                }
            });

            t1.start();
        }
    dialect "mvel"
    rule "Hello World"
    timer(int:10s)
       when
          m : Message(m.status == Message.HELLO)
       then
          System.out.println( "no hello"+m.message );
    end

共有1个答案

司空胤
2023-03-14

我认为您不应该使用Drools来调度大量的TimerTasks。您可以将计时器设置为全局,并根据需要调用它的schedule方法。

很明显,简单的timer属性无法处理使用java.util.timer和TimerTask API可能出现的各种场景。它的主要目的是覆盖简单的场景,只要有一个条件存在,就可以重复执行一些东西。此外,定时器属性存在,所以Drools marketing可以声称“您可以在Drools中完成所有操作,不需要了解(太多)Java”。呸。

 类似资料:
  • 问题内容: 我认为我的Android动态壁纸存在内存泄漏。每当我旋转屏幕时,收集的内存垃圾量就会增加50kb,并且不会减少。我认为这可能是由预定的将来引起的,因此我将提出一个方案以查看是否是这种情况。 假设您有一个包含以下成员的类(我们称其为Foo)。 现在您设定了预定的未来 Future拥有对可运行对象的引用,而Runnable拥有对父Foo对象的引用。我不确定是否是这种情况,但是这个事实是否意

  • 我有一些和等,但是我没有设置。你觉得会是那样吗? 你有什么想法或建议吗? PS:该应用程序在Ubuntu机器上运行 多谢.

  • 如果我有一个垃圾收集器来跟踪分配的每个对象,并在它们不再有对它们的可用引用时立即释放它们,你还会有内存泄漏吗? 考虑到内存泄漏是指没有任何引用的分配,这不是不可能的吗?还是我遗漏了什么? 编辑:所以我认为内存泄漏是您在代码中不再引用的分配。您仍然可以引用的大量累积分配不是我在这里考虑的泄漏。 我也只是在谈论普通的G.C.,已经有一段时间了,但我知道像循环引用这样的案例不会把他们绊倒。我不需要任何语

  • 我想首先说,这是我第一次必须处理性能,因为这是我第一次开发一个android应用程序。 该应用程序是一个源代码编辑器,在这里你可以打开文件,修改它们,并将它们保存回来。该应用程序由4个部分组成: 导航器视图:包含打开文件的ListView和打开文件夹的TreeView。 代码视图容器:它保存包含实际代码的视图。 代码容器:这是一个小视图,包含一个文本视图和一个自定义EditText(由我扩展Edi

  • 我正在玩rxjava,发现如果在活动被销毁之前没有完成订阅,则存在内存泄漏的风险,因为“可观察对象保留对上下文的引用”。如果订阅没有取消订阅,则此类情况的演示之一如下所示。已销毁(来源:https://github.com/dlew/android-subscription-leaks/blob/master/app/src/main/java/net/danlew/rxsubscriptions

  • 问题内容: 我正在尝试在我的Express应用程序中使用redis进行会话。 我执行以下操作: 稍后,在我的应用程序中,如果执行以下操作: 我得到: 无法读取未定义的属性“ someProperty” 这表明req.session是未定义的 (我可以从config部分的console.log条目中看到) 我肯定有redis运行,并且可以看到我的应用最初连接到它(使用redis-cli监视器) 问题