jbpm 进程未使用 ruleFlowGroup 触发流口水规则

Posted

技术标签:

【中文标题】jbpm 进程未使用 ruleFlowGroup 触发流口水规则【英文标题】:jbpm process not firing drools rule with ruleFlowGroup 【发布时间】:2019-06-14 21:30:04 【问题描述】:

我无法从 jbpm 业务规则任务中触发规则。似乎该进程未找到规则文件。试着解释一下。

首先,我扩展了一个 Drools 示例,添加了一个业务规则任务,我设置了一个 ruleFlowGroup:

这是业务规则任务 Rule1 的属性:

processTest.java 简单设置消息并启动进程:

package com.sample;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

import com.sample.DroolsTest.Message;

/**
 * This is a sample file to launch a process.
 */
public class ProcessTest 

    public static final void main(String[] args) 
        try 
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession = kContainer.newKieSession("ksession-process");

            // go !
            Message message = new Message();
            message.setMessage("Hello Giorgio");
            message.setStatus(Message.HELLO);
            kSession.insert(message);

            // start a new process instance
            kSession.startProcess("com.sample.bpmn.hello");
         catch (Throwable t) 
            t.printStackTrace();
        
    


然后我运行并正确触发脚本任务(“Hello world”)但在 RuleGroup1.drl 中找不到规则:

//created on: 21-gen-2019
package com.sample

//list any import classes here.
import com.sample.DroolsTest.Message;


//declare any global variables here


rule "First Giorgio rule"
    ruleflow-group "Group1"

    when
        m : Message( status == Message.HELLO, myMessage : message )
    then
        System.out.println( "rule0 Group1" );

end

rule "Your First Rule"
    ruleflow-group "Group1"
    when
        //conditions
    then
        System.out.println( "rule1 Group1" );

end

rule "Your Second Rule"
    ruleflow-group "Group1"
    //include attributes such as "salience" here...
    when
        //conditions
    then
        System.out.println( "rule2 Group1" );

end

关注项目文件夹:

感谢您的帮助。

【问题讨论】:

要触发规则执行,您必须在代码中添加“ksession.fireAllRules()”。尝试添加它。 正确,我忘记了 kSession.fireAllRules() 但是......这还不够。其他的想法是修改 kmodule.xml 以添加存储所有进程和规则文件的新包。现在可以了。 【参考方案1】:

我决定添加一个kSession.fireAllRules() 并将进程和规则文件存储在同一个包中。

    修改kmodule.xml添加ksession名称“proces-s-rules”:

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
        <kbase name="rules" packages="rules">
            <ksession name="ksession-rules"/>
        </kbase>
        <kbase name="dtables" packages="dtables">
            <ksession name="ksession-dtables"/>
        </kbase>
        <kbase name="process" packages="process">
            <ksession name="ksession-process"/>
        </kbase>
        <kbase name="proces-s-rules" packages="proces-s-rules">
            <ksession name="ksession-proces-s-rules"/>
        </kbase>
    </kmodule>
    

    创建一个与 ksession 名称链接的新包。就我而言,流程规则:

【讨论】:

【参考方案2】:

确保规则文件和进程文件在同一个文件夹中。 最重要的是,确保规则文件中声明的包与包含它的目录名称以及 kmodule.xml 中的包声明一致。如果它们不同步,您最终将不会触发您的规则。 检查此示例项目。 Using Drools Rules with jBPM

【讨论】:

以上是关于jbpm 进程未使用 ruleFlowGroup 触发流口水规则的主要内容,如果未能解决你的问题,请参考以下文章

activiti和jbpm工作流引擎哪个比较好

測试jbpm6.2使用的基础类

JBPM

JBPM4 经常使用表结构及其说明

jbpm工作流

JBPM