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

Drools-多个请求的相同KieSession

昌和悦
2023-03-14

我在项目中使用drools 6.3.0。我有大约3000条规则,分为两类。比如,类别1有1500条规则,类别2有1500条规则。有2万份订单具有不同的数据。每个订单都有一组不同的属性。现在,为每个请求创建kiesession需要时间,而且速度非常慢。因此,计划使用相同的kiesession执行所有订单,订单将使用多线程处理。

以下是我目前的做法。

 KieBase kieBase = null;
 KieServices kieServices = KieServices.Factory.get();
 KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(new KieModule() {
            @Override
            public ReleaseId getReleaseId() {
                return kieRepository.getDefaultReleaseId();
            }
        });

 KieFileSystem kfs = kieServices.newKieFileSystem();

 kfs.write(******);  // Load 3k rules in a for loop
 KieBuilder kb = kieServices.newKieBuilder(kfs);
            kb.buildAll();
 KieContainer kContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
 kieBase = kContainer.getKieBase();

 kContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
            kieBase = kContainer.getKieBase();
 KieSession kieSession = kieBase.newKieSession();

这就是我创建kiesession的方式,我想将此kiesession用于所有订单执行。

我想使用线程池并行执行订单。

这就是

//这里的条目基于类别和一些id。每个规则都有id和类别。对于每个id和类别,都有一组需要评估的规则。

流程就像,

1) 从DB获取20k个订单2)对于每个订单,获取要执行的id 3)对于每个id,设置入口点格式,如<代码>入口=id \u类别

4) 插入订单属性数据和fireRules。

final EntryPoint entryPoint = ksession.getEntryPoint(entry);
        if (entryPoint != null) {
            entryPoint.insert(data);
            ksession.fireAllRules();
        } else {
            log.warn("No rules to be executed");
        }

现在,由于我必须并行执行命令,

每个订单将并行调用以下代码,

entryPoint.insert(data);
ksession.fireAllRules();

由于每个订单都有不同的属性,并向入口点插入不同的数据,因此会导致问题,无法获得预期的结果。

有没有办法实现这一点?

谢谢

共有2个答案

湛鸿
2023-03-14

也许你应该使用原型会话。在K模块中。xml文件添加:

<ksession name="YourSessionName" type="stateful" default="false" clockType="realtime" scope="prototype"/>
乜清野
2023-03-14

我不是一个超级专家,但我正在研究类似的问题,我认为答案是要么将这些调用放入同步块中。。。它实际上根本不是并行执行,或者使用无状态KieSession,它将创建一个常规的KieSession,它将使用自己的工作内存在execute调用的本地,因此它将只包含您传入的数据对象。执行(…)

令人惊讶的是,与重用单个常规会话并在触发规则之间清除其中的对象相比,使用无状态会话似乎并不花费太多时间。

 类似资料:
  • 这是在收到以db为单位的帖子列表后发送带有每个帖子链接数据的POST请求的代码。 在使用每个链接请求帖子后,从回复中提取playerCount并将其更新到每个帖子。 我在这段代码中使用Resttemplate,但有一个问题需要花费太长时间。 所以我想把这个代码改为一次发送一个请求,并在所有请求完成后更新每个帖子。 我怎样才能把这个代码转换成我想要的? 我将使用此代码作为计划任务。

  • 我对在PHP中一次提交多个请求持怀疑态度。我有一个php函数,比如insertOrder()来将详细信息插入数据库表并向用户发送通知。详细信息将从另一个来源自动发布到此功能。这些是insertOrder()中的步骤 启动Mysql事务 从OrderID=123的数据库表中选择订单计数(来自post数据) 如果COUNT=0,则插入数据库表并发送通知 如果不是0,则更新顺序 提交 问题在于,有时系统

  • 我们正在尝试使用Drool作为我们的规则引擎服务。我们到目前为止所做的如下 部署的工作台7.2.final 已部署的KIE服务器7.2.0。final 配置了一些数据对象、规则,将更改部署到KIE服务器,我们可以使用rest API执行规则 无状态会话满足了我们的大部分需求(给出一组数据,执行规则并返回数据,仅此而已)。但是使用无状态时,我们必须牺牲Drools有状态会话提供的许多重要特性。 我们

  • 问题内容: 我的问题是给定的代码: 我访问: 我应该期望[‘a’,’bbb’]的输出,除了Flask似乎只接受第一个参数而忽略其余参数。 这是Flask的限制吗?还是设计使然? 问题答案: 你可以使用与Django类似的,但由于某些原因,Flask文档中未提及: 结果是: 使用如果参数是查询字符串(如题),如果值来自具有相同名称的多个表单输入。 结合了两者,但通常应避免使用更具体的集合。

  • 问题内容: 我正在尝试通过COM端口发送AT命令,但只重新发送了相同的命令。 日志: 16:19:21.910 [main]调试SerialConnections.M234Serial-创建实例。 16:19:21.974 [main]调试SerialConnections.M234Serial-发送请求:AT ^ SCFG? 16:19:23.976 [EventThread COM55]调试S

  • 是否可以在webclient上将多个请求链接在一起?例如,我希望在进行交易时能够更新买方和卖方的余额。现在它只更新买家余额: 是否有一种方法可以将两个put方法调用在一起,以便更新两个余额? 更新:此方法适用于将单声道值作为uri变量调用。