同 KieHelper 不同一个StatlelessKiesession无状态

线程中创建一个StatlelessKiesession

请看如下代码:

package com.droolstest.dynamicRuleThread;

import com.droolstest.Person;
import com.droolstest.School;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.StatelessKieSession;
import org.kie.internal.command.CommandFactory;
import org.kie.internal.conf.MultithreadEvaluationOption;
import org.kie.internal.utils.KieHelper;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class DrlStatlelesss {
    private static int thread_num = 200;//线程数,设置同时并发线程数
    private static int client_num = 10;//访问次数
    /**
     * 测试 并发下 使用
     * 不同一个StatlelessKiesession无状态 线程中创建一个StatlelessKiesession
     * 同 KieHelper
     */
    /**
     * 结论1:rule 名是不能重复,这一点,符合kmodule.xml 规范要求 如果创建多次session则判断多次rule名
     * 结论2:rule与rule之间的Fact会相互作用 在不设置 MultithreadEvaluationOption.YES 规则执行
     *       myRuleFile1与myRuleFile2 随机执行 但只要有其中一个执行了 则另一个不执行 原因Fact对象已经发现改变
     * 结论3:helper1.build(MultithreadEvaluationOption.YES).newKieSession(); 并无实际效果 与结论2效果一样
     * 结论4:执行规则得到结果 受salience 影响, 可能是王王 也可能是李四
     * @param args
     */
    public static void main(String[] args) {
        //规则文件
        String myRuleFile1 = "package rules " +   "import  com.droolstest.Person;" +    "import  com.droolstest.School;" +
                "rule \"myRule1\" " +
                "   when " +
                "        $p:Person(name==\"张三\")" +
                "        $s:School(name==\"北大\")" +
                "   then " +
                "      $p.setName(\"李四\");" +
                "      $s.setName(\"清华\");" +
                "      update($p);" +
                "      update($s);" +
                "end                     " +
                "rule \"myRule2\" " +
                "   when " +
                "        $p:Person(name==\"李四\")" +
                "        $s:School(name==\"清华\")" +
                "   then " +
                " System.out.println(\"规则myRuleFile1被调用\");" +
                "end";
        String myRuleFile2 = "package rules " +  "import  com.droolstest.Person;" +     "import  com.droolstest.School;" +
                "rule \"myRule3\" " +
                "   when " +
                "        $p:Person(name==\"张三\")" +
                "        $s:School(name==\"北大\")" +
                "   then " +
                "                   $p.setName(\"王王\");" +
                "                   $s.setName(\"张大\");" +
                "   update($p);" +
                "   update($s);" +
                "end                     " +
                "rule \"myRule4\" " +
                "   when " +
                "        $p:Person(name==\"王王\")" +
                "        $s:School(name==\"张大\")" +
                "   then " +
                " System.out.println(\"规则myRuleFile2调用\");" +
                "end";
        long start = System.currentTimeMillis();
        KieHelper helper1 = new KieHelper();
        long end = System.currentTimeMillis();
        System.out.println("输出创建KieHelper用的毫秒是="+(end - start));

        long startAddrule = System.currentTimeMillis();
        //分别将规则myRuleFile2 myRuleFile1 加载到虚拟文件中
        helper1.addContent(myRuleFile1, ResourceType.DRL);
        helper1.addContent(myRuleFile2, ResourceType.DRL);
        long endAddrule = System.currentTimeMillis();
        System.out.println("导入规则所用到的毫秒是="+(endAddrule - startAddrule));

        ExecutorService exec = Executors.newCachedThreadPool();
        final Semaphore semp = new Semaphore(thread_num);
        for (int index = 0; index < client_num; index++) {
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        semp.acquire();
                        long startNewKiesession = System.currentTimeMillis();
                        StatelessKieSession kieSession = helper1.build(MultithreadEvaluationOption.YES).newStatelessKieSession();
                        long endNewKiesession = System.currentTimeMillis();
                        System.out.println("创建无状态StatelessKieSession所用到的毫秒是="+(endNewKiesession - startNewKiesession));
                        long startrule = System.currentTimeMillis();
                        Person person = new Person();
                        person.setName("张三");
                        person.setAge("" + (int) (Math.random() * 100));
                        School school = new School();
                        school.setName("北大");
                        school.setCount("40");
                        List cmds = new ArrayList();
                        cmds.add(CommandFactory.newInsert(person, "p1"));
                        cmds.add(CommandFactory.newInsert(school, "s1"));
                        kieSession.execute(CommandFactory.newBatchExecution(cmds));
                        System.out.println(person.getName());
                        long endrule = System.currentTimeMillis();
                        System.out.println("规则执行所用到的毫秒是="+(endrule - startrule));
                        System.out.println("=============================牛逼的分割线=========================================");
                        semp.release();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            exec.execute(run);
        }
        exec.shutdown();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Drools的KieHelper一个用于创建和管理规则引擎的实用类。通过使用KieHelper,我们可以动态地创建KieSession并添加规则内容。在Drools中,KieSession是与规则引擎进行交互的主要接口。通过将规则内容添加到KieHelper,我们可以将规则动态加载到KieSession中,然后使用该KieSession执行规则引擎的操作。 具体的步骤如下: 1. 首先,我们需要创建一个KieHelper对象,并使用addContent方法将规则内容添加到KieHelper中。规则内容可以采用Drools标准格式,并使用.drl文件类型。 2. 接下来,我们可以通过调用kieHelper.build().newKieSession()方法来构建和创建一个新的KieSession对象。这个新的KieSession将包含之前添加的规则内容。 3. 一旦我们创建了KieSession,我们可以使用它来执行规则引擎的操作。根据规则名称或名称前缀进行过滤执行是其中的一种常见操作。 3.1. 如果我们想要根据规则名称完全匹配的方式执行规则,我们可以使用new RuleNameEqualsAgendaFilter(ruleName)方法来创建一个规则名称过滤器。然后,我们可以使用kieSession.fireAllRules()方法来触发与该过滤器匹配的规则。 3.2. 如果我们想要根据规则名称前缀匹配的方式执行规则,我们可以使用new RuleNameStartsWithAgendaFilter(rulePrefix)方法来创建一个规则名称前缀过滤器。然后,我们可以使用kieSession.fireAllRules()方法来触发与该过滤器匹配的规则。 综上所述,使用Drools的KieHelper类可以方便地动态创建KieSession,并根据规则名称或名称前缀进行过滤执行规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值