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

你如何在口水中激活规则流组

斜淳
2023-03-14
if (a == x) fireRuleflowOne
if (a == y) fireRuleFlowTwo
StatefulKnowledgeSession session = knowledgeBase.newStatefulKnowledgeSession();
session.insert(facts);
session.fireAllRules();

共有1个答案

范甫
2023-03-14

虽然是一个老的线程,有人可能会碰到这个问题,所以这里有一个例子,请注意,因为它是Spring Boot项目的一部分,drools是自动连线的!

注:@Danidemi当然是对的。

package com.sample.services;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.drools.core.command.impl.GenericCommand;
import org.drools.core.command.impl.KnowledgeCommandContext;
import org.drools.core.common.InternalAgenda;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.ObjectFilter;
import org.kie.api.runtime.rule.FactHandle;
import org.kie.internal.command.Context;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.sample.controllers.CollectResponse;
import com.sample.entities.BusPass;
import com.sample.entities.SalesDroolsProcessParams;
import com.sample.entities.VFactDbDaily;
import com.sample.repositories.VFactDailySalesRepository;

@Service
public class SalesService {
    private static Logger log = LoggerFactory.getLogger(SalesService.class);

    @Autowired
    private KieContainer kieContainer;

    @Autowired
    VFactDailySalesRepository salesRepository;

    public SalesService() {
    }

    public CollectResponse getCollected() {
        Iterable<VFactDbDaily> salesList = salesRepository.findAll();
        ArrayList<Object> collected = new ArrayList<>();

        SalesDroolsProcessParams params = new SalesDroolsProcessParams("yearly");

        KieSession kSession = kieContainer.newKieSession("testKS");

        kSession.setGlobal("log", LoggerFactory.getLogger("com.sample.rules.test"));
        kSession.setGlobal("collected", collected);
        kSession.insert(params);

        ActivateRuleFlowCommand stepOneCmd = new ActivateRuleFlowCommand("step1");

        for (VFactDbDaily fact : salesList) {
            // add the fact to working memory
            kSession.insert(fact);

            // fire all rules
            kSession.fireAllRules();

            kSession.execute(stepOneCmd);
        }

        ActivateRuleFlowCommand stepTwoCmd = new ActivateRuleFlowCommand("step2");

        for (VFactDbDaily fact : salesList) {
            // add the fact to working memory
            kSession.insert(fact);

            // fire all rules
            kSession.fireAllRules();

            // execute ruleflow
            kSession.execute(stepTwoCmd);
        }

        kSession.dispose();

        return new CollectResponse();
    }


    // ruleflow-group implementation
    public class ActivateRuleFlowCommand implements GenericCommand<Object> {
        private static final long serialVersionUID = 1L;

        private String ruleFlowGroupName;

        public ActivateRuleFlowCommand(String ruleFlowGroupName) {
            this.ruleFlowGroupName = ruleFlowGroupName;
        }

        public Void execute(Context context) {
            KieSession ksession = ((KnowledgeCommandContext) context).getKieSession();
            ((InternalAgenda) ksession.getAgenda()).activateRuleFlowGroup(ruleFlowGroupName);
            return null;
        }

    }
}

HTH

 类似资料:
  • 我不太会流口水和咕噜。 我有一个关于规则流的基本问题。 我在guvnor插件上使用引导编辑器创建了3条规则。现在我想根据第一条规则的结果调用第二条或第三条规则。 e、 g.如果患者年龄小于18岁,则进行第二条规则的小检查,否则请调用第三条规则由高级医生进行检查。 那么,这可以通过使用规则流来实现吗?如果是,如何?是否有任何示例链接和文档来演示它?非常感谢您的帮助。 谢啦

  • 我有一个drl文件,它在两个规则流组中包含规则:“第一个规则流组”和“第二个规则流组”。这些组的激活取决于“规则A”和“规则B”。是否有任何方法可以停用规则B,以便在规则A条件匹配时触发,从而仅将焦点设置为“第一个规则流组”?

  • 我有两个事实,分别命名为OptionalCover和OptionalPremiumComponent,其中有OptionalPremiumComponent的参考。这就是我在工作记忆中插入的内容。 我在drools中创建了以下规则 问题是,插入父对象时没有触发上述规则。我还需要做些什么来实现这种行为吗?是否支持? 谢谢你。

  • 我实现了如下所述的java自定义规则,请在此处输入链接描述。在服务器端的“规则”页面上可以看到规则,但在分析过程中不会将其中的任何规则应用于代码。我正在使用sonar 5.1.1,并将sonar java插件更新为v3。2.我不知道怎么了。在使用sonar runner进行调试期间,我注意到我的CheckRegister已加载,但忽略了来自它的检查。

  • Drools文档提到,规则可以使用诸如生效日期和过期日期之类的属性来指定绝对规则有效期。 例如 Drools还支持周期性重复的规则,间隔为,cron为,但这意味着规则是在这样的点触发的。 我很感兴趣,如果有任何选项如何指定定期可用(不解雇)的规则与时间限制。例如,让我们想象一些公司的营业时间-操作只能在正式工作期间执行,但不能在下班后执行。 我想要这样的东西,但这不是Drools的有效规则 是否可

  • 我刚开始流口水,遇到了一个问题。 我简化了规则以显示问题: 基本上,我想计算特定路段上发生的事件(路段是道路的一部分)。当同一链接上发生3个事件时,我希望触发规则。 上面的规则几乎起作用了,但是当它发射时,它发射了3次,每个事件发射一次。我只希望它发射一次。 我错过了什么? 非常感谢。